天天看點

線性回歸模型|機器學習

目錄

    • 1.線性回歸模型
      • 1.1 一進制線性回歸模型
      • 1.2多元線性回歸模型
      • 1.3損失函數
    • 2.相關代碼
      • 2.1LinearRegression類
      • 2.2求解代碼
      • 2.3繪圖代碼

1.線性回歸模型

1.1 一進制線性回歸模型

簡單的講,一進制線性模型就是指隻有一個特征量,然後對應帶有一個标簽(結果)。一進制線性回歸模型一般如下:

y = w x + b {\color{Violet}y = wx+b} y=wx+b

其中 w {\color{Red}w} w 代表權重、 b {\color{Red}b} b 代表偏移量、 x {\color{Red}x} x 代表特征值、 y {\color{Red}y} y 代表标簽(該特征值對應結果)。一般結果圖如下:

線性回歸模型|機器學習

1.2多元線性回歸模型

我們主要讨論的還是多元回歸模型,多元回歸模型隻是在一進制回歸模型上的簡單拓展,比如說特征值變成了多個,權重變成了多個,但是偏移量和标簽同樣隻有一個,多元線性回歸模型一般如下:

y = b + w 1 x 1 + w 2 x 2 + . . . w n x n {\color{Violet}y = b+w_{1}x_{1}+w_{2}x_{2}+...w_{n}x_{n}} y=b+w1​x1​+w2​x2​+...wn​xn​

現在式子很長,為了更好的描述該模型,我們想到可以用矩陣來簡化表達式,但是現在表達式中有一個單獨的 b {\color{Red}b} b 很煩,為了統一我們修改表達式如下:

y = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + . . . θ n x n {\color{Violet}y = θ_{0}x_{0}+θ_{1}x_{1}+θ_{2}x_{2}+...θ_{n}x_{n}} y=θ0​x0​+θ1​x1​+θ2​x2​+...θn​xn​

其中 b = θ 0 , x 0 = 1 {\color{Red}b=θ_{0},x_{0}=1} b=θ0​,x0​=1 ,然後将x前面的系數統一使用 θ {\color{Red}θ} θ 進行表示。然後我們就可以使用矩陣進行簡化表達式:

Y = θ X {\color{Violet}Y=θX} Y=θX

其中 θ = ( θ 0 , θ 1 , . . . θ n ) , X = ( x 0 , , x 1 , . . . x n ) {\color{Red}θ=(θ_{0},θ_{1},...θ_{n}),X=(x_{0},,x_{1},...x_{n})} θ=(θ0​,θ1​,...θn​),X=(x0​,,x1​,...xn​) ,那麼我們怎麼判斷哪條直線對應的拟合效果好呢?這時就需要計算每條直線對應的損失函數,損失函數小的直線更優。

1.3損失函數

損失函數顧名思義就是計算相對于原來各點所損失的數值的函數。這裡我們使用最小二乘法,對應的損失函數如下:

J ( θ ) = ( Y − Y ^ ) 2 = ( Y − θ X ) 2 = ( Y − θ X ) T ( Y − θ X ) {\color{Violet}J(θ)=(Y-\hat Y)^{2}=(Y-\theta X)^{2}=(Y-\theta X)^{T}(Y-\theta X)} J(θ)=(Y−Y^)2=(Y−θX)2=(Y−θX)T(Y−θX)

具體就是求每個特征點對應的真實值與預測值之間的差的平方和,其中 Y 為(m,1) 的矩陣(m個特征點),X 為 (m,n+1) 的矩陣(每個特征點有n個特征值+x0),回歸系數 θ 為 (n+1,1) 的矩陣。

我們對 θ 求導,并令其導數等于0,可以得到:

X T ( Y − θ X ) = 0 {\color{Violet}X^{T}(Y-\theta X)=0} XT(Y−θX)=0

解得:

θ = ( X T X ) − 1 X T Y {\color{Violet}\theta = (X^{T}X)^{-1}X^{T}Y} θ=(XTX)−1XTY

2.相關代碼

2.1LinearRegression類

# 定義類LinearRegression
class LinearRegression :
    # 初始化線性回歸模型,我們最終要求的就是theta矩陣
    def __init__(self):
        self.theta = None
        
    # 通過代碼實作theta的求解,輸入原本的X和y,注意X需要添加一列1作為x0    
    def fit(self,xArr,yArr):
        xMat = np.mat(xArr) # 将資料轉化為矩陣
        yMat = np.mat(yArr).T # 将資料轉化為矩陣,并進行轉置(因為我們傳入的是一行資料,需要變為一列資料)
        xTx = xMat.T*xMat # 矩陣xMat轉置後相乘
        # 判斷矩陣xTx是否是奇異矩陣,如果是的話無法繼續求解
        if np.linalg.det(xTx) == 0.0:
            print("這個矩陣是奇異的,不可求逆")
            return
        self.theta = xTx.I * (xMat.T*yMat) # 根據最優解的求解公式,求theta值
    
    # 對測試資料進行預測,輸入的test_data是原本的X,我們要使用theta求得對應的預測值
    def predict(self,test_data):     
        test_data = np.mat(test_data) # 将資料轉化為矩陣
        predict = test_data*self.theta #通過得到的theta值,對資料進行預測
        return predict
           

2.2求解代碼

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 讀取資料
data = pd.read_csv('/data/shixunfiles/a9c0cae754a52e4dc23c3d05a3cd7414_1577260243539.csv')

# 提取特征值和真實值,X提取最後一列之前的所有列,y提取最後一列标簽列(注意:由于該檔案已經插入了第一列x0,是以不需要再手動使用代碼添加)
X = data.iloc[:,:-1].values
y = data.iloc[:,-1].values

# 建立模型,并訓練模型
lr = LinearRegression()
lr.fit(X,y)

# 對資料進行預測,為了求拟合曲線,是以使用原始資料進行預測
ypredict = lr.predict(X)
           

這是對應csv檔案中的部分資料,由于已經添加了第一列1,是以就不用手動進行添加了,下标為1的清單示x,下标為2的清單示y。(簡單的一進制線性回歸模型)

線性回歸模型|機器學習

2.3繪圖代碼

import matplotlib.pyplot as plt
import seaborn as sns;
sns.set()
plt.scatter(data.iloc[:,1],data.iloc[:,2])
plt.plot(data.iloc[:,1],ypredict,color='black')
           
線性回歸模型|機器學習