樣本 x 有 m 個屬性
多元線性回歸
- 線性回歸模型函數(shù)
- 模型參數(shù)
- 屬性(特征值)列表
其中:
是線性回歸的截距的權(quán)重式曲,恒定為1 - 代價函數(shù)
其中:
表示是關(guān)于參數(shù)的函數(shù)
表示一共有個樣本數(shù)據(jù)
為第個樣本對應的真實值
為第個樣本通過預測函數(shù) 計算得到的預測值
是為了推導方便而添加的常量
梯度下降法
- 求當前的梯度需要求得在的偏導數(shù)
其中:
表示第個樣本的第個特征值 - 由于我們的目的是讓代價函數(shù)取得極小值臀玄,于是需要讓參數(shù)往負梯度的方向更新蔗草,從而讓代價函數(shù)取值變小
- 參數(shù)每次更新需要一個正數(shù)步長(可以為0.001两踏、0.0001)來確定每次參數(shù)更新的速度
- 參數(shù)的負增量:
梯度下降法過程:
1.初始化權(quán)重
2.使用代價函數(shù)計算代價
3.計算梯度节沦,使用更新權(quán)重
4.若代價值小于某一閾值(或訓練某個次數(shù))則停止訓練
5.得到權(quán)重
以下是使用Python實現(xiàn)線性回歸的類
import numpy as np
class LinearRegressionLM(object):
# 初始化(
# eta -> 初始化學習率
# n_iter -> 訓練次數(shù)
def __init__(self, eta=0.001, n_iter=20):
self.eta = eta
self.n_iter = n_iter
# 訓練
# X -> 訓練的所有樣本(n+1)xm
# y -> 訓練樣本的真實值(n+1)x1
def fit(self, X, y):
# 初始化權(quán)重w_
self.w_ = np.zeros(1 + X.shape[1])
# 初始化代價
self.cost_ = []
for i in range(self.n_iter):
# 得到預測值
output = self.net_input(X)
# 得到殘差值
errors = (y - output)
# 更新第 0 個權(quán)重(這個比較特殊)
self.w_[0] += self.eta * errors.sum()
# 更新第 1...m個權(quán)重
self.w_[1:] += self.eta * X.T.dot(errors)
# 計算代價值
cost = (errors**2).sum() / 2.0
# 存儲代價值
self.cost_.append(cost)
return self
# 使用現(xiàn)有的權(quán)重w_得到預測值
def net_input(self, X):
return np.dot(X, self.w_[1:]) + self.w_[0]
# 預測
def predict(self, X):
return self.net_input(X)
注解:
# 更新第 0 個權(quán)重(這個比較特殊)
self.w_[0] += self.eta * errors.sum()
推導過程:
關(guān)于這行代碼
# 更新第 1...m個權(quán)重
self.w_[1:] += self.eta * X.T.dot(errors)
為什么是X的轉(zhuǎn)置點乘殘差值碘橘?以下是推導過程
由參數(shù)的負增量:
注意:代碼中不包括福澡,另外計算
實際上就是代碼中
= self.eta * X.T.dot(errors)
******** 以下是代碼實踐 ********
1.初始化隨機線性回歸數(shù)據(jù)(每個樣本只取一個屬性)
from sklearn.datasets import make_regression
import matplotlib.pyplot as plt
X, y, eof = make_regression(n_samples=1000, n_features=1, noise=40, coef=True, random_state=14)
plt.scatter(X, y, c='r', s=3)
2.初始化線性回歸的類阔籽,開始訓練
linearRegressionLM = LinearRegressionLM()
linearRegressionLM.fit(X, y)
print('訓練參數(shù) = ' , linearRegressionLM.w_)
訓練參數(shù) = [ 0.70041376 76.66596196]
3.繪制回歸線
x_line = np.linspace(-3, 3, 20)
print(x_line.shape)
print(type(x_line))
x_line_ones = np.ones((x_line.shape[0], 1))
# 添加每個樣本的 x_0 = 1
x_line_all = np.column_stack((x_line_ones, x_line))
y_line = np.dot(x_line_all, linearRegressionLM.w_)
plt.scatter(X, y, c='r', s=3)
plt.plot(x_line, y_line, color='blue')