Peter教你談情說AI | 05用梯度下降法求線性迴歸模型

我們已經知道機器學習方式大體上分爲兩種類別:監督學習和非監督學習。

監督學習指的是人類給機器一大堆標示(label)過的數據,通常指機器通過學習一系列(, )數據,X代表輸入數據(特徵Feature),Y代表輸出數據,然後自我推導到X -> Y的公式,用於未來其他數據的預測判斷使用。監督學習根據輸出數據又分爲迴歸問題(Regression)和分類問題(Classfication)。迴歸問題通常輸出是一個連續的數值,分類問題的輸出是幾個特定的數值。

舉例如下:

(a) 迴歸問題 - 給定一張人臉照片,估計出這個人的年齡(年齡輸出是一個連續的數值)

(b) 分類問題 - 假定一個人患有腫瘤,判斷是爲惡性還是良性(惡性和良性的輸出是幾個特定的數值)

這裏我們先來看下回歸問題裏的線性迴歸模型。

線性迴歸

線性迴歸模型是:利用線性函數對一個或多個自變量 (x 或 (

))和因變量(y)之間的關係進行擬合的模型。即:

向量形式爲:

,其中

將訓練樣本的 x 逐個帶入後,得出的預測年薪 f(x)'與真實f(x)的差異越小越接近線性迴歸模型。怎麼衡量這個整體差距呢?我們用下面這個公式,我們把它叫做爲損失函數

形式如下:

那麼模型的優化目標爲最小化損失函數。要最小化損失函數,需要沿下降速度最快的方向走,使目標函數最小化。這就用到了上一節講過的算法:梯度下降法,來對其進行求解。

梯度下降法求解目標函數

舉例線性迴歸的目標函數爲:

對於 J(a,b) 而言,有兩個參數 a 和 b,函數 J 分別對自變量 a 和 b 取偏微分的結果是:

所以我們要做得是:

Step 1:任意給定 a 和 b 的初值,a = 0; b = 0;

Step 2:用梯度下降法求解 a 和 b,僞代碼如下:

當下降的高度小於某個指定的閾值(近似收斂至最優結果),則停止下降。

將上面展開的式子帶入上面代碼,就是:

所以梯度下降的通用形式

編寫線性迴歸訓練/預測程序

如果我們要用代碼實現線性迴歸程序應該怎樣做呢?當然,你可以按照上面的描述,自己從頭用代碼實現一遍。

不過,其實不必。因爲我們已經有很多現成的方法庫,可以直接調用了。最常見的是 sklearn 庫。

下面的舉個例子,表格中列舉了美國紐約若干程序員職位的年薪。

我們用前6個數據作爲訓練集,後面5個作爲測試集,來看看結果:

    import matplotlib.pyplot as plt
    import numpy as np
    from sklearn import datasets, linear_model
    from sklearn.metrics import mean_squared_error, r2_score

    experiences = np.array([0,1,2,3,4,5,6,7,8,9,10])
    salaries = np.array([103100, 104900, 106800, 108700, 110400, 112300, 114200, 116100, 117800, 119700, 121600])

    # 將特徵數據集分爲訓練集和測試集,除了最後5個作爲測試用例,其他都用於訓練
    X_train = experiences[:7]
    X_train = X_train.reshape(-1,1)
    X_test = experiences[7:]
    X_test = X_test.reshape(-1,1)

    # 把目標數據(特徵對應的真實值)也分爲訓練集和測試集
    y_train = salaries[:7]
    y_test = salaries[7:]

    # 創建線性迴歸模型
    regr = linear_model.LinearRegression()

    # 用訓練集訓練模型——看就這麼簡單,一行搞定訓練過程
    regr.fit(X_train, y_train)

    # 用訓練得出的模型進行預測
    diabetes_y_pred = regr.predict(X_test)

    # 將測試結果以圖標的方式顯示出來
    plt.scatter(X_test, y_test,  color='black')
    plt.plot(X_test, diabetes_y_pred, color='blue', linewidth=3)

    plt.xticks(())
    plt.yticks(())

    plt.show()

最終結果是這個樣子的:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章