所謂的一元線性回歸其實(shí)就是找到一條直線,使得該條直線可以以最小的誤差(Loss)來逼近擬合訓(xùn)練數(shù)據(jù)
最小二乘法配合梯度下降算法,就是一個完整的線性回歸過程
本章知識點(diǎn):
1. 最小二乘法表示
2. 梯度下降法原理
3. 復(fù)合函數(shù)求導(dǎo)過程
下面假設(shè)我們有N個二維訓(xùn)練數(shù)據(jù)點(diǎn),我們的預(yù)測函數(shù)為h(x) = m * x + b

我們希望研究這群離散點(diǎn)的關(guān)系,我們不妨假設(shè)其關(guān)系是線性的,那么我們需要計(jì)算出一條直線L ,使得L距離每一個離散點(diǎn)都很近
最好的情況,我們希望所有的離散點(diǎn)都在L上,也就是滿足L的方程,但是一條直線去擬合所有的點(diǎn)肯定是不現(xiàn)實(shí)的(不可能所有的點(diǎn)都滿足線性關(guān)系)所以我們希望找到的L離所有的數(shù)據(jù)點(diǎn)盡可能的靠近,既找到每一個點(diǎn)(xi,yi)和L距離最小值 d = | yi - (m * xi + b)|,我們對N個d進(jìn)行求和,由最小二乘法來表示誤差函數(shù)為:

其中i表示第i個點(diǎn),N表示樣本總數(shù),我們將Loss求和平均來作為最終的損失:

現(xiàn)在我們有了預(yù)測函數(shù)h(x)和損失函數(shù)Loss,那么我們怎么求出這條直線L來最好的擬合數(shù)據(jù)集呢?
其實(shí)也就是求L損失函數(shù)的最小化誤差,這里一般有兩個方法
1. 求函數(shù)極值
我們把Loss看成由m和b組合的二元函數(shù),其中x,y,i,N均是已知的,那么求Loss最小值的問題就是求函數(shù)極值為題,利用基本的高數(shù)知識,我們需要求出每個變量的偏導(dǎo)數(shù),并求解這組方程組:

涉及簡單的復(fù)合函數(shù)求導(dǎo)和求和求導(dǎo),非?;A(chǔ)的高數(shù)知識,我們只要用數(shù)學(xué)知識直接解出m和b,就可以得到L的方程
但是這不是一個最可靠的方法,因?yàn)橛?jì)算機(jī)不適合直接求解數(shù)學(xué)方程的解,計(jì)算機(jī)是沒有學(xué)過高等數(shù)學(xué)的,它只知道基本的加減乘除(本質(zhì)上基于加法器實(shí)現(xiàn)),而計(jì)算機(jī)的計(jì)算能力非常出眾,遠(yuǎn)遠(yuǎn)超過人類,我們應(yīng)該從基本的數(shù)學(xué)定理的原理出發(fā)告訴計(jì)算機(jī)做某個基本的變化,讓其迭代更新,用計(jì)算量換取結(jié)果,所以我們應(yīng)該利用梯度下降法去逼近真實(shí)結(jié)果
2. 梯度下降法
這是一個非常神奇的算法,可以說沒有它,就沒有現(xiàn)在的深度學(xué)習(xí),幾乎所有的深度學(xué)習(xí)模型都會用到梯度下降算法,如最經(jīng)典的反向傳播算法,對所有參數(shù)使用梯度下降算法,使得神經(jīng)網(wǎng)絡(luò)模型的各個參數(shù)在訓(xùn)練數(shù)據(jù)上的損失函數(shù)盡可能小,也就是模型參數(shù)最合理,再一次的讓神經(jīng)網(wǎng)絡(luò)發(fā)生了質(zhì)變
其基本思想是:沿著損失(代價(jià))函數(shù)梯度下降的方向搜索極小值(同理也可以沿著梯度上升的方向搜索極大值)
我們設(shè)x表示方程中的變量參數(shù),J(x)表示在給定的參數(shù)取值下,訓(xùn)練數(shù)據(jù)集上損失函數(shù)的大小,那么整個優(yōu)化的過程可以抽象為尋找一個適合的參數(shù)x,使得J(x)最小,而目前沒有一個通用的方法可以對任意損失函數(shù)直接求解最佳的參數(shù)取值,而梯度下降算法會不斷迭代更新參數(shù)x,即讓參數(shù)x沿著總損失很小的方向去更新

從上圖中我們看到當(dāng)x = 3.5時(shí)候,J(x)取得最小值,而最低點(diǎn)左側(cè)的斜率是負(fù)值,另外一側(cè)斜率是正值,這是再好不過的收斂條件,我們只要沿著梯度的方向一點(diǎn)一點(diǎn)的下滑,下滑的過程就是求導(dǎo),下滑的次數(shù),就是迭代,而每次需要下滑多長,需要通過步長來決定,所以我們還需要定義一個步長表示每次下滑的距離
一般來說,我們也將步長叫做學(xué)習(xí)率,而如何加速算法收斂速度和防止收斂過程中發(fā)生震蕩,是一門值得研究的學(xué)問,有很多成熟的方法,如沖量策略,衰減因子策略等,這里不深入講解
現(xiàn)在定義了學(xué)習(xí)率和迭代次數(shù),我們就可以在迭代的過程中,一邊求梯度,一邊下滑更新參數(shù)了
很明顯,我們需要在滑動中更新參數(shù)m和參數(shù)b

因?yàn)樘荻却嬖诜较?,所以我們使用加號并不會影響參?shù)的更新
下面用python配合numpy模擬實(shí)現(xiàn)梯度下降算法過程


現(xiàn)在,我們利用梯度下降算法來優(yōu)化Loss函數(shù)后,也得到了相應(yīng)的m和b的值,那么也就找到了直線L = m*x + b,使得L以最小的誤差去擬合訓(xùn)練數(shù)據(jù)

代碼和測試數(shù)據(jù)見:一元線性回歸