線形代数について語ろう

Rで線形代数を体験する

実装環境
Anaconda jupyter lab with R kernel 
多分Rstudio だけでも行けるはず


やってることフローチャート
１．functionをつくってデータ作成する
2.　Parameterを1.のFunctionに設定してデータセットを用意
3.　みんなの大好きggplotに当てはめてLinear regression を作る。

　　＊インストールできてないライブラリーは随時インストールする。

```R

library(ggplot2)
# generate a list of points between (0,5)
x = seq(0,5,length.out=1000)


MyFun <- function(x,a,b,c) {
     res <- a + b*x + c*(x**2)
     return(res)
    }
# set values for a,b,c
set1 <- list(a=0, b=1, c=0.1)
set2 <- list(a=0, b=2, c=-0.1)
set3 <- list(a=-5, b=0.5, c=1)
set4 <- list(a=20, b=0, c=-1)

options(repr.plot.width = 7, repr.plot.height = 3)
plt <- ggplot(data.frame(x), aes(x=x)) + 
  stat_function(fun = MyFun, n = 1000, args = set1,aes(colour = paste(names(set1),set1,sep="=",collapse=", " ))) +
  stat_function(fun = MyFun, n = 1000, args = set2,aes(colour = paste(names(set2),set2,sep="=",collapse=", " ))) +
  stat_function(fun = MyFun, n = 1000, args = set3,aes(colour = paste(names(set3),set3,sep="=",collapse=", " ))) +
  stat_function(fun = MyFun, n = 1000, args = set4,aes(colour = paste(names(set4),set4,sep="=",collapse=", " )))+
  scale_colour_manual("Parameter Values",values = c("red", "blue", "green", "orange"))


print(plt)
```

いろいろRで線形モデルを作ってみる

うちの学校で出たやつ。
　手順
１．きれいなデータセットと予めその理想的なLinear modelを作って起き、
2.ノイズを加えて現実的なデータプロットにして、
3.そこからノイズ入りデータからlinear regression を作ってみる

１．きれいなデータセットであらかじめ理想的なLinear modelを作って起き、


```R
xmin=0
xmax=10
set.seed(54321)
##############################
#      Customize the demo here
#      =======================
# the "true" function of x with range fixed at [0,10]
trueFun <- function(x) {
     res <- sin(x*2.0)*sqrt(x)/3.3
     return(res)
    }
#  when fitting goes wild, need to constrain what y's are plotted
#  must be compatible with "true" function
ydisplaymin = -1.8
ydisplaymax = 1.8

#  don't make points more than 100 as demo is O(points^3)
points = 30

#  set noise level (std.dev)
mySigma = 0.2
##############################


#  generate a x vector randomly
x = sort(runif(points,xmin,xmax))
#  build the true values matching the sampled data
yt = trueFun(x)

# xts and yts store the "true" function for the purposes of plotting
# these have to be high frequency to make the resultant plot look
# like a smooth curve
xts = seq(0,10,length.out=200)
yts = trueFun(xts)

options(repr.plot.width = 7, repr.plot.height = 4)
ggplot(data.frame(x,yt),aes(x=x,y=yt)) + 
    geom_point() +  stat_function(fun = trueFun, aes( colour = 'Truth')) +  
    labs(x = 'x',y='y') + ylim(ydisplaymin,ydisplaymax) +
    scale_colour_manual("",values = 'blue')
```

単純なsin関数に徐々に変動が大きくなるようにsquere(x)の影響下にしただけのしんぷるな関数。

2.ノイズ(ガウスノイズ)を加えて現実的なデータプロットにして、

```
#add Gaussian noise
y <- yt + rnorm(length(yt), sd = mySigma)
yNoise <- y-yt

options(repr.plot.width = 7, repr.plot.height = 4)
base <-ggplot(data.frame(x,yNoise),aes(x=x,y=yNoise)) + 
    geom_point() + labs(x = 'x',y='y', title='Noise')
print(base)


ggplot(data.frame(x,y),aes(x=x,y=y)) + geom_point() +
    stat_function(fun = trueFun, aes( colour = 'Truth')) +
    labs(x = 'x',y='y', title='Data and Truth Function') + 
    scale_colour_manual("",values = 'blue')


```
3.そこからノイズ入りデータからlinear regression を作ってみる

```
##############################
#      Customize the demo here
#      =======================
#     change the order to see different order polynomials being fit
order = 4
##############################

options(repr.plot.width = 7, repr.plot.height = 4)
# plot data and the truth
base <- ggplot(data.frame(x,y),aes(x=x,y=y)) + geom_point() +
     aes(colour = 'Truth') + 
    geom_smooth(method = "lm", formula = y ~ poly(x,order), 
                se=F, aes(colour='Fit'),size = 0.5) +
    labs(x = 'x',y='y', title='Data and Function')


print(base)

```

線形代数でよく使われる二重誤差(lm)を用いて回帰線と実際のデータ（ノイズ入りのデータ）との違いの総量を最小化をする。


まあ、現時点で分けワカメな人も単純にRの回帰曲線サンプルコードとして、実際に自分の環境でCopy and pasteして試してくださいまし。