python實現線性迴歸.md
python實現線性迴歸
一、相關數學推導
1.問題描述
所謂線性迴歸,就是給你一批資料比如房子的面積以及房子的價格,然後你所做的就是找到一條線能儘量的擬合這一批資料。如下所示。
其中紅色點就是給出的資料集合,有size代表面積,而price代表價格,紅色點點就代表實際統計的資料,而線性迴歸的目的就在於找到那條最好的綠色直線,能使得這個綠色直線與所有紅色點的差距最小。
2. 誤差函式引出
上面可以看出我們要找到一條綠色的直線來擬合紅色的點,在這裡我假設這條綠色直線為: ,這個函式也叫做假設函式,因為這條是我假設出來的,那麼這個假設函式和真正的資料的距離可以使用歐式距離表示出來(當然你也可以使用其他的方式表示) ,這裡計算的就是所有樣本點的誤差值,其中m代表所有紅色點的個數,而 代表著第i個樣本數,也就是第i個紅色點的橫座標以及縱座標,在有了上面的引入後,自然而然就得到了相應的誤差函式為 其中 ,所以我們現行迴歸的問題本質就是找到對應的 使得 最小化。
3. 梯度下降法
在求解最小化的過程中有一種方法叫做梯度下降法。讓我們先看一下簡單的梯度下降的過程,假如現在誤差函式為 ,假如目前我們 的初始化為2,那麼梯度下降的方式就是按照斜率(導數)的方向向下走,即 ,其中 代表學習率,你可以看做每次減小是的步長,如果 比較大那麼下降會快,小的話下降會慢,對於這個例子來說就是 ,如果我們取 那麼經過這個梯度下降後 更新為0.8,而根據 的影象我們可以看出 是在朝著最低點的方向走去。
4. 對我們的誤差函式進行梯度下降
在有了2、3的結論下,我們就可以對我們的誤差函式進行梯度下降了,這樣通過多次的迭代我們就能找到相應的 是的我們的誤差函式最小。
所以剩下的事情就是求出來 對 的導數,這裡需要高等數學的知識,在這裡直接給出結論。
藍色框中的內容就是 對 的偏導數,而前面 對應還是學習率。
5.問題矩陣化
其實在有了4的結論我們就可以直接程式設計了,但是由於更新 的時候兩個式子不同,並且裡面還有累加,所以導致我們計算不方便,所以這裡就把整個問題矩陣話,這樣的話我們使用python編寫程式就可以直接使用numpy進行矩陣操作,而不使用for迴圈,並且還可以通過小技巧是的兩個更新只變成一個矩陣的更新。
在這裡我們把所有的樣本紅色點的 變成一個 的向量 ,每一行代表相應紅色點的size ,同樣的把 也變成一個 的向量 ,而把 變成一個2*1的列向量 ,這樣就發生一個有趣的事情,你會發現給 左邊進行擴充一列1,那麼你用 後得到一個 的向量,這個向量的每一行其實就是 也就是我們上面所謂的假設函式,在這裡我們通過矩陣你發現可以一次性計算出m個假設函式,並且通過矩陣化給 擴充一列,就能消除