1. 線性迴歸算法簡介
線性迴歸算法的特點
- 解決迴歸問題
- 思想簡單,容易實現
- 許多強大的非線性模型的基礎 (邏輯迴歸\多項式迴歸\SVM等)
- 結果具有很好的可解釋性
- 蘊含機器學習中的很多重要思想
分類問題和迴歸問題的區別
分類問題,座標軸都是特徵, 顏色代表樣本的輸出標記(離散)
迴歸問題,橫軸是特徵,縱軸是樣本的輸出標記,樣本的輸出標記在一個連續的空間裏
簡單線性迴歸的思想(擬合方程\損失函數)
簡單線性迴歸(只有一個特徵)
多個特徵是多元線性迴歸
總體思想: 找到一組參數值使得某個函數(損失函數)儘可能的小
[機器學習中的參數學習算法就是創建一個模型, 然後學習模型的參數===>找到這些參數使得可以最優化損失函數
近乎所有參數學習算法都是這樣的套路
模型不同, 建立的目標函數不同, 優化的方式不同]
簡單線性迴歸通過最小二乘法最優化損失函數
a,b表達式的具體推導過程: 用最小二乘法求解參數a, b(分別對每個參數求偏導數,並另偏導數=0)
更改成更容易提高計算效率的形式(利用)
2. 實現簡單線性迴歸算法
與KNN.py不同的是, 簡單線性迴歸不需要保存X_train和y_train,只需要保存根據用戶傳入的訓練集計算出的模型參數
predict的時候只需要參數即可
import numpy as np
class SimpleLinearRegression1:
def __init__(self):
"""初始化模型"""
self.a_ = None
self.b_ = None
def fit(self, x_train, y_train):
"""根據訓練集數據訓練模型"""
assert x_train.ndim == 1
assert len(x_train) == len(y_train)
x_mean = np.mean(x_train)
y_mean = np.mean(y_train)
num = 0.0
d = 0.0
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
assert self.a_ is not None and self.b_ is not None
return np.array([self.predict(x_single) for x_single in x_predict])
def _predict(self, x_single):
"""給定單個待預測數據x_single"""
return self.a_ * x_single + self.b_
def __repr__(self):
"""object 類提供的 __repr__() 方法總是返回該對象實現類的“類名+object at+內存地址”值,這個返回值並不能真正實現“自我描述”的功能,因此,如果用戶需要自定義類能實現“自我描述”的功能,就必須重寫 __repr__() 方法"""
return "simplelinearregression1()"
向量化運算
不使用for循環
import numpy as np
class SimpleLinearRegression2:
def __init__(self):
"""初始化模型"""
self.a_ = None
self.b_ = None
def fit(self, x_train, y_train):
"""根據訓練集數據訓練模型"""
assert x_train.ndim == 1
assert len(x_train) == len(y_train)
x_mean = np.mean(x_train)
y_mean = np.mean(y_train)
num = (x_train - x_mean).dot(y_tain - y_mean)
d = (x_train - x_mean).dot(x_train - x_mean)
#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
assert self.a_ is not None and self.b_ is not None
return np.array([self.predict(x_single) for x_single in x_predict])
def _predict(self, x_single):
"""給定單個待預測數據x_single"""
return self.a_ * x_single + self.b_
def __repr__(self):
"""object 類提供的 __repr__() 方法總是返回該對象實現類的“類名+object at+內存地址”值,這個返回值並不能真正實現“自我描述”的功能,因此,如果用戶需要自定義類能實現“自我描述”的功能,就必須重寫 __repr__() 方法"""
return "simplelinearregression1()"