01 線性迴歸模型
1.1 最小二乘法
1.線性迴歸模型:
2.損失函數的定義:
3.目標函數:
4.計算方法:
(1)根據《微積分2》二元函數極值的求法,我們需要將損失函數 L(w,b)分別對w,b進行求偏導,使得偏導分別爲零
(2) 梯度下降法更新w,b參數
1.2 應用舉例
代碼如下:
(1)初始化座標點,同時數據可視化
import numpy as np
import torch as t
import torch.nn.functional as F
import matplotlib.pyplot as plt
# 將輸入的值,和要輸出的結果分別存放在Input,Output之中
"""
注意:要想使用pytorch微分求導,必須初始化二維張量
"""
Input = t.tensor([[30.,33.,35.,37.,39.,44.,46.,50.]],requires_grad = True)
Output = t.tensor([[30.,34.,37.,39.,42.,46.,48.,51.]],requires_grad = True)
# 繪製散點圖時,需要把張量轉化爲numpy的數據結構
X = Input.data.numpy()
Y = Output.data.numpy()
plt.scatter(X,Y)
plt.show()
Input = Input.data
Output = Output.data
初始數據的分佈圖:
(2)初始化參數
# 隨機初始化參數(因爲w,b是需要計算梯度來更新參數的)
w = t.tensor([0.],requires_grad = True)
b = t.tensor([0.],requires_grad = True)
(3) 訓練模型
# 迭代的次數
EPOCHS = 1000
# 學習率
lr = 0.00001
for epoch in range (EPOCHS):
# 初始化損失函數 Loss = sum((output - y_pred)^2)/n
loss_function = t.nn.MSELoss()
# 在原來初始的參數w,b的條件下,計算出預測值
y_pred = Input * w + b
# 計算預測值與目標值之間的誤差
loss = loss_function(Output,y_pred)
if epoch%10==0:
print('epoch = %d, w = %.4f, b = %.4f, loss = %.8f' % (epoch,w.item(),b.item(),loss.item()))
# 得到預測值與目標值誤差之後,即得到損失函數之後分別求L對w,b的偏導
loss.backward()
# 更新參數
w.data -= lr * w.grad
b.data -= lr * b.grad
# Pytorch中更新完參數之後需要對原來的梯度進行清零否則會累加
w.grad.data.zero_()
b.grad.data.zero_()
# 訓練完畢,將擬合情況可視化
X = Input.data.numpy()
Y = Output.data.numpy()
plt.scatter(X,Y)
X = np.linspace(30,50,100)
Y = w.item() * X + b.item()
plt.plot(X,Y)
plt.xlabel('times')
plt.ylabel('score')
plt.show()a -= lr * b.grad
w.grad.data.zero_()
b.grad.data.zero_()
X = Input.data.numpy()
Y = Output.data.numpy()
plt.scatter(X,Y)
X = np.linspace(30,50,100)
Y = w.item() * X + b.item()
plt.plot(X,Y)
plt.xlabel('times')
plt.ylabel('score')
plt.show()
訓練過程(截取的片段):
擬合結果:
1.3 歸納總結
訓練的關鍵:
(1)輸入值與目標輸出的存儲:需要用二維的張量存儲,在pytorch中,x = torch.tensor([[]],reqiures_grad = True),然後取x.data只取張量的數值部分
(2)初始化參數w,b:w,b = torch.tensor([[]],reqiures_grad = True)
(3)訓練模型:
1)選擇損失函數 loss_function = t.nn.MSELoss()
2)計算預測值
3)調用損失函數將目標值和預測值代入損失函數 loss = loss_function(Output,y_pred)
4)計算 損失函數 L 對w,b偏導,loss.backward()
5)更新梯度,每一輪更新需要將梯度清零 w.grad.data.zero_(); b.grad.grad.zero_()
1.4 參考資料
【1】《機器學習》 周志華 清華大學出版社
【2】 視頻:https://morvanzhou.github.io/tutorials/machine-learning/torch/