最近看了一本線性代數,如下圖這個樣的。。。比較討厭的是這本書的排版賊難受,定義和定理加粗基本和沒加一樣,排版也過於緊密,看起來一度想棄書。
重點不在這里,哈哈哈哈。
這幾天看完線代后,有一個粗略的理解后,菜雖然菜,但我還是想要倒騰倒騰。想起之前學過的最小二乘法,不過是一個二階的最小二乘法,也擼了代碼。但是學過線代后總是抑制不住體內的洪荒。。。(上個廁所去)
N階線性方程如下:
然后根據線性方程的最小二乘法來進行計算,首先寫出損失函數,設有一個樣本容量為k的樣本,使用n階函數(共有n+1個系數)去擬合,損失函數為L(xi)。
解釋下:使用樣本中的數值yi減去理論數值f(xi)所獲得的差的平方。這樣就能獲得樣本與理論的差的平方,我們的目的是想讓每個差值可能的最小,也就是理論函數越接近樣本。
現在需要把所有的樣本都進行該處理,並將所有的L(xi)進行求和處理獲得L函數。
那么接下來討論目標,目標是為了盡可能使L最小,那么在函數中取得最小值應該是導數為0的位置,而這里是多元函數,那么我們需要進行偏導處理。
在此,我們先確定未知量與已知量,這里yi和xi是作為已知量,而a0, a1,a2.......an是作為未知量。
那么開始求偏導(注意數學基礎,復合函數求偏導):
好的,相信大家已經找出了規律來了。
那么通用公式是:
通共有N+1(注意n從0開始)個方程,我們再修改下方程,使其符合AX=B,注意這里A,X,B為矩陣:
不妨設:
那么相對應的矩陣為:
那么接下來就是求解線性方程了!
要求解AX=B方程,首先,我們得對方程的系數矩陣進行處理,使其成為上三角或者下三角,比如化成上三角,那么我們可以通過最后一個數據X′n+1·n+1×an=yixin,解出后進行遞歸處理出前面的元素:
在此,使用的是高斯消元法來進行處理的,但注意高斯消元法中,使用某行去消去其他行的該行對角線上元素不能為0。當然也可以使用其他的比如LU法,雅克比法。
最后,代碼自己使用C語言打的,放最后貼出。我們取一組數據來驗證下程序:
代碼下載鏈接:https://files.cnblogs.com/files/inkhearts/multi_least_square_method.rar