## 2017年 9月15日(金) #実際に「打ち込むのではなく」、「コピペ」でやりましょう。 #Sigmoid関数を定義 f <- function(x){1/(1+exp(-x))} #関数値の評価は f(+10.0) #でできる。ほぼ1.0(0.9999546)になる。 #-10から+10まのの範囲で、0.1刻みで増える配列をseq関数で作る xseq <- seq(from=-10, to=10, by=0.1); #plotは、(x,y)の値の組をプロットする。 #f(xseq)で、xseqの値を関数fに順次適応した値が戻る。 plot(xseq,f(xseq),col="green") #垂直と水平な線を引く abline(v=0,col="blue") abline(h=0.5,col="blue") ##オマケ。y=a+b*xの直線を引く abline(a=1,b=0.5,col="red") #ReLU(ランプ関数) #Deep Learningで良く使われる。 ##Rectified Linear Unit ReLU <- function(x){ifelse(x>0,x,0)} plot(xseq,ReLU(xseq),col="blue") title("Rectified Linear Unit") ReLU <- function(x){ifelse(x>0,x+0.1,0)} ##ifelseは、Visual Basicの様(<条件>,<条件がTの時に返却する値>, ##<条件がFの時に返却する値>) ReLU(c(-2,-1,0,1,2)) ##ってやると、以下となる。 ##[1] 0.0 0.0 0.0 1.1 2.1 ##起こっていることは、 x <- c(-2,-1,0,1,2) x>0 ##<条件がTかFか、、 ##[1] FALSE FALSE FALSE TRUE TRUE x+0.1 ##<条件がTの時に返却する値>, ##[1] -1.9 -0.9 0.1 1.1 2.1 rep(0,5) ##<条件がFの時に返却する値>を条件の長さ分作る。 ##[1] 0 0 0 0 0 ##で、選んで、まとめて、返すから。 ##ReLU(matrix(1:20-8,nrow=5)) ##h:身長とJ:ジャンプ力を考慮した「バスケットボール選手向き」得点関数 g <- function(h,j) { 1.2*h+0.8*j-2.9 } ##身長が170cm、ジャンプ力が60cmの人は、、 g(1.7,0.6) ##[1] -0.38で、残念。「バスケットボール選手」不向き hseq <- seq(1.5, 2.3, 0.1) #身長の配列。150cm〜230cm。 hseq ##[1] 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 ##ジャンプ60cmだったら、200cm以上の身長が必要 plot(hseq, g(hseq, j=0.6),type="b") abline(h=0,col="red"); abline(v=2,col="blue") title("When jump is 0.6[m]") ##ジャンプ85cmだったら、185cmの身長でもOK plot(hseq, g(hseq, j=0.85),type="b") abline(h=0,col="red"); abline(v=1.85,col="blue") title("When jump is 0.85[m]") ##ジャンプ力をセコセコ変えるのが面倒。 par(mfrow=c(1,1)) jseq <- seq(0.3, 1.0, 0.01) #ジャンプ力の配列。30cm〜100cm z <- outer(hseq, jseq, g) ##contour(hseq, jseq, z) image(hseq, jseq, z, col = terrain.colors(200), xlab="height", ylab="jump") contour(hseq, jseq, z, add = TRUE, col = "black") ##contour(hseq, jseq, z persp(hseq, jseq, z, theta = 30, phi = 30) #3Dのグラフを書く z #W1=0.2, W2=0.8, θ=0.2の時、X1が0.5、X2が-0.7の出力は、、、 #fにSigmoid関数。 f <- function(x){1/(1+exp(-x))} #関数gは、(x1,x2)の入力に対して、出力を計算する。 g <- function(x1,x2) { f(0.2*x1+0.8*x2+0.2) } g(0.5, 0.7) ##0.7026607となる。 ##でと、もっと別の組ではどうなるのだろうか??? par(mfrow=c(1,2)) (x1 <- seq(-5, 5, by=0.1)) #x1に「数字の並び」を保存。割り当て。付値。 ## [1] -5.0 -4.9 -4.8 -4.7 -4.6 -4.5 -4.4 -4.3 -4.2 -4.1 -4.0 -3.9 -3.8 -3.7 -3.6 ## ..... ## [91] 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0 x2 <- x1 #x2にx1(「数字の並び」)をコピー。 z <- outer(x1, x2, g) #x1とx2の組に対して、関数gを適用。zはニューロンの出力 persp(x1, x2, z, theta = 30, phi = 30) #3Dのグラフを書く ##contour(x1, x2, z) #等高線図 image(x1, x2, z, col = terrain.colors(10)) contour(x1, x2, z, add = TRUE, col = "black") ##4本の直線に囲い込まれた領域 x <- seq(-30, 30) ##例によって、-30〜+30の配列を作る y <- x f <- function(x){ 1/(1+exp(-x))}##Sigmoid関数 g1 <- function(x1,x2) { f(0.8*x1-0.5*x2+10) } g2 <- function(x1,x2) { f(x2+10) } g3 <- function(x1,x2) { f(-x1+10) } g4 <- function(x1,x2) { f(-x2+10) } g <- function(x1,x2) { f(5*(g1(x1,x2)+g2(x1,x2) +g3(x1,x2)+g4(x1,x2)-3.5))} z <- outer(x, y, g) par(mfrow=c(1,2)) persp(x, y, z, theta = 30, phi = 30) contour(x, y, z) abline(a=20,b=1.6,col=5) ## y=a+b*x abline(v=+10,col=4) abline(h=-10,col=2) abline(h=+10,col=3) #W1=0.2, W2=0.8, θ=0.2の時の出力の様子をグラフ化してみよう。 x <- seq(-5, 5, by=0.2) y <- x f <- function(x){ 1/(1+exp(-x))} g <- function(x1,x2) { f(0.2*x1+0.8*x2+0.2) } z <- outer(x, y, g) persp(x, y, z, theta = 30, phi = 30) contour(x, y, z)