01 線性迴歸模型

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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章