我們希望y ^ { ( i ) }和\hat { y } ^ { ( i ) }的差距儘量小。
導數為0
取得極值:
最終求得如下結果:
簡單線性迴歸的實現
封裝通用方法
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}最小
令
預測值:\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)
最小二乘法的侷限性
- 如果擬合函式不是線性的,這時無法使用最小二乘法。
- 特徵 n 非常的大的時候不可行,建議超過10000個特徵就用迭代法
向量化
對應a
可以看為2個向量的運算:
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
def mean_squared_error(y_true, y_predict):
return np.sum((y_true - y_predict)**2) / len(y_true)
均方根誤差RMSE (Root Mean Squared Error)
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)
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
R^2 <=1
R^2越大越好。當我們的預測模型不犯任何錯誤是,$R^2$ 得到最大值1
當我們的模型等於基準模型時,$R^2$為0
如果R^2<0,說明我們學習到的模型還不如基準模型。此時,很有可能我們的資料不存在任何線性關係。
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 協議》,轉載必須註明作者和本文連結