學(xué)機器學(xué)習(xí)怎么可以不知道最小二乘法

起源

起源:最小二乘法源于天文學(xué)和大地測量學(xué)領(lǐng)域。因為這兩個領(lǐng)域?qū)鹊母咭蠖话l(fā)明。

1801年,意大利天文學(xué)家朱塞普·皮亞齊發(fā)現(xiàn)了第一顆小行星谷神星。進行了40天的跟蹤觀測后,但由于谷神星運行到太陽背后,失去了具體位置信息。隨后全世界的科學(xué)家利用皮亞齊的觀測數(shù)據(jù)開始尋找谷神星,但是根據(jù)大多數(shù)人計算的結(jié)果來尋找谷神星都沒有結(jié)果。時年24歲的高斯也計算了谷神星的軌道。奧地利天文學(xué)家海因里?!W伯斯根據(jù)高斯計算出來的軌道重新發(fā)現(xiàn)了谷神星。高斯使用的最小二乘法的方法發(fā)表于1809年他的著作《天體運動論》中,這個高斯正是著名數(shù)學(xué)家 卡爾·弗里德里希·高斯 ,沒錯就是我們大學(xué)數(shù)學(xué)認識的那個高斯。

image

機器學(xué)習(xí)本質(zhì)其實就是求最優(yōu)解的過程,最小二乘法是回歸算法中求最優(yōu)解的方法之一,還有一個是梯度下降法,以后會講~。

思考

我們在正式講最小二乘法之前,讀者大大們可以想下下面這個問題臨近中秋,小明想要自己做月餅,現(xiàn)在已知五種規(guī)格月餅所需的面粉重量如下:月餅重量(g)面粉重量(g)3020100818011019090220180現(xiàn)在小明想做規(guī)格為140g的月餅,請問他需要多少克月餅現(xiàn)在讀者大大們根據(jù)平時經(jīng)驗,可以思考下怎么求。九年義務(wù)教育讓我看見這種題目就條件反射列方程求未知數(shù),不知道讀者大大們是不是也是這樣~

原理

我們從另一個角度來看這個問題我們將這5個月餅用坐標(biāo)系標(biāo)出來,如下圖 然后我們先用畫出一條接近這5個點的線,假設(shè)線性關(guān)系為

image
image

是不是只要我們找出一條最接近這5個點的線就可以了,這樣算出來的值是最接近真實值的。

image

由圖可以得出,需要這條線跟這個5個點的誤差最小, 每個點跟線的誤差如下所示

image

因為誤差是長度,所以要算絕對值,計算起來不方便,用平方來替代

image

最后將所有誤差值累加得出

image

最小二乘法呼之欲出,這就是最小二乘法的原理了,即讓誤差的平方總和盡可能小。從求一條最接近這五個點的線的問題轉(zhuǎn)化成求最小化誤差的問題。

image

求解

那么怎么求呢,繼續(xù)以上面的為例子。這是一個二次函數(shù)。總誤差的平方:

image

根據(jù)多元微積分,當(dāng)

image

這個時候 ? 取得最小值,求的a,b的解為

image

a,b求出后,這條最接近的線也就出來了

image

進一步現(xiàn)在假設(shè)這條線是 二次函數(shù),結(jié)果怎樣

image

我們可以選擇不同的 f(x),根據(jù)最小二乘法得出不一樣的擬合函數(shù)。不過選擇f(x)還是不能太隨意,不然要么不準(zhǔn),要么容易過擬合。

代碼實現(xiàn)

整個思路如下

image

目標(biāo)函數(shù):代入生成的x,生成對應(yīng)的y

def real_func(x):
    return np.sin(2*np.pi*x)

隨機生成10個x進行實驗

x = np.linspace(0, 1, 10)

構(gòu)造多項式擬合函數(shù)

#多項式
def fit_func(p,x):
    """
    eg:p = np.poly1d([2,3,5,7])   

   print(p)==>>2x3 + 3x2 + 5x + 7   
    """
    f = np.poly1d(p)
    return f(x)

計算誤差

#殘差
def residuals_func(p, x, y):
    ret = fit_func(p, x) - y
    return ret

leastsq 是 scipy 庫 進行最小二乘法計算的函數(shù),也就是通過誤差函數(shù)以及數(shù)據(jù)點進行我們前面講的對參數(shù)進行求導(dǎo)操作,最后得出我們擬合出來的函數(shù)。

def fitting(M=0):
    """
    n 為 多項式的次數(shù)
    """    
    # 隨機初始化多項式參數(shù)
    #numpy.random.rand(d0)的隨機樣本位于[0, 1)之間。d0表示返回多少個
    p_init = np.random.rand(M+1) #生成M+1個隨機數(shù)的列表
    # 最小二乘法
    p_lsq = leastsq(residuals_func, p_init, args=(x, y)) # 三個參數(shù):誤差函數(shù)、函數(shù)參數(shù)列表、數(shù)據(jù)點
    print('Fitting Parameters:', p_lsq[0])
    
    # 可視化
    plt.plot(x_points, real_func(x_points), label='real')
    plt.plot(x_points, fit_func(p_lsq[0], x_points), label='fitted curve')
    plt.plot(x, y, 'bo', label='noise')
    plt.legend()
    return p_lsq
    
    # M=0
    p_lsq = fitting(M=0)
image

我們從一次函數(shù)依次增加項式,找到最合適的擬合曲線。

image

到9次的時候,已經(jīng)完全擬合這些點了 。

image

總結(jié)

我們可以看出,最小二乘法的原理其實非常簡單,運用起來也簡潔,應(yīng)用廣泛。但是它也有一定的局限性,比如如果擬合函數(shù)不是線性的,就無法用最小二乘法了。還有一點,本文講的最小二乘法是最簡潔的,但是它對噪聲的容忍度很低,容易造成過擬合,所以還需要加上正則化,這個有興趣的讀者可以了解下。最小二乘法運用誤差角度求最優(yōu)解的思路是我們機器學(xué)習(xí)中一個很經(jīng)典也很常用的思維方向之一,為學(xué)習(xí)機器學(xué)習(xí)打下一個好基礎(chǔ)。這也是把它放在我們的機器學(xué)習(xí)系列最開始的原因。

ps:需要完整代碼,關(guān)注公眾號,回復(fù)‘最小二乘法’獲得~

本文首發(fā)微信公眾號“哈爾的數(shù)據(jù)城堡”.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容