各点からの距離の二乗が最小になる直線を引く
直線の式、y=ax+b
i 番目の点の座標を(xi,yi)とすると、
i番目の点と直線の距離は、
(yi-(axi+b))2とかける。これの∑をとって、それを最小にします。
ここでxは説明変数説明変数(explanatory variable)、yは目的変数(objective variable) といいます。
3つの解き方で試します。
その1 一般的な解き方。For loop を使ったもの
import matplotlib.pyplot as plt
xval=[2,4,6]
yval=[3,4,7]
s_min=1000
s_min_a=-5
s_min_b=-5
for b in [i/100 for i in range(11*100)]:
for a in [i/100 for i in range(11*100)]:
s=0
for i in range(len(xval)):
s=s+(yval[i]-(a*xval[i]+b))**2
if s_min>s:
#sが一番小さいならば
s_min_a=a
s_min_b=b
s_min=s
print("y=",s_min_a,"x+",s_min_b)
#-------------------------------------
#ここからグラフ化
plt.figure(dpi=150)
plt.scatter(xval,yval)
y_line=[]
for xi in xval:
y_line.append(s_min_a*xi+s_min_b)
plt.plot(xval,y_line)
plt.show()

次に別の方法での解放を示します。。。

コメント