ใช้ neural network ทำ linear regression ง่ายๆใน ภาษา Wolfram

พอดีเมื่อวานมีพูดแนะนำเทคนิค neural network ในที่ทำงาน แล้วมีคนถามว่าใช้ทำ linear regression ได้ไหม ผมก็บอกว่าได้เลยทำให้ดูเป็นตัวอย่าง code ที่แชร์นี้ก็เป็นตัวอย่างที่ผมทำเมื่อวานครับ ซึ่งก็เริ่มด้วยการ generate ข้อมูลที่ดูเหมือนเป็นเส้นตรงมา จากนั้นก็สร้าง neural network โดยใช้ linear layer ที่มี input กับ output ค่าเดียว โดย loss function ที่ใช้คือ mean square จากกนั้นก็ใช้คำสั่ง NetTrain ในการหา weight กับ bias ของ linear layer จากนั้นก็ลอง plot เปรียบเทียบผลที่ได้กับคำสั่ง LinearModelFit

คำสั่ง NetTrain มันก็เหมือนกับ NMinimize กับ FindMinimum ที่จะหาจุดต่ำสุดของ Function ที่เราสนใจซึ่งในกรณีนี้ก็คือ mean square

ให้ค่าตัวแปร array, vector หรือ matrix ใน Stan

ไม่น่าเชื่อว่าจะไม่มีเขียนในเอกสารของ Stan

real x[3] = {1, 2, 3};
vector[3] y = [1, 2, 3];
matrix[3, 3] z = [[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]];

สมการชูสามนิ้ว

เห็นน้องๆสร้างสมการคณิตศาสตร์กันเป็นรูปมือกันผมเลยลองเล่นบ้าง เป็นรูปมือชู 3 นิ้ว (พระพุทธ พระธรรม พระสงฆ์ หรือเปล่า ?)

สมการที่ผมหามาได้มีหน้าตาตามนี้ครับ *มีคนถามมาว่าหามายังไง เดี๋ยว​มาอธิบายให้ครับหลักๆก็อาศัย Fourier series และภาพต้นฉบับก็เอามาจากเวบ https://www.123rf.com/stock-photo/three_finger.html?sti=lei4tdvr1lskwqekk0| ครับ

h3Function[
  t_] := {((30359/31 - 1/17 Sin[23/15 - 16 t] - 
        4/43 Sin[55/36 - 12 t] - 6/23 Sin[29/19 - 9 t] - 
        13/36 Sin[36/23 - 8 t] - 20/31 Sin[39/25 - 6 t] - 
        33/43 Sin[31/20 - 5 t] - 3091/309 Sin[36/23 - 2 t] - 
        92/29 Sin[36/23 - t] + 27/40 Sin[69/44 + 3 t] + 
        9/44 Sin[29/18 + 4 t] + 8/19 Sin[68/43 + 7 t] + 
        2/35 Sin[164/35 + 10 t] + 4/21 Sin[59/37 + 11 t] + 
        1/78 Sin[151/101 + 13 t] + 4/47 Sin[70/43 + 14 t] + 
        2/29 Sin[55/34 + 15 t] + 2/19 Sin[53/33 + 17 t] + 
        2/27 Sin[18/11 + 18 t] + 1/25 Sin[43/27 + 19 t] + 
        1/31 Sin[41/25 + 20 t] + 2/23 Sin[73/45 + 21 t] + 
        1/52 Sin[45/26 + 22 t] + 1/24 Sin[115/72 + 23 t] + 
        1/29 Sin[49/29 + 24 t] + 2/39 Sin[57/35 + 25 t] + 
        1/81 Sin[37/22 + 26 t] + 1/27 Sin[28/17 + 27 t] + 
        1/49 Sin[77/46 + 28 t] + 1/36 Sin[18/11 + 29 t] + 
        1/131 Sin[33/19 + 30 t] + 1/36 Sin[118/71 + 31 t] + 
        1/95 Sin[37/22 + 32 t] + 1/58 Sin[18/11 + 33 t] + 
        1/148 Sin[85/48 + 34 t] + 1/51 Sin[29/18 + 35 t] + 
        1/223 Sin[50/27 + 36 t] + 1/73 Sin[44/27 + 37 t] + 
        1/183 Sin[66/37 + 38 t] + 1/68 Sin[49/30 + 39 t] + 
        1/373 Sin[44/23 + 40 t] + 1/82 Sin[50/31 + 41 t] + 
        1/222 Sin[19/11 + 42 t]) UnitStep[
       15 \[Pi] - t] UnitStep[-11 \[Pi] + t] + (82913/46 - 
        6/31 Sin[12/25 - 34 t] - 2/17 Sin[45/31 - 28 t] - 
        2/7 Sin[21/16 - 26 t] - 15/22 Sin[26/35 - 17 t] - 
        97/39 Sin[69/44 - 9 t] - 116/31 Sin[19/39 - 8 t] - 
        281/108 Sin[57/41 - 7 t] - 138/31 Sin[20/53 - 6 t] - 
        864/23 Sin[31/21 - 2 t] + 13015/73 Sin[39/17 + t] + 
        2183/38 Sin[231/68 + 3 t] + 473/59 Sin[118/47 + 4 t] + 
        253/35 Sin[53/15 + 5 t] + 88/63 Sin[142/41 + 10 t] + 
        39/77 Sin[103/38 + 11 t] + 61/33 Sin[107/33 + 12 t] + 
        32/23 Sin[17/9 + 13 t] + 2/23 Sin[54/25 + 14 t] + 
        5/16 Sin[451/450 + 15 t] + 5/11 Sin[6/53 + 16 t] + 
        9/29 Sin[37/9 + 18 t] + 3/16 Sin[173/38 + 19 t] + 
        3/7 Sin[198/61 + 20 t] + 8/21 Sin[37/15 + 21 t] + 
        7/26 Sin[59/33 + 22 t] + 7/31 Sin[57/65 + 23 t] + 
        1/6 Sin[14/29 + 24 t] + 9/34 Sin[5/16 + 25 t] + 
        3/32 Sin[445/99 + 27 t] + 13/66 Sin[131/34 + 29 t] + 
        7/29 Sin[103/40 + 30 t] + 3/31 Sin[100/99 + 31 t] + 
        2/41 Sin[37/16 + 32 t] + 3/20 Sin[13/28 + 33 t] + 
        9/50 Sin[23/5 + 35 t] + 2/23 Sin[105/23 + 36 t] + 
        3/28 Sin[310/67 + 37 t] + 2/15 Sin[143/45 + 38 t] + 
        4/33 Sin[48/29 + 39 t] + 1/20 Sin[34/57 + 40 t] + 
        1/32 Sin[125/43 + 41 t] + 3/37 Sin[49/44 + 42 t]) UnitStep[
       11 \[Pi] - t] UnitStep[-7 \[Pi] + t] + (28702/23 - 
        4/39 Sin[33/23 - 42 t] - 53/37 Sin[51/76 - 40 t] - 
        4/21 Sin[26/43 - 38 t] - 77/37 Sin[7/25 - 33 t] - 
        5/41 Sin[77/58 - 32 t] - 106/77 Sin[20/19 - 29 t] - 
        71/19 Sin[23/24 - 27 t] - 97/42 Sin[3/28 - 26 t] - 
        127/17 Sin[11/26 - 20 t] - 42/19 Sin[10/71 - 19 t] - 
        142/31 Sin[49/45 - 17 t] - 465/29 Sin[23/20 - 14 t] - 
        418/37 Sin[1/14 - 13 t] - 51/25 Sin[37/29 - 12 t] - 
        365/53 Sin[34/27 - 9 t] - 6795/137 Sin[19/36 - 7 t] - 
        241/16 Sin[11/28 - 6 t] - 5584/29 Sin[19/39 - 2 t] + 
        21149/52 Sin[49/11 + t] + 1701/17 Sin[29/35 + 3 t] + 
        862/35 Sin[26/9 + 4 t] + 667/28 Sin[92/25 + 5 t] + 
        577/78 Sin[79/44 + 8 t] + 193/18 Sin[1/27 + 10 t] + 
        178/27 Sin[71/19 + 11 t] + 359/57 Sin[34/33 + 15 t] + 
        135/38 Sin[91/24 + 16 t] + 91/44 Sin[111/31 + 18 t] + 
        160/29 Sin[118/27 + 21 t] + 84/29 Sin[9/40 + 22 t] + 
        52/19 Sin[114/37 + 23 t] + 113/46 Sin[161/36 + 24 t] + 
        10/33 Sin[2977/744 + 25 t] + 27/16 Sin[37/11 + 28 t] + 
        39/20 Sin[77/31 + 30 t] + 7/9 Sin[51/13 + 31 t] + 
        47/34 Sin[145/31 + 34 t] + 14/29 Sin[86/39 + 35 t] + 
        29/28 Sin[532/145 + 36 t] + 37/28 Sin[80/43 + 37 t] + 
        3/16 Sin[10/13 + 39 t] + 5/26 Sin[35/17 + 41 t]) UnitStep[
       7 \[Pi] - t] UnitStep[-3 \[Pi] + t] + (40485/29 - 
        255/23 Sin[2/21 - 23 t] - 1023/40 Sin[25/16 - 16 t] - 
        148/11 Sin[47/31 - 15 t] - 1781/43 Sin[27/34 - 10 t] - 
        9508/15 Sin[48/37 - t] + 3391/22 Sin[17/25 + 2 t] + 
        2003/35 Sin[22/19 + 3 t] + 3390/61 Sin[89/21 + 4 t] + 
        3313/25 Sin[82/27 + 5 t] + 671/8 Sin[70/41 + 6 t] + 
        574/13 Sin[58/35 + 7 t] + 1293/16 Sin[78/67 + 8 t] + 
        1462/37 Sin[17/21 + 9 t] + 727/32 Sin[96/23 + 11 t] + 
        1747/37 Sin[367/100 + 12 t] + 68/3 Sin[45/91 + 13 t] + 
        1063/31 Sin[41/35 + 14 t] + 54/11 Sin[55/16 + 17 t] + 
        165/8 Sin[224/225 + 18 t] + 135/38 Sin[1/18 + 19 t] + 
        583/63 Sin[113/24 + 20 t] + 205/23 Sin[220/73 + 21 t] + 
        461/33 Sin[7/18 + 22 t] + 53/5 Sin[99/23 + 24 t] + 
        102/25 Sin[82/47 + 25 t] + 63/11 Sin[31/16 + 26 t] + 
        224/27 Sin[117/25 + 27 t] + 121/16 Sin[58/33 + 28 t] + 
        49/9 Sin[21/17 + 29 t] + 107/50 Sin[3/7 + 30 t] + 
        38/9 Sin[139/34 + 31 t] + 55/23 Sin[46/19 + 32 t] + 
        136/39 Sin[44/29 + 33 t] + 13/7 Sin[14/39 + 34 t] + 
        11/3 Sin[26/15 + 35 t] + 285/89 Sin[118/29 + 36 t] + 
        28/19 Sin[13/17 + 37 t] + 53/35 Sin[89/34 + 38 t] + 
        18/19 Sin[114/47 + 39 t] + 39/44 Sin[9/13 + 40 t] + 
        16/29 Sin[185/52 + 41 t] + 69/26 Sin[56/33 + 42 t]) UnitStep[
       3 \[Pi] - t] UnitStep[\[Pi] + t]) UnitStep[Sqrt[
    Sign[Sin[t/
      2]]]], ((-(248369/91) - 1/102 Sin[127/85 - 28 t] - 
        1/31 Sin[59/38 - 18 t] - 1/110 Sin[71/47 - 12 t] - 
        11/28 Sin[57/37 - 5 t] - 3/5 Sin[69/44 - 4 t] - 
        903/139 Sin[36/23 - 2 t] - 773/119 Sin[47/30 - t] + 
        55/23 Sin[41/26 + 3 t] + 9/64 Sin[57/35 + 6 t] + 
        13/23 Sin[65/41 + 7 t] + 1/21 Sin[71/42 + 8 t] + 
        17/37 Sin[27/17 + 9 t] + 18/47 Sin[29/18 + 10 t] + 
        11/40 Sin[51/32 + 11 t] + 5/19 Sin[53/33 + 13 t] + 
        3/16 Sin[21/13 + 14 t] + 3/35 Sin[71/44 + 15 t] + 
        6/37 Sin[47/29 + 16 t] + 2/9 Sin[21/13 + 17 t] + 
        1/19 Sin[139/87 + 19 t] + 1/13 Sin[41/25 + 20 t] + 
        1/113 Sin[37/24 + 21 t] + 1/231 Sin[55/29 + 22 t] + 
        1/12 Sin[34/21 + 23 t] + 1/213 Sin[119/27 + 24 t] + 
        1/199 Sin[41/29 + 25 t] + 1/131 Sin[71/41 + 26 t] + 
        1/57 Sin[28/17 + 27 t] + 1/45 Sin[57/35 + 29 t] + 
        1/98 Sin[22/13 + 30 t] + 1/69 Sin[28/17 + 31 t] + 
        1/836 Sin[91/20 + 32 t] + 1/53 Sin[18/11 + 33 t] + 
        1/246 Sin[64/35 + 34 t] + 1/79 Sin[51/32 + 35 t] + 
        1/126 Sin[44/25 + 36 t] + 1/54 Sin[18/11 + 37 t] + 
        1/306 Sin[65/34 + 38 t] + 1/66 Sin[18/11 + 39 t] + 
        1/171 Sin[97/54 + 40 t] + 1/80 Sin[77/47 + 41 t] + 
        1/212 Sin[79/45 + 42 t]) UnitStep[
       15 \[Pi] - t] UnitStep[-11 \[Pi] + t] + (-(27062/15) - 
        1/21 Sin[49/39 - 42 t] - 1/12 Sin[29/68 - 36 t] - 
        3/22 Sin[12/19 - 33 t] - 2/33 Sin[16/21 - 30 t] - 
        1/15 Sin[2/19 - 27 t] - 3/35 Sin[1/325 - 24 t] - 
        9/20 Sin[58/37 - 19 t] - 30/89 Sin[59/42 - 16 t] - 
        13/24 Sin[22/19 - 13 t] - 16/21 Sin[32/25 - 10 t] + 
        7171/19 Sin[48/29 + t] + 118/5 Sin[39/14 + 2 t] + 
        8283/202 Sin[49/32 + 3 t] + 276/31 Sin[149/36 + 4 t] + 
        245/19 Sin[71/32 + 5 t] + 116/55 Sin[39/22 + 6 t] + 
        8/13 Sin[68/41 + 7 t] + 51/35 Sin[61/19 + 8 t] + 
        13/14 Sin[29/37 + 9 t] + 35/61 Sin[83/25 + 11 t] + 
        19/22 Sin[37/35 + 12 t] + 14/23 Sin[41/18 + 14 t] + 
        13/30 Sin[10/19 + 15 t] + 7/34 Sin[20/7 + 17 t] + 
        13/38 Sin[4/47 + 18 t] + 13/42 Sin[115/41 + 20 t] + 
        13/40 Sin[25/63 + 21 t] + 5/31 Sin[108/25 + 22 t] + 
        17/67 Sin[103/69 + 23 t] + 2/37 Sin[142/33 + 25 t] + 
        2/23 Sin[72/25 + 26 t] + 5/32 Sin[203/53 + 28 t] + 
        3/22 Sin[29/14 + 29 t] + 3/25 Sin[116/37 + 31 t] + 
        6/41 Sin[20/19 + 32 t] + 1/12 Sin[105/31 + 34 t] + 
        3/29 Sin[28/23 + 35 t] + 3/34 Sin[239/60 + 37 t] + 
        4/33 Sin[67/36 + 38 t] + 2/27 Sin[4/31 + 39 t] + 
        2/41 Sin[35/12 + 40 t] + 2/19 Sin[11/17 + 41 t]) UnitStep[
       11 \[Pi] - t] UnitStep[-7 \[Pi] + t] + (-(256299/275) - 
        7/16 Sin[4/35 - 40 t] - 31/29 Sin[7/22 - 39 t] - 
        16/31 Sin[7/22 - 34 t] - 28/23 Sin[29/32 - 33 t] - 
        34/19 Sin[27/26 - 31 t] - 47/25 Sin[21/37 - 27 t] - 
        183/64 Sin[13/15 - 26 t] - 697/209 Sin[13/16 - 20 t] - 
        103/27 Sin[22/51 - 19 t] - 41/42 Sin[4/23 - 15 t] - 
        271/53 Sin[3/43 - 14 t] - 207/38 Sin[59/60 - 13 t] - 
        286/23 Sin[22/27 - 11 t] - 517/54 Sin[33/65 - 8 t] - 
        171/22 Sin[13/30 - 7 t] - 7885/34 Sin[22/59 - t] + 
        8146/43 Sin[28/27 + 2 t] + 10347/22 Sin[28/13 + 3 t] + 
        7433/38 Sin[11/38 + 4 t] + 3353/72 Sin[37/20 + 5 t] + 
        331/46 Sin[170/37 + 6 t] + 1573/131 Sin[37/27 + 9 t] + 
        1999/41 Sin[63/40 + 10 t] + 173/31 Sin[35/32 + 12 t] + 
        656/101 Sin[49/29 + 16 t] + 437/32 Sin[23/22 + 17 t] + 
        114/23 Sin[4 + 18 t] + 71/20 Sin[3/22 + 21 t] + 
        84/37 Sin[69/32 + 22 t] + 143/43 Sin[61/35 + 23 t] + 
        231/68 Sin[5/22 + 24 t] + 92/55 Sin[112/33 + 25 t] + 
        3/2 Sin[1/7 + 28 t] + 41/18 Sin[55/27 + 29 t] + 
        59/46 Sin[153/76 + 30 t] + 16/35 Sin[1/10 + 32 t] + 
        26/77 Sin[8/33 + 35 t] + 50/41 Sin[45/23 + 36 t] + 
        13/25 Sin[8/3 + 37 t] + 40/37 Sin[346/77 + 38 t] + 
        7/34 Sin[37/30 + 41 t] + 1/3 Sin[46/15 + 42 t]) UnitStep[
       7 \[Pi] - t] UnitStep[-3 \[Pi] + t] + (-(43691/25) - 
        108/35 Sin[30/29 - 40 t] - 118/43 Sin[29/22 - 39 t] - 
        89/25 Sin[6/17 - 35 t] - 278/101 Sin[11/37 - 32 t] - 
        89/24 Sin[11/36 - 30 t] - 338/49 Sin[93/94 - 26 t] - 
        155/14 Sin[1/19 - 23 t] - 520/27 Sin[25/34 - 18 t] - 
        3729/233 Sin[15/13 - 17 t] - 1935/22 Sin[59/38 - 13 t] - 
        1624/33 Sin[31/23 - 9 t] - 299/12 Sin[26/43 - 6 t] - 
        8789/23 Sin[36/37 - 4 t] - 794/7 Sin[15/41 - 3 t] - 
        19163/23 Sin[43/36 - 2 t] + 24528/29 Sin[97/30 + t] + 
        2255/24 Sin[144/37 + 5 t] + 29915/277 Sin[233/58 + 7 t] + 
        1494/35 Sin[71/95 + 8 t] + 991/22 Sin[65/14 + 10 t] + 
        3579/61 Sin[31/27 + 11 t] + 537/32 Sin[106/57 + 12 t] + 
        463/42 Sin[18/55 + 14 t] + 1027/29 Sin[31/35 + 15 t] + 
        362/17 Sin[46/13 + 16 t] + 88/27 Sin[131/28 + 19 t] + 
        91/37 Sin[173/39 + 20 t] + 374/29 Sin[48/25 + 21 t] + 
        253/24 Sin[155/33 + 22 t] + 227/33 Sin[1/608 + 24 t] + 
        75/37 Sin[49/30 + 25 t] + 242/23 Sin[249/56 + 27 t] + 
        133/18 Sin[7/5 + 28 t] + 54/25 Sin[1/358 + 29 t] + 
        49/31 Sin[109/28 + 31 t] + 50/33 Sin[1/22 + 33 t] + 
        7/5 Sin[40/43 + 34 t] + 214/55 Sin[89/24 + 36 t] + 
        241/43 Sin[12/25 + 37 t] + 20/13 Sin[280/279 + 38 t] + 
        105/79 Sin[53/19 + 41 t] + 87/26 Sin[65/37 + 42 t]) UnitStep[
       3 \[Pi] - t] UnitStep[\[Pi] + t]) UnitStep[Sqrt[
    Sign[Sin[t/2]]]]}

ทดลอง plot

computer scientists vs computational scientists

ไปเจอมา ขำดี แต่มันก็จริงนะครับ 555

Computational scientists solve tomorrow’s problems with yesterday’s computers; computer scientists seem to do it the other way around.

– anonymous

a simple pendulum in R

เป็นตัวอย่างที่ผมเขียนขึ้นตอนใช้สอนการเขียน function ในภาษา R ครับ

library(magick)
# the formula for the changing of angle over time 
# https://en.wikipedia.org/wiki/Pendulum
theta <- function(t,period,theta0){
  theta0*cos(2*pi*t/period)
}

# for drawing the pendulum at a given point (x,y), i.e. drawing a line between (0,0) and (x,y)
draw.pendulum <- function(pen.x, pen.y){
  
  pivot.x <- 0
  pivot.y <- 0

  plot(x=pivot.x,y=pivot.y,type = 'l',ylim = c(-1.5,0.1),asp = 1)
  lines(x=c(pivot.x,pen.x),y=c(pivot.y,pen.y))
  points(x = pen.x, y=pen.y,col='red')
}

# calculate the position of the pendulum over time
# l-length of the pendulum
# theta0 - the starting angle (in radian)
# runtime - the simulation time (in seconds)
# step - time step
pendulum <- function(theta0,l,runtime,step = 0.1){
  g <- 9.8
  period <- 2*pi*sqrt(l/g)
  
  times <- seq(0.0,runtime, by = step)

  pen.x <- l*sin(theta(times, period = period,theta0 = theta0)) 
  pen.y <- -l*cos(theta(times,period = period,theta0 = theta0))
  
  output <- matrix(c(times,pen.x,pen.y),ncol = 3)
  return(output)
}


pendulum.sim <- function(theta0, l, runtime, step = 0.1){
  
  sim.data <- pendulum(theta0 = theta0, l=l, runtime = runtime)
  
  ## export each frame as png
  for(i in 1:nrow(sim.data)){
    png(filename = paste0(tempdir(),"/",i,".png"))
    draw.pendulum(sim.data[i,2],sim.data[i,3])
    dev.off()
  }
  
  frames <- image_read(paste0(tempdir(),"/",1:nrow(sim.data),".png"))
  animate <- image_animate(image = frames, fps = 1/step)
  
  return(animate)
  
}

animate <- pendulum.sim(theta0 = pi/4, l = 1, runtime = 10)
print(animate)