Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
逆問題スプリングスクール
R言語による演習
2016年3月5日 9:○○~12:○○
逆問題小委員会
:山本真哉(清水建設):西村伸一(岡山大学)
土木学会応用力学委員会
講師:大竹 雄(新潟大学)
内 容
◆第一部:プログラミングの基本的理解(70min)
•R言語とは?
•R言語のインストール
•プログラミングのための基礎
•簡単な例題演習と理解
◆第二部:逆問題の基礎的な例題(80min)
•基礎例題に即したプログラムミング基礎演習
•粒子フィルタープログラミング基礎演習1
内 容
◆第一部:プログラミングの基本的理解
•R言語とは?
•R言語のインストール
•プログラミングのための基礎
•簡単な例題演習と理解
◆第二部:逆問題の基礎的な例題
•例題に即したプログラムミング演習
•粒子フィルタープログラミング基礎演習
2
R言語とは?
• R言語(アールげんご)は、オープンソースでフリーソフトウェアの統計解析向けプログラミング言語、及びその開発実行環境である。
• R言語は、ニュージーランドのオークランド大学のRoss IhakaとRobert Gentlemanにより作られた。現在では、R Development Core Team(S言語開発者であるJohn M. Chambersも参画。 R Project Contributors)によって、メンテナンスと拡張がなされている。
• なお、R言語仕様を実装した処理系の呼称名はプロジェクトを支援するフリーソフトウェア財団によればGNU R(GNU R - Free Software Directory)だが、他の実装形態が存在しないため当記事では日本での慣用的呼称にならい仕様・実装をまとめて適宜 “R言語” や “R” 等と呼ぶ。([Wikipedia] accessed 2014/04/18)
3
R言語のインストール
•筑波大学ダウンロードサイト:http://cran.md.tsukuba.ac.jp/
•おすすめHP:“R-tips”
http://cse.naro.affrc.go.jp/takezawa/r-tips/r.html
•より高度な問題でわからないなら,“R言語 ○○○”と検索
4
プログラミングのための基礎:データ生成
とにかく打ち込んでみましょう!!
#四則演算
1+3
x <- 1+3
x
18-6
2*5
2/8
# ベクトル・データの生成
x <- 1:5
x
x <- c(1:5)
x
x <- seq(from=-3,to=3,by=0.5) # このようにもできる
x <- -3.5 + 0.5*c(1:13) # 上の代替的方法(いろいろあります)5
プログラミングのための基礎:データ生成
とにかく打ち込んでみましょう!!
# 繰り返し(rep)
rep(1:4,4)
rep(1:4,c(2,2,2,2)) # rep = repeate
rep(1:4,rep(2,4))
rep(1:4,1:4)
x <- 1:8
dim(x) <- c(2,4) # dimは,行列を生成する関数である
x
dim(x) <- c(4,2)
x
# 行列指定によるデータの生成
x <- matrix(1:8,2,4,byrow=F) # matrixも列を生成する関数である
x <- matrix(1:8,2,4,byrow=T)
x <- matrix(1:16,ncol=4) 6
プログラミングのための基礎:データ生成
とにかく打ち込んでみましょう!!
# ベクトルの連結による行列の生成
x <- cbind(c(1,2,3),c(4,5,6))
#cbindは,二つ以上のベクトルを列として行列生成
x
y <- rbind(c(1,4),c(2,5),c(3,6))
#rbindは,二つ以上のベクトルを行として行列生成
y
# cbind = colum bind, rbind = row bind
# ベクトルと行列の演算
z <- x + y # 演算子(+ - * / ^2)は,要素に適用される.
z
x - y
x * y
x / y
x^2 7
プログラミングのための基礎:データ生成
とにかく打ち込んでみましょう!!
# 行列積は「%*%」
x <- matrix(1:4,2,2,byrow=T)
z <- c(5,5)
x ; z
x <- x %*% t(x)
x
v <- x %*% z
v
t(x) # 行列の転置
xinv <- solve(x) # 逆行列の計算も簡単
xinv
x %*% xinv
8
プログラミングのための基礎:データ生成
とにかく打ち込んでみましょう!!
# 便利な機能
diag(x) # 対角要素の取り出し
ncol(x) # 列の数 number of columbes
nrow(x) # 行の数 number of rows
solve(x) # 逆行列の計算
solve(x,z) # 係数行列x,定数ベクトルzとする連立方程式の解
col(x) # 列番号を要素とする行列の生成
row(x) # 行番号を要素とする行列の生成
svd(x) # 特異値分解
9
プログラミングのための基礎:データ生成
とにかく打ち込んでみましょう!!
# データの追加:データの後ろに,データを追加する
score <- c(45, 46, 28, 64, 45, 64, 88, 32, 54, 65, 59, 76, 83)
score
newscore1 <- c(score,c(57, 69, 56, 72, 95))
newscore1
newscore1<- append(score,c(57, 69, 56, 72, 95))
newscore1
#データの挿入:11番目と12番目のデータの間に,新しいデータを挿入する
newscore2 <- c(score[1:10],c(57, 69, 56, 72, 95),score[11: length(score)])
newscore2
newscore2 <- append(score,c(57,69,56,72,95),after=10)
newscore210
プログラミングのための基礎:データ生成
とにかく打ち込んでみましょう!!
# データの削除:11番目から15番目のデータを削除する
newscore3 <- newscore2[-11:-15]
newscore3
score
# データの置換:1番目のデータを置換する.
11番目から13番目のデータを置換する.
newscore3[1] <- 88
newscore3
newscore3[10:13] <- c(88,95,75,100)
newscore3
11
プログラミングのための基礎:グラフィック関係
まずは,一気に打ち込んで,コマンドの意味を考えてみてください
# 例題: グラフプロット
n <- 20 #??
r1 <- 0.9 # ??
r2 <- -0.7 # ??
x1 <- rnorm(n) # ??
y1 <- r1*x1 + sqrt(1-r1^2)*rnorm(n) # ??
x2 <- rnorm(n) # ??
y2 <- r2*x2 + sqrt(1-r2^2)*rnorm(n) # ??
plot(x1,y1,xlim=c(-4,4),ylim=c(-4,4),xlab="x",ylab="y")
points(x2,y2,pch=19) #pchはプロットの種類番号
segments(-5,0,5,0)
segments(0,-5,0,5)
# ??12
-4 -2 0 2 4
-4-2
02
4
x
y
プログラミングのための基礎:グラフィック関係
13
x1-y1
x2-y2
plot
points
segments
segments
プログラミングのための基礎:グラフィック関係
それぞれのコマンドの説明
# 例題: グラフプロット
n <- 20 #乱数を生成する数
r1 <- 0.9 #相関係数①
r2 <- -0.7 #相関係数②
x1 <- rnorm(n) #正規乱数の生成
y1 <- r1*x1 + sqrt(1-r1^2)*rnorm(n) #x1に相関した正規乱数の生成
x2 <- rnorm(n) #正規乱数の生成
y2 <- r2*x2 + sqrt(1-r2^2)*rnorm(n) #x2に相関した正規乱数の生成
plot(x1,y1,xlim=c(-4,4),ylim=c(-4,4),xlab="x",ylab="y")
points(x2,y2,pch=19) #pchはプロットの種類番号
segments(-5,0,5,0)
segments(0,-5,0,5)
# plot:散布図,points:散布図の追加,segments:基準線の追加14
プログラミングのための基礎:グラフィック関係
とにかく打ち込んでみましょう!!
# 例題: グラフプロットの種々の例題
lines(c(0.0,-4.0),c(0.0,4.0),lty=2)
lines(c(0.0,4.0),c(0.0,4.0),lty=2)
#自分でいろいろためしてみてください
text(3.5,3.5,"I",cex=2.0)
text(-3.5,3.5,"II",cex=2.0)
text(-3.5,-3.5,"III",cex=2.0)
text(3.5,-3.5,"VI",cex=2.0)
legend(-1,-2,c("rho=0.9","rho=-0.7"),pch=c(1,19))
# 困ったときの対応,for help?
help("plot")
help("hist")15
-4 -2 0 2 4
-4-2
02
4
x
y
III
III VI
rho=0.9rho=-0.7
プログラミングのための基礎:グラフィック関係
16
簡単な例題演習と課題:台形公式による数値積分
#
#****** 問題 数値積分: 台形公式 ***************************
# 任意関数の数値積分を考える.ここでは,次の2つの積分を考える.
# (1) f(x)= -(x-1)^2 + 1 放物線の(0,2)区間の積分
# (2) f(x)= sqrt(4 - (x-2)^2 ) 半径2,中心(2,0)の半円の(0,4)区間の積分
#
#
# ※ポイント
# FortranのようなDo ループはいりません
# この問題を解くことにより,
# R言語の特性が理解できます
#
17xs xe
Dx Dx
F(xs)
F(x)
簡単な例題演習と課題:台形公式による数値積分
18
x
f(x)
0.0 0.5 1.0 1.5 2.0 2.5 3.0
-3
-2
-1
0
1
x
f(x)
0 1 2 3 4 5
0
1
2
3
4
5
(1)f(x)= -(x-1)^2 + 1 放物線の(0,2)区間の積分
(2)f(x)= sqrt(4 - (x-2)^2 ) 半径2,中心(2,0)の半円の(0,4)区間の積分
簡単な例題演習と課題:台形公式による数値積分
19
これまでの演習の復習しながら
各自プログラミングしてみてください
まずは(1)の例題,時間があれば(2)へ
必要なコマンド:ベクトルXの足算
sum(X)
20
# (1)の解答例
xs <- 0
xe <- 2
n <- 100
Dx <- (xe-xs)/n
x <- c(1:n)
x1 <- xs + (x-1) * Dx
x2 <- xs + x * Dx
F1 <- -(x1-1)^2 + 1
F2 <- -(x2-1)^2 + 1
x <- (F1+F2)/2*Dx
Int <- sum(x)
Int
簡単な例題演習と課題:台形公式による数値積分
????3行
※すでにベクトルです
※すでにベクトルです
21
# (2)の解答例
xs <- 0
xe <- 4
n <- 100
Dx <- (xe-xs)/n
x <- c(1:n)
x1 <- xs + (x-1) * Dx
x2 <- xs + x * Dx
F1 <- sqrt(4 - (x1-2)^2 )
F2 <- sqrt(4 - (x2-2)^2 )
x <- (F1+F2)/2*Dx
Int <- sum(x)
Int
簡単な例題演習と課題:台形公式による数値積分
????3行
※すでにベクトルです
※すでにベクトルです
22
# Function化によりすっきりさせる
simpson <- function(xs,xe)
{
# fun(x)で定義された一変数関数を,(xs,xe)の間で数値積分する.
n <- 100
Dx <- (xe-xs)/n
x <- c(1:n)
x1 <- xs + (x-1) * Dx
x2 <- xs + x * Dx
x <- (fun(x1)+fun(x2))/2*Dx
Int <- sum(x)
Int
}
簡単な例題演習と課題:台形公式による数値積分
????
23
# Function化によりすっきりさせる
fun <- function(x)
{ -(x-1)^2 + 1 }
curve(fun,0,2)
simpson(0,2)
fun <- function(x)
{ sqrt(4 - (x-2)^2 ) }
curve(fun,0,4)
simpson(0,4)
簡単な例題演習と課題:台形公式による数値積分
プログラミングのための基礎:グラフィック関係
# Rでは,確率分布を表す関数はある規則により統一されている
# 例えば正規分布を例に取ると,
dnorm(x,xmean,xsd)
#平均 xmean,標準偏差xsdの確率密度関数(PDF)
# xに応じた確率密度を出力.dnorm(x)でディフォルトはN(0,1)
pnorm(x,xmean,xsd)
#平均 xmean,標準偏差xsdの確率分布関数(CDF)xに応じた累積確率を出力.
qnorm(p,xmean,xsd)
#平均 xmean,標準偏差xsdのquantile関数(CDFの逆関数)pに応じたxを出力.
rnorm(n,xmean,xsd)
#平均 xmean,標準偏差xsdのn個の乱数を生成する.
#すべての関数で,頭文字がd,p,q,rにより,機能が統一されている.
24
内 容
◆第一部:プログラミングの基本的理解
•R言語とは?
•R言語のインストール
•プログラミングのための基礎
•簡単な例題演習と理解
◆第二部:逆問題の基礎的な例題
•基礎例題に即したプログラムミング基礎演習
•粒子フィルタープログラミング基礎演習
25
26
例題1:優決定問題(m>n)
Hxz zHx 1
変位z1, z3, z5を計測し,外力x1とx4を推定する問題を考える.
4
1
5
3
1
1016111
795210
xx
zzz
795210
1016111 1
4
1
xx
1h 2h 3h 4h 5h1 2 3 4 5
11, zx 3z 4x 5z
27
優決定問題の解
0 2 4 6 8 10
02
46
810
X1
X4
1041 xx
526 41 xx
正解
(7.7,3.4)
(8,2)
7910 41 xx
13717173THH
zHHHx T1Tˆ
795210
1061111
13717173 1
4
1
4.37.7
ˆxx
x
zHHHx T1Tˆ
28
優決定問題の解
【参考:R言語プログラム】
#Hマトリックスの生成H <- c(1,1,1,1,6,10)H <- matrix(H,3,2)
#Zベクトルの生成Z <- c(10,52,79)
#求解X <- solve( t(H) %*% H ) %*% t(H) %*% Z
#解の表示・確認X
0 2 4 6 8 10
02
46
810
X1
X4
1041 xx
526 41 xx
正解
(7.7,3.4)
(8,2)
7910 41 xx
zHHHx T1Tˆ
29
優決定問題の解
【参考:R言語プログラム】
>> 前頁の続き
F1 <- function(xx){ - xx + 10 }F2 <- function(xx){ - 6*xx + 52 }F3 <- function(xx){ - 10*xx + 79 }
xx <- c(0:100)/10yy <- F1(xx)
plot(xx,yy,type="l",xlab="X1",ylab="X4",col=2)yy <- F2(xx)
points(xx,yy,type="l",lty=2,col=2)yy <- F3(xx)
points(xx,yy,type="l",lty=3,col=2)points(X[2],X[1],cex=2)points(8,2,cex=2,pch=19)0 2 4 6 8 10
02
46
810
X1
X4
1041 xx
526 41 xx
正解
(7.7,3.4)
(8,2)
7910 41 xx
zHHHx T1Tˆ
0 2 4 6 8 10
02
46
810
X1
X4
30
優決定問題の解
zHHHx T1Tˆ
################################コンター図
>> 前頁の続き
N1 <- 100N2 <- 100
J <- matrix(1:N1*N2,N1,N2)X1 <- 0
for( i in 1:N1){X1 <- X1 + 0.1X2 <- 0
for( j in 1:N2){X2 <- X2 + 0.1XX <- c(X2, X1)J[i,j] <- t(Z - H %*% XX ) %*% ( Z - H %*% XX )}
}
x <- seq(from=0.1,to=10,by=0.1)y <- seq(from=0.1,to=10,by=0.1)
contour(x,y,J,add=T,levels=seq(0, 10000, by=50),drawlabels = F,col=grey(0.5))
1041 xx
526 41 xx
正解
(7.7,3.4)
(8,2)
7910 41 xx
0 2 4 6 8 10
02
46
810
X1
X4
31
計測データの信頼度を考慮:重み付き 小二乗法
WzHWHHx T1Tˆ
変位z3の信頼度が低いとし,その重みを0.2とする.
正解
(7.7,3.4)
(8,2)
(7.6,2.7)
2.1082.122.122.2TWHH
11002.00001
W
WzHWHHx T1Tˆ
795210
1061111
2.1082.122.122.2 1
4
1
7.26.7
ˆxx
x
0 2 4 6 8 10
02
46
810
X1
X4
32
計測データの信頼度を考慮:重み付き 小二乗法
WzHWHHx T1Tˆ
変位z3の信頼度が低いとし,その重みを0.2とする.
正解
(7.7,3.4)
(8,2)
(7.6,2.7)
【参考:R言語プログラム】
>> 前頁から続き
#データ数のカウントn <- length(Z)
#観測の信頼度(重み)ベクトルW <- matrix(0,n,n)diag(W) <- c(1,0.2,1)
#求解X <- solve( t(H) %*% W %*% H ) %*% t(H) %*% W %*% Z
0 2 4 6 8 10
02
46
810
X1
X4
33
計測データの信頼度を考慮:重み付き 小二乗法
WzHWHHx T1Tˆ
変位z3の信頼度が低いとし,その重みを0.2とする.
正解
(7.7,3.4)
(8,2)
(7.6,2.7)
【参考:R言語プログラム】
>> 前頁から続き
xx <- c(0:100)/10yy <- F1(xx)
plot(xx,yy,type="l",xlab="X1",ylab="X4",col=2)yy <- F2(xx)
points(xx,yy,type="l",lty=2,col=2,lwd=2)yy <- F3(xx)
points(xx,yy,type="l",lty=3,col=2)points(X[2],X[1],cex=2)points(8,2,cex=2,pch=19)points(X1.0,X2.0,cex=2,pch=19,col=grey(0.6))
0 2 4 6 8 10
02
46
810
X1
X4
34
計測データの信頼度を考慮:重み付き 小二乗法
WzHWHHx T1Tˆ
正解
(7.7,3.4)
(8,2)
(7.6,2.7)
################################コンター図
>> 前頁の続き
N1 <- 100N2 <- 100
J <- matrix(1:N1*N2,N1,N2)X1 <- 0
for( i in 1:N1){X1 <- X1 + 0.1X2 <- 0
for( j in 1:N2){X2 <- X2 + 0.1XX <- c(X2, X1)J[i,j] <- t(Z - H %*% XX ) %*% W %*% ( Z - H %*% XX )}
}
x <- seq(from=0.1,to=10,by=0.1)y <- seq(from=0.1,to=10,by=0.1)
contour(x,y,J,add=T,levels=seq(0, 10000, by=50),drawlabels = F,col=grey(0.5))
35
例題2:粒子フィルターのプログラミング基礎劣決定問題(m<n)
変位z1, z5を計測し,外力x1, x3, x5を推定する問題を考える.
Hxz zHx 1
1 2 3 4 5
11, zx 3x 55 , zx
1h 2h 3h 4h 5h
5
3
1
5
1
1561111
25014
xxx
zz
11014
1561111 1
5
3
1
xxx
36
劣決定問題の解:ノルム 小解
zHHHx 1TTˆ
14531 xxx
110156 531 xxx
(2,6,10)正解
(4.2,4.6,5.2)
26222223THH
zHHHx 1TTˆ
25014
26222223
1516111 1
5
3
1
2.56.42.4
ˆxxx
x
37
例題2:粒子フィルターのプログラミング基礎
N
i
itt
itt
i
xyp
xyp
1)(
)(
))(())((
21exp
)2(1)( 1 i
ttTi
ttl
itt xHyRxHy
Rxyp
土木学会応用力学委員会逆問題小委員会ホームページ逆問題副読本山本真哉より引用
尤度
38
例題2:粒子フィルターのプログラミング基礎
##################################################################Hマトリックスの生成
H <- c(1,1,1,6,1,15)H <- matrix(H,2,3)
#Zベクトルの生成Z <- c(14,110)#################################################################
#ここからスタート
#粒子の数N <- 10000
#事前分布(一様乱数,1~10)x1 <- runif(N,1,10)x2 <- runif(N,1,10)x3 <- runif(N,1,10)XX <- cbind(x1,x2,x3) #変数を束ねる
#尤度の計算W <- matrix(1:N,N)R <- matrix(rep(0:0),2,2) #観測誤差diag(R) <- 1for(i in 1:N) W[i] <- exp( -1/2 * t( Z - H %*% XX[i,] ) %*% solve(R) %*% ( Z - H %*% XX[i,] ) ) W <- W/sum(W)
39
例題2:粒子フィルターのプログラミング基礎
#################################################################
>> 前頁の続き
#リサンプリング・サブルーチンresampling <- function(W){W.cum <- cumsum(W) #累積和sapply(runif(length(W)), function(x) which(x < W.cum)[1])
}
No.samp <- resampling(W)No <- c(1:N)TEST <- data.frame(No,XX,W) TEST.d2 <- TEST[No.samp, ]
#################################################################
40
例題2:粒子フィルターのプログラミング基礎
##################################################################描画
windows(height=10,width=10)frame()plot.new()par(mfrow=c(2,2))# グラフの外の余白par(oma = c(5, 5, 2, 2))# 上段と下段のグラフ間の余白(ピッタリくっつけるときは"0")par(mar = c(5, 5, 0, 0))
br <- c(0:20)/2hist(TEST.d2$x1,xlim=c(0,10),breaks=br,main="",xlab="x1",probability=T)lines(c(4.2,4.2),c(0,1),col=2)hist(TEST.d2$x2,xlim=c(0,10),breaks=br,main="",xlab="x3",probability=T)lines(c(4.6,4.6),c(0,1),col=2)hist(TEST.d2$x3,xlim=c(0,10),breaks=br,main="",xlab="x5",probability=T)lines(c(5.2,5.2),c(0,1),col=2)
XX <- cbind("x1"=TEST.d2$x1, "x2"=TEST.d2$x2, "x3"=TEST.d2$x3)
41
例題2:粒子フィルターのプログラミング基礎
x1
Den
sity
0 2 4 6 8 10 12
0.0
0.1
0.2
0.3
0.4
0.5
x2
Den
sity
0 2 4 6 8 10 12
0.0
0.1
0.2
0.3
0.4
0.5
x3
Den
sity
0 2 4 6 8 10 12
0.0
0.1
0.2
0.3
0.4
0.5
42
例題2:粒子フィルターのプログラミング基礎
0 2 4 6 8 10
02
46
810
X1
X3
0 2 4 6 8 10
02
46
810
X1
X5
0 2 4 6 8 10
02
46
810
X3
X5
これまでの演習の復習しながら
各自プログラミングしてみてください
43
例題3:粒子フィルターのプログラミング基礎非線形問題
21
21
21
22
12
11
752
xx
xx
xx
0.71420.5555
ˆ2
1
xx
x
44
例題3:粒子フィルターのプログラミング基礎非線形問題
#Zベクトルの生成Z <- c(2,5,7)
#粒子の数N <- 10000
#事前分布(一様乱数,0~5)x1 <- runif(N,0,5)x2 <- runif(N,0,5)XX <- cbind(x1,x2) #変数を束ねる
#尤度の計算W <- matrix(1:N,N)R <- matrix(rep(0:0),3,3) #観測誤差diag(R) <- 1
RES <- Z[1] - (1/x1+1/x2)RES <- cbind(RES,Z[2] - (2/x1+1/x2))RES <- cbind(RES,Z[3] - (2/x1+2/x2))
for(i in 1:N) W[i] <- exp( -1/2 * t( RES[i,] ) %*% solve(R) %*% ( RES[i,] ) ) W <- W/sum(W)
#################################################################No.samp <- resampling(W)No <- c(1:N)TEST <- data.frame(No,XX,W) TEST.d2 <- TEST[No.samp,]#################################################################
45
例題3:粒子フィルターのプログラミング基礎非線形問題
ans.x1 <- 0.5555ans.x2 <- 0.7142
windows(height=10,width=10)frame()plot.new()par(mfrow=c(2,2))# グラフの外の余白par(oma = c(5, 5, 2, 2))# 上段と下段のグラフ間の余白(ピッタリくっつけるときは"0")par(mar = c(5, 5, 0, 0))
br <- c(0:20)/4hist(x1,breaks=br,col=grey(0.5),border=F,probability=T,xlim=c(0,6),ylim=c(0,2),main="")hist(TEST.d2$x1,breaks=br,xlab="x1",probability=T,add=T)lines(c(ans.x1,ans.x1),c(0,2),col=2)
hist(x2,breaks=br,col=grey(0.5),border=F,probability=T,xlim=c(0,6),ylim=c(0,2),main="")hist(TEST.d2$x2,xlim=c(0,10),breaks=br,xlab="x3",probability=T,add=T)lines(c(ans.x2,ans.x2),c(0,2),col=2)
plot(TEST.d2$x1, TEST.d2$x2,xlim=c(0,2),ylim=c(0,2),xlab="X1",ylab="X2",col=grey(0.6),pch=19)points(ans.x1,ans.x2,col=2,pch=19)
46
例題3:粒子フィルターのプログラミング基礎非線形問題
21
21
21
22
12
11
752
xx
xx
xx
x1
Den
sity
0 1 2 3 4 5 6
0.0
0.5
1.0
1.5
2.0
x2
Den
sity
0 1 2 3 4 5 6
0.0
0.5
1.0
1.5
2.0
0.0 0.5 1.0 1.5 2.0
0.0
0.5
1.0
1.5
2.0
X1
X2
0.0 0.5 1.0 1.5 2.0
0.0
0.5
1.0
1.5
2.0
X1
X2
0.71420.5555
2ˆ 1
xx
x