パターン認識と機械学習

最近、パターン認識機械学習を読み始めた。

なんか後輩がPythonで実際にコードを書いてるらしいので、自分も最小二乗法のコードを書いてみることにした。

最初はRubyで書く予定だったけど、せっかくだからRを使ってみようとか思い、ググりながらRで書いてみた。

# サインカーブを描く
x <- seq(0, 1, 0.01)
plot(x, sin(2*pi*x), type="l", xlim=c(0, 1), ylim=c(-1.2, 1.2), ann=F, col=2)

# サンプルをとる
N <- 10                 # 点の数
x <- (1:N)/N
y <- sin(2*pi*x) + 0.2*rnorm(N)

# サンプルを描画する
par(new=T)
plot(x, y, xlim=c(0, 1), ylim=c(-1.2, 1.2), ann=F, col=4)

M <- 3                 # フィットする多項式の次元

# 最小二乗法で多項式の係数を求める
A <- matrix(nrow=M+1, ncol=M+1)
for (i in 0:M) {
  for (j in 0:M) {
    A[i+1,j+1] <- sum(x^(i+j))
  }
}
Y <- matrix(nrow=M+1, ncol=1)
for (i in 0:M) {
  Y[i+1] <- sum(x^i * y)
}
w = solve(A, Y)

# できた多項式を描画する
x <- seq(0, 1, 0.005)
y <- c()
for (i in 1:length(x)) {
  y[i] <- sum(w * x[i]^(0:M))
}
par(new=T)
plot(x, y, type="l", xlim=c(0, 1), ylim=c(-1.2, 1.2), ann=F, col=3)

Rは初めてなので、これでいいのかすごく不安だけど、とりあえず以下の出力が得られたので満足。

出力

こんな出力になった。赤がもとのサインカーブで、青がサンプルの点、緑がフィットした関数。3つの図でノイズが違うのは仕様です^^;

M=2のとき

M=3のとき

M=8のとき