Pythonで最小二乗法の使い方
「実装」ではなく「使用」と言うのは、pythonの関連クラスライブラリが具体的なアルゴリズムを実装してくれているため、使用をマスターすればよいからです.テクノロジーの習得と蓄積に伴い,クラスライブラリ内のアルゴリズムが自分のニーズを満たすことができなくなった場合にも,独自の方法で様々なアルゴリズムを実現することを試みることができる.
本題に戻ると、「最小二乗法」とは何か.
定義:最小二乗法(最小二乗法とも呼ばれる)は、誤差の二乗を最小化し、データの最適関数マッチングを探す数学的最適化技術である.
役割:最小二乗法を用いて未知のデータを簡便に求めることができ、これらの求めたデータと実際のデータとの誤差の二乗和を最小にすることができる.
原則:「残差二乗と最小」で直線位置を決定する(数理統計では、残差は実際の観察値と推定値の差を指す)
基本構想:一元線形回帰モデルに対して,全体からn群の観察値(X 1,Y 1),(X 2,Y 2),…,(Xn,Yn)が得られたと仮定すると,平面中のこのn点に対して無数の曲線を用いてフィットすることができる.線形回帰とは、サンプル回帰関数がこの値のセットをできるだけよくフィットすることを要求することであり、すなわち、この直線はできるだけサンプルデータの中心位置にあるべきである.従って、最適フィット曲線を選択する基準は、総フィット誤差(すなわち、総残差)を最小にすることとして決定することができる.
実装コードは次のとおりです.コードにはコメントが詳細に記載されています.
結果は次のとおりです.
出力結果:
k= 0.900458420439 b= 0.831055638877 cost:1 解のフィット直線は次のとおりです. y=0.9x+0.83
図面の結果:
本題に戻ると、「最小二乗法」とは何か.
定義:最小二乗法(最小二乗法とも呼ばれる)は、誤差の二乗を最小化し、データの最適関数マッチングを探す数学的最適化技術である.
役割:最小二乗法を用いて未知のデータを簡便に求めることができ、これらの求めたデータと実際のデータとの誤差の二乗和を最小にすることができる.
原則:「残差二乗と最小」で直線位置を決定する(数理統計では、残差は実際の観察値と推定値の差を指す)
基本構想:一元線形回帰モデルに対して,全体からn群の観察値(X 1,Y 1),(X 2,Y 2),…,(Xn,Yn)が得られたと仮定すると,平面中のこのn点に対して無数の曲線を用いてフィットすることができる.線形回帰とは、サンプル回帰関数がこの値のセットをできるだけよくフィットすることを要求することであり、すなわち、この直線はできるだけサンプルデータの中心位置にあるべきである.従って、最適フィット曲線を選択する基準は、総フィット誤差(すなわち、総残差)を最小にすることとして決定することができる.
実装コードは次のとおりです.コードにはコメントが詳細に記載されています.
## import numpy as np ##
import scipy as sp ## numpy import matplotlib.pyplot as plt ## from scipy.optimize import leastsq ## '''
, '''## (Xi,Yi), ( ) Xi=np.array([6.19,2.51,7.29,7.01,5.7,2.66,3.98,2.5,9.1,4.2])
Yi=np.array([5.25,2.83,6.41,6.71,5.1,4.23,5.05,1.98,10.5,6.3])'''
:
1.
2. ( 、 、 )'''## func : def func(p,x):
k,b=p return k*x+b## :x,y : x,y Xi,Yi def error(p,x,y): return func(p,x)-y'''
:
1.leastsq tuple, , ( )
2. ( ):Value of the cost function at the solution
3. :Para=>(array([ 0.61349535, 1.79409255]), 3)
4. '''#k,b , , , p0 cost :Para[1]p0=[1,20]# error p0 args ( )Para=leastsq(error,p0,args=(Xi,Yi))# k,b=Para[0]print("k=",k,"b=",b)print("cost:"+str(Para[1]))print(" :")print("y="+str(round(k,2))+"x+"+str(round(b,2)))'''
, .
matplotlib ,label
, '''# plt.figure(figsize=(8,6)) ## : 8:6plt.scatter(Xi,Yi,color="green",label=" ",linewidth=2)
# x=np.linspace(0,12,100) ## 0-15 100 y=k*x+b ## plt.plot(x,y,color="red",label=" ",linewidth=2)
plt.legend() # plt.show()
結果は次のとおりです.
出力結果:
k= 0.900458420439 b= 0.831055638877 cost:1 解のフィット直線は次のとおりです. y=0.9x+0.83
図面の結果: