PyTorch實例:房價預測


1.准備數據

import torch
from torch.autograd import Variable

# 構造0-100之間的均勻數字作為時間變量x
x = Variable(torch.linspace(0,100).type(torch.FloatTensor))
# 時間點上的歷史房價數據
rand = Variable(torch.randn(100)) * 10   # 均值為0,方差為10。 torch.randn(100)生成100個標准正態分布隨機數
y = x + rand

x_train = x[: -10]  #倒數第10個元素之前的所有元素
x_test = x[-10:]    #最后面10個元素
y_train = y[: -10]
y_test = y[-10:]

# 訓練數據點可視化
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure(figsize=(10,8))  #設定繪制窗口大小為10*8inch
#繪制數據,由於x和y都是Variable,需要用data獲取它們包裹的Tensor,並轉成Numpy
plt.plot(x_train.data.numpy(), y_train.data.numpy(),'o')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Varibale包含三個屬性:

data:存儲了Tensor,是本體的數據
grad:保存了data的梯度,本事是個Variable而非Tensor,與data形狀一致
grad_fn:指向Function對象,用於反向傳播的梯度計算之用。就是計算圖中的箭頭

 

2.模型設計及訓練

# y = ax+b
#定義兩個自動微分變量a和b
a = Variable(torch.rand(1),requires_grad = True)
b = Variable(torch.rand(1),requires_grad = True)
learning_rate = 0.0001 

for i in range(1000):
    predictions = a.expand_as(x_train) * x_train + b.expand_as(x_train) #使用expand_as提升a和b的尺寸,a.expand_as(x_train)是將a的維度調整為何x_train一致
    loss = torch.mean((predictions - y_train) ** 2)
    print('loss:',loss)
    loss.backward()   #對損失函數進行梯度反傳
    a.data.add_(- learning_rate * a.grad.data)  #在PyTorch中,如果某個函數后加了'_',表明要用這個函數的計算結果更新當前的變量;例如a.data.add_(3)是將a.data的數值更新為a.data加上3
    b.data.add_(- learning_rate * b.grad.data)
    a.grad.data.zero_() #清空存儲在變量a和b中的梯度信息,以免在backward的過程中反復不停地累加
    b.grad.data.zero_()


# 畫出原始散點圖和擬合后的直線
x_data = x_train.data.numpy()
plt.figure(figsize = (10,7))
xplot, = plt.plot(x_data, y_train.data.numpy(),'o')
yplot, = plt.plot(x_data,a.data.numpy()*x_data + b.data.numpy()) #繪制擬合直線圖
plt.xlabel('X')
plt.ylabel('Y')
str1 = str(a.data.numpy()[0])+'x+'+str(b.data.numpy()[0])
plt.legend([xplot, yplot],['Data',str1])
plt.show()

3.預測

predictions = a.expand_as(x_test)*x_test + b.expand_as(x_test)
predictions

import numpy as np
x_data = x_train.data.numpy()
x_pred = x_test.data.numpy()
plt.figure(figsize = (10,7))
plt.plot(x_data, y_train.data.numpy(),'o') #訓練數據
plt.plot(x_pred, y_test.data.numpy(),'s') #測試數據

x_data = np.r_[x_data, x_test.data.numpy()]
plt.plot(x_data,a.data.numpy()*x_data + b.data.numpy()) #繪制擬合數據
plt.plot(x_pred,a.data.numpy()*x_pred + b.data.numpy(),'o') #繪制預測數據
plt.xlabel('X')
plt.ylabel('Y')
str1 = str(a.data.numpy()[0])+'x+'+str(b.data.numpy()[0])
plt.legend([xplot, yplot],['Data',str1])
plt.show()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM