線性迴歸演算法學習總結

thus 發表於 2020-08-09

image-20200809005953212

image-20200809010153189

我們希望y ^ { ( i ) }\hat { y } ^ { ( i ) }的差距儘量小。

image-20200809010436467

導數為0取得極值:

image-20200809014828446

最終求得如下結果:

image-20200809010557513

簡單線性迴歸的實現

封裝通用方法

import numpy as np

class SimpleLinearRegression1:

    def __init__(self):
        self.a_ = None
        self.b_ = None

    def fit(self, x_train, y_train):
        """根據訓練資料集x_train,y_train訓練Simple Linear Regression模型"""
        x_mean = np.mean(x_train)
        y_mean = np.mean(y_train)

        num = 0.0
        d = 0.0
        #zip() 將可迭代的物件中對應的元素打包成一個個元組,然後返回由這些元組組成的列表。
        for x, y in zip(x_train, y_train):
            num += (x - x_mean) * (y - y_mean)
            d += (x - x_mean) ** 2

        self.a_ = num / d
        self.b_ = y_mean - self.a_ * x_mean

        return self

    def predict(self, x_predict):
        """給定待預測資料集x_predict,返回表示x_predict的結果向量"""
        assert x_predict.ndim == 1, \
            "Simple Linear Regressor can only solve single feature training data."
        assert self.a_ is not None and self.b_ is not None, \
            "must fit before predict!"

        return np.array([self._predict(x) for x in x_predict])

    def _predict(self, x_single):
        """給定單個待預測資料x,返回x的預測結果值"""
        return self.a_ * x_single + self.b_

    def __repr__(self):
        return "SimpleLinearRegression1()"

使用

import numpy as np
import matplotlib.pyplot as plt
from playML.SimpleLinearRegression import SimpleLinearRegression1

x = np.array([1., 2., 3., 4., 5.])
y = np.array([1., 3., 2., 3., 5.])
reg1 = SimpleLinearRegression1()
reg1.fit(x, y)
reg1.predict(np.array([x_predict]))

最小二乘法(多元線性迴歸)

主要思想就是求解未知引數,使得理論值與觀測值之差(即誤差)的平方和達到最小。

所謂最小二乘,也可以叫做最小平方和,其目的就是通過最小化誤差的平方和,使得擬合物件無限接近目標物件,最小二乘法可以用於對函式的擬合。

觀測值就是我們的多組樣本,理論值就是我們的假設擬合函式。舉一個最簡單的線性迴歸的簡單例子,比如我們有m個只有一個特徵的樣本:( x _ { i } , y _ { i } ) ( i = 1 , 2 , 3 ,\cdots,m) ,樣本採用一般的y ( x )為n次的多項式擬合:

y=\theta_{0}+\theta_{1} x_{1}+\theta_{2} x_{2}+\ldots+\theta_{n} x_{n}

其中 \hat{y}^{(i)}為預測值,\hat{y}^{(i)}=\theta_{0}+\theta_{1} X_{1}^{(i)}+\theta_{2} X_{2}^{(i)}+\ldots+\theta_{n} X_{n}^{(i)}

最小二乘法就是要找到一組向量\theta ( \theta _ { 0 } , \theta _ { 1 } , \theta _ { 2 } , \cdots , \theta _ { n } )使得 \sum_{i=1}^{m}\left(y^{(i)}-\hat{y}^{(i)}\right)^{2}最小

image-20200809161744980

預測值:\hat{y}^{(i)} = X _ { b } \cdot \theta

多元線性迴歸的正規方程解(Normal Equation): \theta = \left( X _ { b } ^ { T } X _ { b } \right) ^ { - 1 } X _ b ^ { T } y

時間複雜度高:O(n^3

image-20200809162507904

最小二乘法的侷限性

  1. 如果擬合函式不是線性的,這時無法使用最小二乘法。
  2. 特徵 n 非常的大的時候不可行,建議超過10000個特徵就用迭代法

向量化

對應a可以看為2個向量的運算:

image-20200809012625172

image-20200809013152027

    def fit(self, x_train, y_train):
        """根據訓練資料集x_train,y_train訓練Simple Linear Regression模型"""
        x_mean = np.mean(x_train)
        y_mean = np.mean(y_train)

        self.a_ = (x_train - x_mean).dot(y_train - y_mean) / (x_train - x_mean).dot(x_train - x_mean)
        self.b_ = y_mean - self.a_ * x_mean

        return self

迴歸演算法的評價

均方誤差MSE

image-20200809013341501

def mean_squared_error(y_true, y_predict):
    return np.sum((y_true - y_predict)**2) / len(y_true)

均方根誤差RMSE (Root Mean Squared Error)

image-20200809013428893

def root_mean_squared_error(y_true, y_predict):
    """計算y_true和y_predict之間的RMSE"""
    return sqrt(mean_squared_error(y_true, y_predict))

平均絕對誤差MAE(Mean Absolute Error)

image-20200809013528787

def mean_absolute_error(y_true, y_predict):
    """計算y_true和y_predict之間的MAE"""

    return np.sum(np.absolute(y_true - y_predict)) / len(y_true)

R Square

image-20200809013750510

  • R^2 <=1

  • R^2越大越好。當我們的預測模型不犯任何錯誤是,$R^2$ 得到最大值1

  • 當我們的模型等於基準模型時,$R^2$為0

  • 如果R^2<0,說明我們學習到的模型還不如基準模型。此時,很有可能我們的資料不存在任何線性關係。

    image-20200809014343420

def r2_score(y_true, y_predict):
    """計算y_true和y_predict之間的R Square"""

    return 1 - mean_squared_error(y_true, y_predict)/np.var(y_true)
本作品採用《CC 協議》,轉載必須註明作者和本文連結

如果可以,我要變成光

如果可以,我要變成光