import torch
import numpy as np
from torch.autograd import Variable
# torch.manual_seed(2017)#为CPU设置种子用于生成随机数,以使得结果是确定的
# # print(torch.manual_seed(2017))
import matplotlib.pyplot as plt
#定义多变量函数
w_target = np.array([0.5,3,2.4])#定义参数
b_target = np.array([0.9])#定义参数
f_des = 'y={:.2f}+{:.2f}*x+{:.2f}*x^2+{:.2f}*x^3'.format(b_target[0],w_target[0],w_target[1],w_target[2])
#{:.2f} 表示打印输出小数点保留两位小数;{:.0f}表示打印输出不保留小数位;
print(f_des)
#画出这个函数图像
x_sample = np.arange(-3, 3.1, 0.1)#三个参数时,第一个参数为起点,第二个参数为终点,第三个参数为步长。其中步长支持小数
y_sample = b_target[0] + w_target[0] * x_sample + w_target[1] * x_sample ** 2 +w_target[2] * x_sample ** 3
plt.plot(x_sample, y_sample, label='real curve')
plt.legend()
plt.show()
# 构建数据 x 和 y
# x是矩阵 [x, x^2, x^3]
# y 是函数的结果 [y]
x_train = np.stack([x_sample ** i for i in range(1, 4)], axis=1)#range(1,4)=[1,2,3]
x_train = torch.from_numpy(x_train).float() # 转换成 float tensor
y_train = torch.from_numpy(y_sample).float().unsqueeze(1) # 转换成 float tensor,.unsqueeze(1) 加一个维度,两个中括号了
# print(x_train)
# print(y_train)
#定义需要优化的参数
# 定义参数和模型
w = Variable(torch.randn(3, 1), requires_grad=True)#返回一个3*1的随机项矩阵
b = Variable(torch.zeros(1), requires_grad=True)
# 将 x和y 转化成 Variable
x_train = Variable(x_train)
y_train = Variable(y_train)
def multi_linear(x):
return torch.mm(x, w) + b
#画出更新之前的模型
y_pred = multi_linear(x_train)
plt.plot(x_train.data.numpy()[:, 0], y_pred.data.numpy(), label='fitting curve',color='r')#X[:,0]就是取所有行的第0个数据
plt.plot(x_train.data.numpy()[:, 0], y_sample, label='real curve', color='b')
plt.legend()
plt.show()
#定义误差
def get_loss(y_, y):
return torch.mean((y_ - y_train) ** 2)
loss = get_loss(y_pred, y_train)
print(loss)
#自动求导
loss.backward()
#查看一下,w和b的梯度
print(w.grad)
print(b.grad)
# 更新参数
w.data = w.data - 0.001 * w.grad.data
b.data = b.data - 0.001 * b.grad.data
# 更新一次后的模型
y_pred = multi_linear(x_train)
plt.plot(x_train.data.numpy()[:, 0], y_pred.data.numpy(), label='fitting curve',color='r')
plt.plot(x_train.data.numpy()[:, 0], y_sample, label='real curve', color='b')
plt.legend()
plt.show()
# 进行100 次参数更新
for e in range(100):
y_pred = multi_linear(x_train)
loss = get_loss(y_pred, y_train)
w.grad.data.zero_()
b.grad.data.zero_()
loss.backward()
#更新参数
w.data = w.data - 0.001 * w.grad.data
b.data = b.data - 0.001 * b.grad.data
if (e + 1) % 20 == 0:
print('epoch {}, Loss: {:.5f}'.format(e+1, loss.item()))
# 画出更新后的结果
y_pred = multi_linear(x_train)
plt.plot(x_train.data.numpy()[:, 0], y_pred.data.numpy(), label='fitting curve',
color='r')
plt.plot(x_train.data.numpy()[:, 0], y_sample, label='real curve', color='b')
plt.legend()
plt.show()
多项式回归模型 三次多项式练习 pycharm运行
最新推荐文章于 2024-07-08 15:37:35 发布
这篇博客通过Python和PyTorch展示了如何实现多变量线性回归。首先定义了一个目标函数,并绘制了其图像。接着,利用随机初始化的权重和偏置构建了模型,并通过梯度下降法进行优化。在每次迭代后更新模型参数,最终使模型拟合数据,实现了对多变量函数的预测。
摘要由CSDN通过智能技术生成