python:最小二乘法拟合原理及代码实现
這里寫(xiě)目錄標(biāo)題
- 原理
- 代碼實(shí)現(xiàn)
原理
最小二乘法適用于對(duì)處理的一堆數(shù)據(jù),不必精確的經(jīng)過(guò)每一點(diǎn),而是根據(jù)圖像到每個(gè)數(shù)據(jù)點(diǎn)的距離和最小確定函數(shù)。需要注意的是,最小二乘是對(duì)全局進(jìn)行擬合優(yōu)化,對(duì)噪聲比較敏感,所以如果有噪聲比較大的觀測(cè)值會(huì)影響擬合結(jié)果,此時(shí)建議用RANSAC算法擬合。
最小二乘法逼近的最簡(jiǎn)單的例子是根據(jù)一組觀測(cè)值對(duì)(x1,y1),(x2,y2)…(xn,yn)來(lái)擬合一條直線。
對(duì)于y=a0+a1x+ey=a_{0} + a_{1}x + ey=a0?+a1?x+e,在一組觀測(cè)數(shù)據(jù)中擬合最好的模型,即使得殘差eee的平方和最小。分別對(duì)a0、a1a_{0}、a_{1}a0?、a1?求偏導(dǎo),可得:
∑i=1na0+∑i=1nxia1=∑i=1nyi∑i=1nxia0+∑i=1nxi2a1=∑i=1nxiyi\begin {matrix} \displaystyle\sum_{i=1}^na_{0} + \displaystyle\sum_{i=1}^nx_{i}a_{1} = \displaystyle\sum_{i=1}^ny_{i} \\ \displaystyle\sum_{i=1}^nx_{i}a_{0} + \displaystyle\sum_{i=1}^nx_{i}^2a_{1} = \displaystyle\sum_{i=1}^nx_{i}y_{i} \end {matrix} i=1∑n?a0?+i=1∑n?xi?a1?=i=1∑n?yi?i=1∑n?xi?a0?+i=1∑n?xi2?a1?=i=1∑n?xi?yi??
則:
a1=n∑i=1nxiyi?∑i=1nxi∑i=1nyin∑i=1nxi2?(∑i=1nxi)2a_{1} = \cfrac {n\sum_{i=1}^nx_{i}y_{i} - \sum_{i=1}^n x_{i}\sum_{i=1}^n y_{i}}{n \sum_{i=1}^n x_{i}^2 - (\sum_{i=1}^n x_{i})^2}\\ a1?=n∑i=1n?xi2??(∑i=1n?xi?)2n∑i=1n?xi?yi??∑i=1n?xi?∑i=1n?yi??
a0=yˉ?a1xˉa_{0} = \text{\={y}} - a_{1}\text{\={x}} a0?=yˉ??a1?xˉ
對(duì)n次多項(xiàng)式同樣適用。
代碼實(shí)現(xiàn)
def leastsq_fit(points:np.ndarray):points_size = len(points)points_sum = np.sum(points, axis=0)sum_xy = np.sum(points[:, 0] * points[:, 1], axis=0)sum_x = points_sum[0]sum_y = points_sum[1]sum_sqare_x = np.sum(points ** 2, axis=0)[0]average_x = sum_x / points_sizeaverage_y = sum_y / points_sizek = (points_size*sum_xy - sum_x*sum_y)/(points_size*sum_sqare_x - sum_x*sum_x)b = average_y - average_x*kbest_model = np.zeros((2, 1), dtype=np.float32)best_model[0, 0] = bbest_model[1, 0] = kreturn best_model矩陣形式參考我另外的博客鏈接1,鏈接2
def leastsq_mutifunc(x, y, m):"""多項(xiàng)式最小二乘法實(shí)現(xiàn), 矩陣形式:param x:輸入:param y:目標(biāo)輸出:param m:多項(xiàng)式階數(shù):return:多項(xiàng)式系數(shù)"""x = np.array(x)y = np.array(y)assert m <= x.shape[0], f"the number of m({m}) need less than x's size({x.shape[0]})"assert x.shape[0] == y.shape[0], f"the size of x({x.shape[0]}) must equal to y's size({y.shape[0]}"x_mat = np.zeros((x.shape[0], m+1))for i in range(x.shape[0]):x_mat_h = np.zeros((1, m+1))for j in range(m+1):x_mat_h[0][j] = x[i] ** (m-j)x_mat[i] = x_mat_htheta = np.dot(np.dot(np.linalg.inv(np.dot(x_mat.T, x_mat)), x_mat.T), y.T)return theta參考鏈接1
參考鏈接2
參考鏈接3
總結(jié)
以上是生活随笔為你收集整理的python:最小二乘法拟合原理及代码实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: EXSI搭建流程
- 下一篇: Python股票数据处理的一些代码细节