機器學習 - 線性回歸梯度下降推導

樣本 x 有 m 個屬性
多元線性回歸

  • 線性回歸模型函數(shù)
    \begin{align} y & = w_0x_0 + w_1x_1 + \dots + w_mx_m \\ & = \sum_{i = 0}^mw_ix_i \\ & = \mathbf{w}^T\mathbf{x} \end{align}
  • 模型參數(shù)
    \mathbf{w}^T = \begin{bmatrix} w_0 & \dots & w_m \end{bmatrix}_{1 \times(m+1)}
  • 屬性(特征值)列表
    \mathbf{x} = \begin{bmatrix} x_0 \\ \vdots \\ x_m \end{bmatrix}_{(m+1) \times 1}
    其中:
    x_0 = 1是線性回歸的截距的權(quán)重式曲,恒定為1
  • 代價函數(shù)
    \mathbf{J}(\mathbf{w}) = \frac{1}{2}\sum_{i = 1}^{n}(y^{(i)} - \hat{y}^{(i)})^2
    其中:
    \mathbf{J}(\mathbf{w})表示\mathbf{J}是關(guān)于參數(shù)\mathbf{w}的函數(shù)
    n 表示一共有n個樣本數(shù)據(jù)
    y^{(i)} 為第i個樣本對應的真實值
    \hat{y}^{(i)} 為第i個樣本通過預測函數(shù) \hat{y} = \mathbf{w}^T\mathbf{x}計算得到的預測值
    \frac{1}{2}是為了推導方便而添加的常量

梯度下降法

  • 求當前\mathbf{w}的梯度需要求得\mathbf{w}w_j(j\in[0, m])的偏導數(shù)
    \begin{align} \frac{\partial{\mathbf{J(\mathbf{w})}}}{\partial{w_j}} & = \frac{1}{2}\sum_{i = 1}^{n}\frac{\partial}{\partial{w_j}}[(y^{(i)} - \hat{y}^{(i)})^2] \\ & = \sum_{i = 1}^{n}(y^{(i)} - \hat{y}^{(i)})\frac{\partial}{\partial{w_j}}(y^{(i)} - \hat{y}^{(i)}) \\ & = \sum_{i = 1}^{n}(y^{(i)} - \hat{y}^{(i)})(-x_j^{(i)}) \\ & = -\sum_{i = 0}^{n}x_j^{(i)}(y^{(i)} - \hat{y}^{(i)}) \end{align}
    其中:
    x_j^{(i)} 表示第i個樣本的第j個特征值
  • 由于我們的目的是讓代價函數(shù)\mathbf{J}(\mathbf{w})取得極小值臀玄,于是需要讓參數(shù)\mathbf{w}往負梯度的方向更新蔗草,從而讓代價函數(shù)\mathbf{J}(\mathbf{w})取值變小
  • 參數(shù)每次更新需要一個正數(shù)步長\eta(可以為0.001两踏、0.0001)來確定每次參數(shù)更新的速度
  • 參數(shù)的負增量:\begin{align} \Delta\mathbf{w}_j & = -\eta\frac{\partial\mathbf{J}(\mathbf{w})}{\partial{w_j}} \\ & = \eta\sum_{i = 0}^{n}x_j^{(i)}(y^{(i)} - \hat{y}^{(i)}) \\ \end{align}

梯度下降法過程:
1.初始化權(quán)重\mathbf{w}
2.使用代價函數(shù)計算代價
3.計算梯度节沦,使用\mathbf{w} +=\Delta\mathbf{w}更新權(quán)重\mathbf{w}
4.若代價值小于某一閾值(或訓練某個次數(shù))則停止訓練
5.得到權(quán)重\mathbf{w}

以下是使用Python實現(xiàn)線性回歸的類

import numpy as np
class LinearRegressionLM(object):
    # 初始化(
    # eta -> 初始化學習率
    # n_iter -> 訓練次數(shù) 
    def __init__(self, eta=0.001, n_iter=20):
        self.eta = eta
        self.n_iter = n_iter
    # 訓練
    # X -> 訓練的所有樣本(n+1)xm
    # y -> 訓練樣本的真實值(n+1)x1
    def fit(self, X, y):
        # 初始化權(quán)重w_
        self.w_ = np.zeros(1 + X.shape[1])
        # 初始化代價
        self.cost_ = []
        
        for i in range(self.n_iter):
            # 得到預測值
            output = self.net_input(X)
            # 得到殘差值
            errors = (y - output)
            # 更新第 0 個權(quán)重(這個比較特殊)
            self.w_[0] += self.eta * errors.sum()
            # 更新第 1...m個權(quán)重
            self.w_[1:] += self.eta * X.T.dot(errors)
            # 計算代價值
            cost = (errors**2).sum() / 2.0
            # 存儲代價值
            self.cost_.append(cost)
        return self
    # 使用現(xiàn)有的權(quán)重w_得到預測值
    def net_input(self, X):
        return np.dot(X, self.w_[1:]) + self.w_[0]
    # 預測
    def predict(self, X):
        return self.net_input(X)

注解:

# 更新第 0 個權(quán)重(這個比較特殊)
self.w_[0] += self.eta * errors.sum()

推導過程:
\begin{align} \Delta\mathbf{w}_0 & = \eta\sum_{i = 0}^nx_0^{(i)}(y^{(i)} - \hat{y}^{(i)}) \\ & = \eta\sum_{i = 0}^n(y^{(i)} - \hat{y}^{(i)}) \\ \end{align}

關(guān)于這行代碼

# 更新第 1...m個權(quán)重
self.w_[1:] += self.eta * X.T.dot(errors)

為什么是X的轉(zhuǎn)置點乘殘差值碘橘?以下是推導過程

由參數(shù)的負增量:\begin{align} \Delta\mathbf{w}_j & = -\eta\frac{\partial\mathbf{J}(\mathbf{w})}{\partial{w_j}} \\ & = \eta\sum_{i = 0}^{n}x_j^{(i)}(y^{(i)} - \hat{y}^{(i)}) \\ \end{align}

注意:代碼中\Delta\mathbf{w}不包括\Delta\mathbf{w}_0福澡,\Delta\mathbf{w}_0另外計算
\Delta\mathbf{w} = \begin{bmatrix} \Delta\mathbf{w}_1 \\ \vdots \\ \Delta\mathbf{w}_m \\ \end{bmatrix} = \eta \begin{bmatrix} \sum_{i = 0}^{n}x_1^{(i)}(y^{(i)} - \hat{y}^{(i)}) \\ \vdots \\ \sum_{i = 0}^{n}x_m^{(i)}(y^{(i)} - \hat{y}^{(i)}) \\ \end{bmatrix}
= \eta \begin{bmatrix} \sum_{i = 0}^{n}x_1^{(i)}(y^{(i)} - \hat{y}^{(i)}) \\ \vdots \\ \sum_{i = 0}^{n}x_m^{(i)}(y^{(i)} - \hat{y}^{(i)}) \\ \end{bmatrix}
=\eta \begin{bmatrix} x_1^{(0)}(y^{(0)} - \hat{y}^{(0)}) + \dots + x_1^{(n)}(y^{(n)} - \hat{y}^{(n)})\\ \vdots \\ x_m^{(0)}(y^{(0)} - \hat{y}^{(0)}) + \dots + x_m^{(n)}(y^{(n)} - \hat{y}^{(n)})\\ \end{bmatrix}_{m\times1}
= \eta \begin{bmatrix} x_1^{(0)} \dots x_1^{(n)} \\ \vdots \\ x_m^{(0)} \dots x_m^{(n)} \\ \end{bmatrix}_{m\times(n+1)} \begin{bmatrix} (y^{(0)} - \hat{y}^{(0)}) \\ \vdots \\ (y^{(n)} - \hat{y}^{(n)}) \\ \end{bmatrix}_{(n+1)\times1}
= \eta \begin{bmatrix} x_1^{(0)} \dots x_m^{(0)} \\ \vdots \\ x_1^{(n)} \dots x_m^{(n)} \\ \end{bmatrix}_{(n+1)\times{m}}^T \begin{bmatrix} (y^{(0)} - \hat{y}^{(0)}) \\ \vdots \\ (y^{(n)} - \hat{y}^{(n)}) \\ \end{bmatrix}_{(n+1)\times1}
實際上就是代碼中

= self.eta * X.T.dot(errors)

******** 以下是代碼實踐 ********

1.初始化隨機線性回歸數(shù)據(jù)(每個樣本只取一個屬性)

from sklearn.datasets import make_regression
import matplotlib.pyplot as plt

X, y, eof = make_regression(n_samples=1000, n_features=1, noise=40, coef=True, random_state=14)
plt.scatter(X, y, c='r', s=3)
隨機數(shù)據(jù).png

2.初始化線性回歸的類阔籽,開始訓練

linearRegressionLM = LinearRegressionLM()
linearRegressionLM.fit(X, y)
print('訓練參數(shù) = ' , linearRegressionLM.w_)

訓練參數(shù) = [ 0.70041376 76.66596196]

3.繪制回歸線

x_line = np.linspace(-3, 3, 20)
print(x_line.shape)
print(type(x_line))
x_line_ones = np.ones((x_line.shape[0], 1))
# 添加每個樣本的 x_0 = 1
x_line_all = np.column_stack((x_line_ones, x_line))
y_line = np.dot(x_line_all, linearRegressionLM.w_)
plt.scatter(X, y, c='r', s=3)
plt.plot(x_line, y_line, color='blue')
回歸線.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末流妻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子笆制,更是在濱河造成了極大的恐慌绅这,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件在辆,死亡現(xiàn)場離奇詭異证薇,居然都是意外死亡,警方通過查閱死者的電腦和手機匆篓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門浑度,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鸦概,你說我怎么就攤上這事箩张。” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵伏钠,是天一觀的道長横漏。 經(jīng)常有香客問我,道長熟掂,這世上最難降的妖魔是什么缎浇? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮赴肚,結(jié)果婚禮上素跺,老公的妹妹穿的比我還像新娘。我一直安慰自己誉券,他們只是感情好指厌,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著踊跟,像睡著了一般踩验。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上商玫,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天箕憾,我揣著相機與錄音,去河邊找鬼拳昌。 笑死袭异,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的炬藤。 我是一名探鬼主播御铃,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沈矿!你這毒婦竟也來了上真?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤细睡,失蹤者是張志新(化名)和其女友劉穎谷羞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溜徙,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡湃缎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蠢壹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗓违。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖图贸,靈堂內(nèi)的尸體忽然破棺而出蹂季,到底是詐尸還是另有隱情冕广,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布偿洁,位于F島的核電站撒汉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涕滋。R本人自食惡果不足惜睬辐,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宾肺。 院中可真熱鬧溯饵,春花似錦、人聲如沸锨用。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽增拥。三九已至啄巧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跪者,已是汗流浹背棵帽。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留渣玲,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓弟晚,卻偏偏與公主長得像忘衍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卿城,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容