Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
認知情報基礎実習2019.06.10 R programming 1
OUTLINEシミュレーション 乱数 (random number generation)
正規分布 Normal distribution 一様分布 Uniform distribution
Random Samplingプログラムの流れのコントロール(Flow Control)
for while if repeat
応用例 中央極限定理 Central Limit TheoremRのスクリプトと関数(Script vs. Function)
SIMULATION: RANDOM NUMBERS
Normal Distribution(正規分布) norm Parameters: N(数), mean(平均), sd(標準偏差)Uniform Distribution (一様分布) Unif Parameters: N(数), min(最小値), max(最大値)乱数の生成 ‘r’を頭につける(rnorm, runifなど)
例> x=rnorm(n=1,mean=100,sd=15)> x[1] 113.7235> y=runif(n=3,min=1,max=10)> y[1] 2.422631 9.000905 5.476001
SIMULATION: RANDOM NUMBERSN = 10000# N = 1000random.data = rnorm(N, mean=0, sd=1)hist(random.data, nclass = 50, col = "navy", xlab = "Data",
probability = T, main = "Histogram of Random Data")
# density of generated datadens = density(random.data)lines(dens, col = "orange", lwd = 4)
# theoretical densityx = seq(-4,4,0.1) true.norm = dnorm(x, mean = 0, sd = 1)lines(x,true.norm, col = "green", lty = 3, lwd = 4)legend("topleft",c("empirical", "theoretical"), lty = c(1,3),
col = c('orange','green'),lwd=4)
SIMULATION: RANDOM NUMBERS
N = 10000 N = 1000
RANDOM SAMPLINGSAMPLE : ランダムに項目をn個選択する syntax: sample(vector, n)
例> sample(1:10,3) # 1 ~ 10 から 数値を3つランダムで取り出す[1] 4 3 8
> sample(c(“gu”,“choki”,“pa”),1) # グー、チョキ、パーから1つランダムで取り出す[1] "gu"
RANDOM PERMUTATIONSAMPLE : ランダムな順に並び替える syntax: sample(vector)
> sample(1:10)[1] 3 5 7 4 2 6 8 10 9 1
> sample(1:10)[1] 5 4 7 9 8 6 1 2 3 10
> sample(c("a","b","c","d","e","f","g"))[1] "b" "d" "e" "c" "a" "f" "g"
SAMPLINGSAMPLE : ランダムな列を生成する syntax: sample(vector, n, replace=T, prob=vector)
replace: 差し替え prob: 選択される確率
> sample(0:1, 10, replace=T)
[1] 1 1 0 0 1 1 0 1 1 1
> sample(c("Head","Tail"), 10, replace=T)
[1] "Tail" "Tail" "Tail" "Tail" "Tail" "Tail" "Tail" "Head" "Head" "Tail"
> sample(c("Head","Tail"), 10, replace=T, prob=c(0.9,0.1))
[1] "Head" "Head" "Head" "Head" "Tail" "Head" "Head" "Head" "Head" "Head"
R PROGRAMMINGFlow Control
FOR: 決められた回数だけ繰り返すWHILE: 条件が満たされている限り繰り返すIF: 条件が満たされたら実行するREPEAT: 条件が満たされるまで繰り返す
R PROGRAMMING: FORFOR FOR loop - 決められた回数だけ繰り返すsyntax: for (counter in vector){ R commands } 例:> for (i_loop in 1:5){print(i_loop)}[1] 1..[1] 5> for (i_loop in 1:5){print(c(i_loop,2^i_loop))}[1] 1 2..[1] 5 32
R PROGRAMMING: WHILEwhile WHILE loop - 条件が満たされている限り繰り返す
syntax: while (expression) { R commands }
counter <- 1while(counter<=10){print(counter)counter<-counter+1
}
counter <- 1while(counter^2 <= 10){print(c(counter, counter^2))counter<-counter+1
}
R PROGRAMMING: IFIF controlsyntax: if (expression) { R commands }
if (expression) { R commands } else {R commands}
affil<-"cogsci"if (affil=="cogsci") {
print("you are wonderful")}[1] "you are wonderful"
affil<-"phil"if (affil=="cogsci") {
print("you are wonderful")} else {print("still, you are wonderful")
}[1] "still, you are wonderful"
R PROGRAMMING: REPEATREPEAT loop - ある条件が満たされるまで繰り返す。 WHILE と似ているが、repeat は最低でも1回は遂行されるようにできるが、while はそうとも限らない。Syntax: repeat { R commands; if (expression) break } # 最低でも1回は遂行される
repeat { if (expression) break; R commands;} # whileとほぼ同じ
v1=1633;v2=355;repeat {
r=v1%%v2print(paste('v1 =',v1,v2 = ',v2, remainder = ',r))v1=v2;v2=rif (r==0){ break}
}
R PROGRAMMING: REPEATREPEAT loop - ある条件が満たされるまで繰り返す。 WHILE と似ているが、repeat は最低でも1回は遂行されるが、while はそうとも限らない。Syntax: repeat { R commands; if (expression) break } OR
repeat { if (expression) break; R commands;}
counter=6repeat{ print(counter)counter = counter + 1if(counter>5){break}
}[1] 6
counter=6repeat{if(counter>5){break}print(counter)counter+counter+1
}
実習:大数の法則大数の法則の検証実験手続き1.繰り返し回数Nを定義2.1~6をN回サンプル3.6が出てきたら+1カウント
0 200 400 600 800 1000
12
34
56
results of 1000 rolls of a die
rolls
outcome
0 200 400 600 800 1000
0.0
0.2
0.4
Cumulative probability that rolls of a die come out SIX
rolls
probability
実習:大数の法則大数の法則の検証実験手続き1.繰り返し回数Nを定義 → forを使用2.1~6を無作為に発生 → sampleを使用3.6が出てきたら+1カウント → ifを使用
実習:大数の法則大数の法則の検証実験手続き1. 繰り返し回数Nを定義 → forを使用2. 1~6を無作為に発生 → sampleを使用3. 6が出てきたら+1カウント → ifを使用
six.counter=0for (i_loop in 1:1000) {die<-sample(1:6,1)if (die==6) {six.counter=six.counter+1}
}> six.counter/1000[1] 0.164
実習:大数の法則 その2大数の法則の検証実験手続き (確率の推移を見たい)1. 繰り返し回数Nを定義 → forを使用2. 1~6を無作為に発生 → sampleを使用3. 6が出てきたら+1カウント → ifを使用
N=1000; six.counter=rep(0,N);for (i_loop in 1:N) {die<-sample(1:6,1)if (die==6) {six.counter[i_loop]=1}
}plot(1:N,cumsum(six.counter)/(1:1000),type='l',ylim=c(0,1),lwd=2)
実習:大数の法則 その3大数の法則の検証実験手続き (確率の推移を見たい)1. 繰り返し回数Nを定義 →2. 1~6を無作為にN回発生 → sampleを使用3. 6が出た場所を同定 → ==を使用
N = 1000die.all <- sample(1:6,N,replace=T)six.index <- die.all==6par(mfrow = c(2,1))par(oma=c(2,2,0,0),mar=c(4,4,1,1),mfrow=c(2,1))plot(1:N, die.all, pch=20, col = 'red', ylim = c(0,7),
ylab = "Result", xlab = "trial")plot(1:N,cumsum(six.index)/(1:1000), type='l', ylim=c(0,1), lwd=2,
ylab = "P(die = 6)", xlab = "trial")
実習:大数の法則 その3
SIMULATION: SAMPLINGCentral Limit Theorem (中央極限定理) 同一の分布に従う変数の独立したサンプルの平均値は、サンプル回数を増やすと、漸進的に正規分布に従う
平均=オリジナルの分布の平均 標準偏差は=σ/√N
Distribution of Means of Uniform Distribution
Means
Density
0.2 0.4 0.6 0.8
01
23
4
Density of Actual MeansNormal Distribution
実習:中央極限定理 その1中央極限定理の検証実験(一様分布の平均値の分布)手続き1. 一回のサンプル数Nと、サンプリング回数nRepを定義 → for2. サンプル数Nの一様分布に従う乱数を生成 → runif3. 平均値を求め記録する → mean4. 2をnRep回繰り返す5. 平均ペクトルのhistgramをplot6. Densityを計算&plot
Histogram of 100000 randomly generated numbers
x
Density
-4 -2 0 2 4
0.0
0.1
0.2
0.3
0.4
actualtheoretical
実習:中央極限定理 その1中央極限定理の検証実験(一様分布の平均値の分布)手続き1. 一回のサンプル数Nと、サンプリング回数nRepを定義 → for2. サンプル数Nの一様分布に従う乱数を生成 → runif3. 平均値を求め記録する → mean4. 2をnRep回繰り返す5. 平均ペクトルのhistgramをplot6. Densityを計算&plot
N=10;nRep=10000;means<-rep(0,nRep)for (i_rep in 1:nRep) { dat<-runif(N) means[i_rep]=mean(dat)
}hist(means,nclass=50,probability=T)dens<-density(means)lines(dens,col='skyblue',lwd=3) xs=seq(-0,1,0.01)theo.dens<-dnorm(xs,mean=0.5,sd=sqrt((1/12)/N))lines(xs,theo.dens,col='orange',lwd=3,lty=2)
実習:中央極限定理 その2中央極限定理の検証実験(一様分布の平均値の分布)手続き1. 一回のサンプル数Nと、サンプリング回数nRepを定義2. N x nRepの一様分布に従う乱数を含む行列を作成 → runif, matrixを使用3. 列ごとに平均を求める → colMeansを使用4. 平均ペクトルのhistgramをplot5. Densityを計算&plot
N=10nRep=10000dat<-matrix(runif(N*nRep),nrow=N)means<-colMeans(dat)hist(means,nclass=50,probability=T)dens<-density(means)lines(dens,col='skyblue',lwd=3) xs=seq(-0,1,0.01)theo.dens<-dnorm(xs,mean=0.5,sd=sqrt((1/12)/N))lines(xs,theo.dens,col='orange',lwd=3,lty=2)
実習:最大公約数の算出Whileの例題:最大公約数(2つの数値の場合)手続き1. 2つ数値を比較する1. 大きい値をv1、小さい値をv2とする2. r=v1/v2の余りとする3. V1をV2で置き換える4. V2をrで置き換える5. rが0になるまで続ける → while
実習:最大公約数の算出Whileの例題:最大公約数
r=-99;v1=1633;v2=355while (r!=0){r=v1%%v2print(paste('v1 =',v1,', v2 = ',v2,',remainder = ',r))v1=v2v2=r
}[1] "v1 = 1633 , v2 = 355 ,remainder = 213”[1] "v1 = 355 , v2 = 213 ,remainder = 142”[1] "v1 = 213 , v2 = 142 ,remainder = 71”[1] "v1 = 142 , v2 = 71 ,remainder = 0"
SCRIPT VS. FUNCTION•Script •再利用が「面倒」•変数・定数を変更するのが面倒•すべての変数・定数がworkspaceに残る• Errorのチェックがしやすい(簡単なscriptでは)
•Function•再利用が簡単•変数・定数をinput argにすると変更が簡単•出力のみがworkspaceに残る• Error のチェックには工夫が必要•特に理由がない限りはfunctionの方がいい
Fun_name <- function(inp_args ..) {rcmd
}
SCRIPT VS. FUNCTIONx1=1x2=5x.sum=x1+x2> x1[1] 1> x2[1] 5> x.sum[1] 6
summation<-function(y1,y2){y.sum=y1+y2return(y.sum)
}y.sum <- summation(y1=1,y2=5)> y1Error: object 'y1' not found> y2Error: object 'y2' not found> y.sum[1] 6
R PROGRAMMING: FUNCTIONFunction: 入力引数、出力引数をとり、出力以外の内部で使用されて変数はローカル変数となる(出力されない)。Script: 入力引数、出力引数をとらなく、スクリプト内で使用・更新された変数はそのままR上に残される。Function&入力引数→柔軟性、再利用性が高いSyntax: fun_name<-function(arg1… ){RCOMMAND}rGCD<-function(v1,v2){ real.v1=max(c(v1,v2)) real.v2=min(c(v1,v2))repeat{
r=real.v1%%real.v2;real.v1=real.v2;real.v2=r if (r==0){
print(paste('GCD is',real.v1)); return(real.v1);break}
}}
> res<-GCD(1633,355)[1] "GCD is 71"