一、線性回歸實驗目標
算法推導過程中已經給出了求解方法,基於最小乘法直接求解,但這並不是機器學習的思想,由此引入了梯度下降方法。
實驗主要內容:
(1)線性回歸方程實現
(2)梯度下降效果
(3)對比不同梯度下降測量
(4)建模曲線分析
(5)過擬合與欠擬合
(6)正則化的作用
(7)提前停止策略
二、實驗步驟
首先准備環境,配置畫圖參數,過濾警告。
import numpy as np import os import warnings import matplotlib import matplotlib.pyplot as plt # 畫圖參數設置 plt.rcParams['axes.labelsize'] = 14 plt.rcParams['xtick.labelsize'] = 12 plt.rcParams['ytick.labelsize'] = 12 # 過濾警告 warnings.filterwarnings('ignore')
構造數據點(樣本):
# 通過rand函數可以返回一個或一組服從“0~1”均勻分布的隨機樣本值。隨機樣本取值范圍是[0,1),不包括1 X = 2 * np.random.rand(100, 1) # 構造線性方程,加入隨機抖動 # numpy.random.randn()是從標准正態分布中返回一個或多個樣本值 # 1.當函數括號內沒有參數時,返回一個浮點數; # 2.當函數括號內有一個參數時,返回秩為1的數組,不能表示向量和矩陣 # 3.當函數括號內有兩個及以上參數時,返回對應維度的數組,能表示向量或矩陣。np.random.randn(行,列) # 4.np.random.standard_normal()函數與np.random.randn類似,但是輸入參數為元組(tuple) y = 3*X + 4 + np.random.randn(100, 1) plt.plot(X, y, 'b.') # b指定為藍色,.指定線條格式 plt.xlabel('X_1') plt.ylabel('y') # 設置x軸為0-2,y軸為0-15 plt.axis([0, 2, 0, 15]) plt.show()
執行顯示數據點如下所示:
1、線性回歸方程實現
"""線性回歸方程實現""" # numpy.c_:按行連接兩個矩陣,就是把兩矩陣左右相加,要求行數相等。 # numpy.r_:按列連接兩個矩陣,就是把兩矩陣上下相加,要求列數相等。 # ones()返回一個全1的n維數組,同樣也有三個參數:shape(用來指定返回數組的大小)、dtype(數組元素的類型)、order(是否以內存中的C或Fortran連續(行或列)順序存儲多維數據)。后兩個參數都是可選的,一般只需設定第一個參數。 X_b = np.c_[(np.ones((100, 1)), X)] # np.linalg.inv:矩陣求逆 theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y) print(theta_best) ''' [[3.99844262] [3.09461187]] ''' # 測試數據 X_new = np.array([[0], [2]]) X_new_b = np.c_[np.ones((2, 1)), X_new] # 預測結果 y_predict = X_new_b.dot(theta_best) print(y_predict) plt.plot(X_new, y_predict, 'r--') # 指定紅色和線條 plt.plot(X, y, 'b.') # 指定藍色和點 plt.axis([0, 2, 0, 15]) plt.show()
執行顯示效果:
(1)np.c_和np.r_
numpy.c_:按行連接兩個矩陣,就是把兩矩陣左右相加,要求行數相等。
numpy.r_:按列連接兩個矩陣,就是把兩矩陣上下相加,要求列數相等。
(2)numpy.linalg模塊
numpy.linalg模塊包含線性代數的函數。使用這個模塊,可以計算逆矩陣、求特征值、解線性方程組以及求解行列式等。
- np.linalg.inv():矩陣求逆
- np.linalg.det():矩陣求行列式(標量)
(3)ones函數
ones()返回一個全1的n維數組,同樣也有三個參數:shape(用來指定返回數組的大小)、dtype(數組元素的類型)、order(是否以內存中的C或Fortran連續(行或列)順序存儲多維數據)。后兩個參數都是可選的,一般只需設定第一個參數。
(4)dot函數
dot()返回的是兩個數組的點積(dot product)
1.如果處理的是一維數組,則得到的是兩數組的內積;
2.如果是二維數組(矩陣)之間的運算,則得到的是矩陣積(mastrix product)。所得到的數組中的每個元素為,第一個矩陣中與該元素行號相同的元素與第二個矩陣與該元素列號相同的元素,兩兩相乘后再求和。
3.dot()函數可以通過numpy庫調用,也可以由數組實例對象進行調用。a.dot(b) 與 np.dot(a,b)效果相同。
2、slearn實現線性回歸
# sklearn線性回歸實現 from sklearn.linear_model import LinearRegression lin_reg = LinearRegression() # 線性回歸實例化 lin_reg.fit(X, y) # 擬合線性模型 print(lin_reg.intercept_) # intercept_:線性模型中的獨立項 print(lin_reg.coef_) # coef_:線性回歸的估計系數 """ [3.92151171] [[2.98627461]] """
可以看到得出的結果和前面計算的 theta_best 相同。
3、梯度下降
選擇一個初始值,沿着一個方向去走。
(1)步長問題
步長太小:收斂速度太慢,等不起。
步長太大:得到的結果不准確
(2)收斂的問題
有可能是找到的是局部的最低點,而不是全局的最低點。
(3)標准化的作用
消除數據的量綱,這個過程叫做無量綱化。
無量綱化:我們的數據一般都是有單位的,比如身高的單位有m,cm,這個無量綱化並不是說把m變成cm,而是說,無論是m還是cm,最后都會變成1,也就是沒有了單位。比如 當前身高的單位為cm,經過這個式子的處理變成了一個沒有單位的數字。
當兩個特征的量級差別很大的時候,這樣的操作是有意義的,假如你有身高和體重兩個個特征。身高的單位是m,它的取值經常是這樣的值:1.65,1,70,1.67等,而體重的單都位是kg,它經常取這樣的值:53,68,73等,我們可以看到體重的值要遠遠大於身高的值,它們已經不是一個量級了。進行數據的縮放可以避免我們的結果由取值較大的特征決定。
加快模型的收斂速度
在上圖當中,左邊表示在沒有進行縮放以前模型的收斂情況,右邊表示在進行縮放以后模型收斂的情況。在SVM、線性回歸還有PCA當中經常用到。
數據的標准化Standardization,也叫作(去中心化+方差縮放),通過把一組數據的均值變為0,方差變為1實現數據的縮放。數據的標准化是我們對數據的進行縮放的時候最容易想到的操作,也是最常用到的操作。它也叫z-score方法。