這裡展示利用python實現的最小二乘的直接求解方法。其求解原理,請參考:最小二乘法擬合非線性函式及其matlab/excel 實現
1.一般曲線擬合
**如下:
#結果圖示-*- coding:utf-8 -*-
'''created on feb 20, 2017
最小二乘擬合 給定的函式 fit_fun(x)
已知資料x(2xn),y(1xn),可直接計算直線的引數a和b
直接計算的公式:ab = inv(xxt)*x*yt
@author: xiankai chen
@email: [email protected]
'''import
numpy as np
import
matplotlib.pyplot as plt
deffun2ploy(x,n):
'''資料轉化為[x^0,x^1,x^2,...x^n]
'''lens =len(x)
x = np.ones([1,lens]);
for i in range(1,n):
x =np.vstack((x,np.power(x,i)))
return
x def
leastseq_byploy(x,y,ploy_dim):
'''最小二乘求解
'''#
散點圖 plt.scatter(x,y,color="
r",marker='
o',s = 50)
x =fun2ploy(x,ploy_dim);
#直接求解
xt =x.transpose();
xxt=x.dot(xt);
xxtinv =np.linalg.inv(xxt)
xxtinvx =xxtinv.dot(x)
coef =xxtinvx.dot(y.t)
y_est =xt.dot(coef)
return
y_est,coef
deffit_fun(x):
'''要擬合的函式
'''#
return np.power(x,5)
return
np.sin(x)
#return 5*x+3
if__name__ == '
__main__':
data_num = 100;
ploy_dim =10;
noise_scale = 0.2;
## 資料準備
x = np.array(np.linspace(-2*np.pi,2*np.pi,data_num))
y = fit_fun(x)+noise_scale*np.random.rand(1,data_num)
#最小二乘擬合
[y_est,coef] = leastseq_byploy(x,y,10)
#顯示擬合結果
org_data = plt.scatter(x,y,color="
r",marker='
o',s = 50)
est_data = plt.plot(x,y_est,color="
b",linewidth= 3)
plt.xlabel("x
")plt.ylabel("y
")plt.title(
"fit funtion with leastseq method")
plt.legend([
"noise data
","fited function
"]);
plt.show()
當維度增加求解矩陣的你運算會消耗較大的計算資源,通常採用梯度下降法,牛頓法等數值迭代演算法進行求解。
Python知識 7 最小二乘求解
這裡展示利用python實現的最小二乘的直接求解方法。其求解原理,請參考 最小二乘法擬合非線性函式及其matlab excel 實現 1.一般曲線擬合 如下 coding utf 8 created on feb 20,2017 最小二乘擬合 給定的函式 fit fun x 已知資料x 2xn y ...
線性回歸 最小二乘求解
線性回歸 線性回歸用於數值 它的主要思想是利用預定的權值將屬性進行線性組合來表示類別 y w0 w1x1 w2x2 wnxn 其中,y是類別屬性值,x1,x2,xn是一般屬性值,w1,w2,xn是權值,w0稱為偏置,類似於一元線性回歸y ax b中b。求解線性回歸就是通過已知的一些資料點 1,xi1...
原 python最小二乘
import numpy as np from scipy.optimize import leastsq 取樣點 xi,yi xi np.array 8.19,2.72,6.39,8.71,4.7,2.66,3.78 yi np.array 7.01,2.78,6.47,6.71,4.1,4.23...