scipyにおける最小二乗関数leastsqの使い方とその例の応用

1532 ワード

機械学習における最小二乗法は,誤差の二乗和を最小化することによって最適な整合関数を探すことと理解できる.一般的に曲線のフィットによく使用されます.
曲線のフィットについては,最適なk,bの値を求めて良い曲線を見つけて良い分類効果を実現することである.
一般的にフィットする曲線はk*x+b一次関数ですが、フィットする必要がある関数が一次関数でない場合は面倒です.pythonの科学計算パッケージscipyの中には、任意のフィットしたい関数のパラメータを求めることができる関数が提供されています.それはscipyです.optimizeパッケージのleastsq関数.関数プロトタイプは
leastsq(func, x0, args=(), Dfun=None, full_output=0, col_deriv=0, ftol=1.49012e-08, xtol=1.49012e-08, gtol=0.0, maxfev=0, epsfcn=0.0, factor=100, diag=None, warning=True)

一般的には、最初の3つのパラメータを指定すればいいです.
funcは私たちが定義した計算誤差の関数です
x 0は計算の初期パラメータ値です
argsはfuncを指定する他のパラメータです
簡単な適用例は次のとおりです.
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
from scipy.optimize import leastsq

##    (Xi,Yi),       (  )  
Xi=np.array([160,165,158,172,159,176,160,162,171])
Yi=np.array([58,63,57,65,62,66,58,59,62])

##       func :        k= 0.42116973935 b= -8.28830260655
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

#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)


#    
plt.figure(figsize=(8,6)) ##      : 8:6
plt.scatter(Xi,Yi,color="green",label="    ",linewidth=2) 

#     
x=np.linspace(150,190,100) ## 150-190   100    
y=k*x+b ##   
plt.plot(x,y,color="red",label="    ",linewidth=2) 
plt.legend() #    
plt.show()