2017-10-11 165 views
1

我想實現最小二乘法:最小二乘:Python的

我有:$ y = \ THETA \歐米茄$

的最小二乘解是\歐米茄=(\ THETA^{T】\ THETA)^ { - 1} \ THETA^{T】ý

我tryied:

import numpy as np  
def least_squares1(y, tx): 
     """calculate the least squares solution.""" 
     w = np.dot(np.linalg.inv(np.dot(tx.T,tx)), np.dot(tx.T,y)) 

     return w 

的問題是,這種方法很快變得不穩定 (對於小的問題它沒關係)

我意識到,當我比較了結果該最小二乘計算:

import numpy as np 
def least_squares2(y, tx): 
     """calculate the least squares solution.""" 
     a = tx.T.dot(tx) 
     b = tx.T.dot(y) 
     return np.linalg.solve(a, b) 

比較這兩種方法: 我試圖與,度12 [1 x的多項式擬合數據,的x^2,X^3中,x^4 ...,X^12]

第一種方法:

enter image description here

第二種方法:

enter image description here

你知道爲什麼第一個方法發散大型多項式?

P.S.如果您想測試這些功能,我只是爲了您的方便而添加了「像np一樣進口numpy」。

+1

你見過[numpy.linalg。lstsq](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.linalg.lstsq.html)? –

+0

@JonClements Thansk ...我改寫了我的問題 – james

+1

我的猜測是因爲'inv'函數沒有考慮到這個事實,即你所反轉的矩陣總是Hermitian,並且使用適用於算法的算法一般矩陣。 除了內置'lstsq'函數外,最好的辦法是使用Cholesky分解('cholesky')。 – Kevin

回答

3

有三點位置:

之一是,它是通常更好(更快,更準確)求解線性方程組,而不是計算逆。

第二個是,在計算解決方案時,使用關於方程組的系統(例如,係數矩陣是正定的),總是一個好主意,在這種情況下,您應該使用numpy.linalg.lstsq

第三個更具體地關於多項式。當使用單項式作爲基礎時,最終的係數矩陣條件很差,這意味着數值誤差往往很大。這是因爲,例如,向量x-> pow(x,11)和x-> pow(x,12)幾乎是平行的。如果您要使用正交多項式的基礎,例如https://en.wikipedia.org/wiki/Chebyshev_polynomialshttps://en.wikipedia.org/wiki/Legendre_polynomials

+0

即將寫出類似的答案。你的更好。然而,我不清楚你在第一點上試圖表達什麼。我對此並不熟悉。我認爲,當求解一組線性方程(矩陣)時,這意味着計算逆。因此,我不知道你會用什麼樣的操作來求解線性方程而不計算任何倒數? – henry

+1

@DoHe例如,如果P是psd,則它具有cholesky factorisation P = L * L',L下三角形。然後爲x求解P * x = y,首先求解z的L * z = y,然後求解x'的x'(這些需要不需要額外的內存,因爲解決方案可以在原地完成)求解三角形系統很容易。當你計算逆矩陣時,你正在有效地求解n個方程,P * f1 = e1,P * f2 = e2等等,然後當你將這個逆矩陣應用到rhs時,你就是在合併這些解。所以有兩個步驟,數值誤差將在這兩個步驟中積累。 – dmuir

+0

非常感謝您的回答! :) – james

0

我將改進之前所說的內容,您將得到更精確的擬合,並且能夠使用更高的度數。我回答了這個問題yesterday. 高階多項式的問題叫做Runge現象。人們使用被稱爲Hermite多項式的正交多項式的原因是他們試圖擺脫Gibbs phenomenon,這是傅立葉級數方法應用於非週期信號時的一種不利的振盪效應。

如果矩陣排名低的話,你可以在條件有限的情況下改進規則化方法,就像我在其他文章中所做的那樣。其他部分可能是由於矢量的光滑性質。