機器學習之線性迴歸及其python實現(一)

前言:萌新整理了一些上課筆記,以及一些課外資料,網課資料等,稍稍總結一下




--------------------------------正文分割線------------------------------------------

1.基本形式和常見類別

1.1 基本形式

線性迴歸是線性模型的一種,其基本形式如下

img

1.2 常見類別

sklearn中的線性模型模塊爲linear_model。linear_model包含了多種多樣的類和函數,例如,普通線性迴歸,多項式迴歸,嶺迴歸,LASSO,以及彈性網等。

img

img

img

img

img

2.定義

img

3.確定模型的思路

模型的確定有統計學角度和機器學習的角度,在本文中,使用的是機器學習的角度,從矩陣形式來理解之。

img

4.損失函數

img

在這裏插入圖片描述

5.多元線性迴歸

5.1 基本原理

img

補充解釋:

w爲x的迴歸係數矩陣

b爲截距(intercept),又可以寫作w0等形式,它代表一個常數

其他形式

img

w1~wn爲迴歸係數

b爲截距(intercept),又可以寫作w0等形式,它代表一個常數

在這裏插入圖片描述

5.2 損失函數

img

​ 這個損失函數代表了(yi-Xiw)的L2範式的平方結果,L2範式的本質是就是歐式距離,即是兩個向量上的每個點對應相減後的平方和再開平方.

​ 現在只實現了向量上每個點對應相減後的平方和,並沒有開方,所以損失函數是L2範式,即歐式距離的平方結果。

​ 預測結果和真實值差異越小越好, 此時,求解目標就可以轉化成如下形式:

img

​ 這個式子,也正是sklearn當中,用在類Linear_model.LinerRegression背後使用的損失函數。

​ 該式即爲我們熟知的SSE(Sum of Sqaured Error,誤差平方和)或者RSS(Residual Sum of Squares 殘差平方和)。在sklearn官網文檔中,一般稱之爲RSS殘差平方和。




5.3 最小二乘法求解多元線性迴歸的參數

​ 問題轉換成了求解讓RSS最小化的參數向量 ,這種通過最小化真實值和預測值之間的RSS來求解參數的方法叫【最小二乘法】。

​ 列式如下:

img

img

在這裏,逆矩陣存在的充分必要條件是特徵矩陣不存在多重共線性


5.4 正則化

img

img

img



6.linear_model.LinearRegression

class sklearn.linear_model.LinearRegression (fifit_intercept=True, normalize=False, copy_X=True, n_jobs=None)
參數 含義
fit_intercept bool,可不填,默認爲True。 是否計算該模型的截距,若爲False,則不計算
normalize bool,可不填,默認爲False。 當fit_intercept設置爲False時,將忽略此參數。如果爲True,則特徵矩陣X在進入迴歸之前將 會被減去均值(中心化)併除以L2範式(縮放)。如果你希望進行標準化,請在fifit數據之前 使用preprocessing模塊中的標準化專用類StandardScaler 。
copy_X bool, 可不填,默認爲True。若爲真,則在X.copy()上進行操作,否則的話原本的特徵矩陣X可能被線性迴歸影響並覆蓋。
n_jobs 整數或者None,可不填,默認爲None 用於計算的作業數。只在多標籤的迴歸和數據量足夠大的時候才生效。除非None在 joblib.parallel_backend上下文中,否則None統一表示爲1。如果輸入 -1,則表示使用全部的CPU來進行計算。

7.實戰演練

詳情請見我得另一篇博文,點擊這裏



8.自己實現最小二乘法嘗試

# 自定義最小二乘法嘗試
def my_least_squares(x_array, y_array):
    '''
    :param x: 列表,表示m*n矩陣
    :param y: 列表,表示m*1矩陣
    :return: coef:list 迴歸係數(1*n矩陣)   intercept: float 截距
    '''
    # 矩陣對象化
    arr_x_01 = np.array(x_array)
    arr_y_01 = np.array(y_array)

    # x_array由 m*n矩陣轉化爲 m*(n+1)矩陣,其中第n+1列係數全爲1
    # 獲取行數
    row_num = arr_x_01.shape[0]

    # 生成常量係數矩陣  m*1矩陣
    arr_b = np.array([[1 for i in range(0, row_num)]])

    # 合併成m*(n+1)矩陣
    arr_x_02 = np.insert(arr_x_01, 0, values=arr_b, axis=1)

    # 矩陣運算
    w = np.linalg.inv(np.matmul(arr_x_02.T, arr_x_02))
    w = np.matmul(w, arr_x_02.T)
    w = np.matmul(w, arr_y_01)
    
    # w爲1*(n+1)矩陣
    # print(w)
    result = list(w)
    coef = result.pop(-1)
    intercept = result
    
    return coef, intercept

9.補充說明

模型優化

嶺(ridge)迴歸和拉索(lasso)迴歸

等會後續在我的博客中補充

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