最適化数学p140「入力誤差モデル」

入力誤差モデルについて
p140を参考にして書いた。
まぁサンプルと思ってください。

出力誤差モデル→入力x後に誤差が加わったのがyと解釈
入力誤差モデル→真の座標(x,y)にそれぞれ誤差が加わったと解釈

どっちが適切かは判断できない。まぁ解釈する側の問題なので。

以下モデル
 Ax_\alpha+By_\alpha+C=0

 x_\alpha=\bar{x}_\alpha+\epsilon_\alpha

 y_\alpha=\bar{y}_\alpha+\zeta_\alpha

#-*- coding:utf-8 -*-

import numpy as np
import pylab as pl

 
a=0 #平均
b=20 #分散1
c=20 #分散2
N=100 #サンプル数

#ノイズデータを出力
x_error=np.random.normal(a,b,N) 
y_error=np.random.normal(a,c,N)

#x,yの真の値を出力
xline=np.linspace(-N,N,N)
yline=np.linspace(-N,N,N)

#サンプルを作成
xline+=x_error
yline+=y_error

#作図
pl.plot(xline,yline,'r*')


#最小固有値ベクトルを求める
x1=np.sum(( xline - np.mean( xline ) )**2)
x2= np.sum( np.cov(xline-np.mean(xline),yline-np.mean(yline)) )
x3=np.sum(( yline - np.mean( yline ) )**2 )

#二次形式を最小にする単位ベクトルをMから求める
M=np.array([[x1,x2],[x2,x3]])
la,v=np.linalg.eig(M)

#最小固有値の単位固有値ベクトルを求める
v=np.transpose(v)[min(la)==la]

#A,Bは単位固有値ベクトルの1,2である
A=v[0][0]
B=v[0][1]
C=-A*np.mean(xline)-B*np.mean(yline)

#真の線を描く
xline=np.linspace(-N,N,N)
yline= -(A*xline+C)/B
pl.plot(xline,yline,'b')

pl.show()

ときどきうまくいかないんだけど、これはボクのコードのせいなのか
方法論的な問題なのかようわかりません。

次回はEMアルゴリズムを使って教師なし学習ベイズ線形回帰モデルを実装する予定。