# 线性回归算法 https://zhuanlan.zhihu.com/p/86982616
import torch
import matplotlib.pyplot as plt
# 创建线性回归数据集
def create_linear_data(nums_data, if_plot=False):
"""
Create data for linear model
Args:
nums_data: how many data points that wanted
Returns:
x with shape (nums_data, 1)
"""
x = torch.linspace(0, 1, nums_data)
x = torch.unsqueeze(x, dim=1)
k = 2
y = k * x + torch.rand(x.size())
if if_plot:
plt.scatter(x.numpy(), y.numpy(), c=x.numpy())
plt.show()
data = {"x": x, "y": y}
return data
data = create_linear_data(300, if_plot=True)
print(data["x"].size())
# 还是继承pytorch提供的nn.Module()类。通过把nn.Linear()绑定到类实例属性,以及实现forward()方法实现前向传播:
class LinearRegression(torch.nn.Module):
"""
Linear Regressoin Module, the input features and output
features are defaults both 1
"""
def __init__(self):
super().__init__()
self.linear = torch.nn.Linear(1, 1)
def forward(self, x):
out = self.linear(x)
return out
linear = LinearRegression()
print(linear)
class Linear_Model():
def __init__(self):
"""
Initialize the Linear Model
"""
self.learning_rate = 0.001
self.epoches = 10000
#损失函数选择为MSE:
self.loss_function = torch.nn.MSELoss()
self.create_model()
def create_model(self):
self.model = LinearRegression()
#优化算法选择SGD优化:
self.optimizer = torch.optim.SGD(self.model.parameters(), lr=self.learning_rate)
def train(self, data, model_save_path="model.pth"):
"""
Train the model and save the parameters
Args:
model_save_path: saved name of model
data: (x, y) = data, and y = kx + b
Returns:
None
"""
x = data["x"]
y = data["y"]
for epoch in range(self.epoches):
prediction = self.model(x)
loss = self.loss_function(prediction, y)
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
if epoch % 500 == 0:
print("epoch: {}, loss is: {}".format(epoch, loss.item()))
torch.save(self.model.state_dict(), "linear.pth")
def test(self, x, model_path="linear.pth"):
"""
Reload and test the model, plot the prediction
Args:
model_path: the model's path and name
data: (x, y) = data, and y = kx + b
Returns:
None
"""
x = data["x"]
y = data["y"]
# 加载模型
self.model.load_state_dict(torch.load(model_path))
prediction = self.model(x)
plt.scatter(x.numpy(), y.numpy(), c=x.numpy())
plt.plot(x.numpy(), prediction.detach().numpy(), color="r")
plt.show()
def compare_epoches(self, data):
x = data["x"]
y = data["y"]
num_pictures = 16
fig = plt.figure(figsize=(10, 10))
current_fig = 0
for epoch in range(self.epoches):
prediction = self.model(x)
loss = self.loss_function(prediction, y)
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
if epoch % (self.epoches / num_pictures) == 0:
current_fig += 1
plt.subplot(4, 4, current_fig)
plt.scatter(x.numpy(), y.numpy(), c=x.numpy())
plt.plot(x.numpy(), prediction.detach().numpy(), color="r")
plt.show()
def lu_test(self):
# 加载模型
model_path = "linear.pth"
self.model.load_state_dict(torch.load(model_path))
# 构造一个数据样本用于测试,假设有两个特征值
sample = torch.tensor([[2.0],[3.0]])
# 打印输入的测试数据
print("Sample:", sample)
# 将数据样本作为模型输入进行预测,并打印预测结果
pred = self.model(sample)
print("Prediction:", pred)
# 将 tensor 转换成 numpy 数组,并打印
print("Prediction as numpy array:", pred.detach().numpy())
'''
在上述代码中,首先加载模型,并构造了一个数据样本示例 sample,该样本针对模型的输入数据有两个特征值。我们通过调用模型的前向传递方法来进行预测,将 sample 作为模型的输入数据,并在屏幕上打印模型的预测结果。
输出的数据格式为 tensor,如果需要将 tensor 转换成 numpy 数组,则可以使用 .detach() 和 .numpy() 方法,例如:
'''
linear = Linear_Model()
data = create_linear_data(100)
#linear.train(data)
#linear.test(data)
#linear.compare_epoches(data)
linear.lu_test()
''''
这段代码实现了一个用于线性回归的模型,并使用随机梯度下降算法来训练模型,最后进行了一些可视化。具体来说,代码实现了以下功能:
使用create_linear_data()函数创建了一个线性数据集。
定义了一个继承自nn.Module的线性回归模型,模型中包含一个nn.Linear模块,用于计算输出。
创建了一个Linear_Model类,用于训练和测试线性回归模型。在类内部,使用了nn.MSELoss作为损失函数,使用SGD作为优化算法。并且可以通过train()来训练模型,通过test()来测试模型,并通过compare_epoches()函数绘制出训练过程中的预测结果。
最后通过实例化Linear_Model()来进行数据训练和测试。
'''
'''
以下是一个线性回归的具体使用案例:假设你是一家销售公司的业务分析师,你的公司销售多种产品,你想预测你的公司在未来一个季度内销售额能达到多少。为了预测销售额,你需要关注多个因素,包括广告投入、市场竞争程度、销售渠道、产品定价等因素。你可以采用线性回归算法来分析这些因素对销售额的影响,并预测出未来一个季度内的销售额。
具体而言,你可以收集历史数据集,并将数据分为训练集和测试集。然后,在训练集上训练一个线性回归模型,找出各个因素对销售额的影响程度,并将该模型用于测试集上,来评估该模型的预测能力。最后,你可以利用该模型对未来几个月内的销售额进行预测。
在这个业务场景中,线性回归算法可以帮助你预测销售额,并对销售策略做出调整,并获取更好的销售业绩。
'''
# 训练后的模型在哪里,我该怎么使用训练后的模型呢?
'''
理解,线性回归模型
需要确定特征值,特征值都是自变量,类似x。 因变量就是 Y。 Y都是因为X得变化而产生变化
本案例的样例数据中,因为 x 代表着一系列的 自变量,有多少个,都待变着一个特征值。而Y则是 没一个样例数据对应的结果。对应起来的
如果一个场景有多个特征值,则用矩阵来标识,就是有多少个列,每一行就代表着一个 样例数据
通过以前的一些数据,通过线性回归,来预测后续会导致的结果
例如:
电网线路的损坏
股票后期走势等
身体部分指标导致身体后续会遇到的情况
'''
没有合适的资源?快使用搜索试试~ 我知道了~
线性回归数据集、逻辑回归、KNN k-最近邻 、决策树、支持向量机(SVM)、朴素贝叶斯 等算法简单demo实现
资源推荐
资源详情
资源评论
收起资源包目录
algorithm.7z (7个子文件)
algorithm
002_demo.py 6KB
data
06_demo.py 4KB
001_demo.py 7KB
004_demo.py 1KB
003_demo.py 2KB
007_demo.py 17B
005_demo.py 5KB
共 7 条
- 1
资源评论
简维旅者
- 粉丝: 372
- 资源: 22
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功