在例子中用到的库
我这里用到的版本是3.11,因为我发现有些库它的版本更新迭代太慢了我3.12根本用不了,大概版本在3.9-3.11都行
安装库
//NumPy:用于数组操作和数值计算。可以通过运行
pip install numpy
//升级
pip install --upgrade numpy
//statsmodels:用于时间序列建模和分析。
pip install statsmodels
//scikit-learn:用于评估模型性能。
pip install scikit-learn
//升级
pip install --upgrade scikit-learn
//使用TensorFlow库来实现神经网络模型
pip install tensorflow
pip install --upgrad tensorflow
pip install torch torchvision matplotlib
成功结果
1.偏最小二乘方法
是一种统计建模方法,用于处理多元线性回归问题。
它通过将自变量和因变量进行线性组合,找到一个新的特征空间,使得在这个新空间中的回归分析更加简单。PLS主要应用于具有高度相关性和多重共线性的数据集,尤其适用于样本数量较少的情况。
例子:
题目:使用偏最小二乘法建立一个回归模型来预测汽车的燃油效率(公里/升)。已知汽车的一些特征变量,例如马力、重量、加速度等。
运行代码:
import numpy as np
from sklearn.cross_decomposition import PLSRegression
# 生成示例数据集
np.random.seed(0)
n_samples = 100
X = np.random.randn(n_samples, 5) # 自变量X,5个特征
Y = 10 * X[:, 0] + 5 * X[:, 1] - 2 * X[:, 2] + np.random.randn(n_samples) # 因变量Y
# 创建PLS回归模型对象
pls = PLSRegression(n_components=2)
# 模型拟合
pls.fit(X, Y)
# 预测
Y_pred = pls.predict(X)
# 打印模型系数和预测结果
print("PLS回归模型系数:")
print(pls.coef_)
print("\n实际Y值:")
print(Y[:10])
print("\n预测Y值:")
print(Y_pred[:10])
结果:
2.ARX模型、有源自回归-神经网络结构建立ARX-NN模型
2.1.ARX模型(AutoRegressive with eXogenous inputs model)
通常指的是自回归外生模型(Autoregressive Exogenous Model),它是一种时间序列模型,用于预测一个变量的未来值,基于该变量的过去值和一些外生变量。
是一种用于时间序列预测的线性模型。它基于当前时刻的输入变量和过去时刻的输出变量,通过线性组合来预测未来时刻的输出变量。ARX模型常用于系统辨识和控制领域。
例子:
假设我们有一家零售店,想要根据过去的销售数据和一些外部因素,如促销活动、天气情况等,来预测未来的销售额。
下面是一个针对销售预测的ARX模型的示例代码:
import numpy as np
from statsmodels.tsa.api import AutoReg
from sklearn.metrics import mean_squared_error
# 生成随机数据
np.random.seed(0)
n_samples = 100
X = np.random.rand(n_samples, 1)
Y = 2*X + np.random.randn(n_samples, 1)
# 将数据划分为训练集和测试集
train_size = int(n_samples * 0.8)
X_train, X_test = X[:train_size], X[train_size:]
Y_train, Y_test = Y[:train_size], Y[train_size:]
# 将测试集的外生变量数据重复四次,使其形状与训练集的外生变量数据相同
X_test_repeated = np.repeat(X_test, 4).reshape(-1, 1)
# 创建并拟合ARX模型
order = 1 # AR阶数
model = AutoReg(Y_train, lags=order, exog=X_train)
model_fit = model.fit()
# 进行预测
Y_pred = model_fit.predict(start=len(Y_train), end=len(Y_train)+len(Y_test)-1, exog=X_test_repeated, exog_oos=X_test_repeated)
# 计算均方误差
mse = mean_squared_error(Y_test, Y_pred)
print("均方误差:", mse)
# 打印预测结果
print("测试数据的预测Y值:")
print(Y_pred)
结果:
2.2.ARX-NN模型
是在ARX模型的基础上引入神经网络结构的扩展模型。通过将ARX模型的输出作为神经网络的输入,利用神经网络的非线性建模能力来提高模型的预测性能。ARX-NN模型结合了传统ARX模型和神经网络的优势,适用于更复杂、非线性的系统建模和预测任务。
下面是一个使用ARX-NN模型解决回归问题的例子。
题目: 假设你想预测某股票的未来价格,你有过去一年的每日开盘价、最高价、最低价和收盘价数据。你希望使用ARX-NN模型来预测未来一周的收盘价。
数据集:
从以下链接下载数据集:stock_data (kaggle.com)
代码实现
用TensorFlow库来实现神经网络模型,并使用statsmodels库来实现自回归模型。我们还将使用scikit-learn库来对数据进行预处理和评估。
import pandas as pd
import numpy as np
from sklearn.neural_network import MLPRegressor
from statsmodels.tsa.ar_model import AutoReg
# 读取数据
data = pd.read_csv('stock_data.csv')
# 将日期列转换为DatetimeIndex类型
data['Date'] = pd.to_datetime(data['Date'])
data.set_index('Date', inplace=True)
#确保日期索引具有正确的频率信息
data.index = pd.date_range(start=data.index[0], periods=len(data), freq='D')
#确保日期索引按照升序排序
data = data.sort_index()
# 提取特征和目标变量
features = data[['Open', 'High', 'Low', 'Close']]
target = data['Close']
# 划分训练集和测试集
train_size = int(len(data) * 0.8)
train_features = features[:train_size]
train_target = target[:train_size]
test_features = features[train_size:]
test_target = target[train_size:]
# 拟合AR模型并预测未来一周的收盘价
order = 7 # AR模型的阶数
model = AutoReg(train_target, lags=order)
model_fit = model.fit()
prediction = model_fit.predict(start=len(train_target), end=len(train_target)+6)
# 构建并训练神经网络模型
X_train_nn = np.concatenate([train_features.values[order:], train_target.values[order:].reshape(-1, 1)], axis=1)
y_train_nn = train_target.values[order:]
model_nn = MLPRegressor(hidden_layer_sizes=(64, 32))
model_nn.fit(X_train_nn, y_train_nn)
# 在测试集上进行预测
X_test_nn = np.concatenate([test_features.values[order:], test_target.values[order:].reshape(-1, 1)], axis=1)
y_test_nn = test_target.values[order:]
y_pred_nn = model_nn.predict(X_test_nn)
# 输出预测结果
print("ARX-NN模型预测结果:")
print("实际值:", y_test_nn)
print("预测值:", y_pred_nn)
结果:
3.神经网络模型
神经网络是一种模仿人脑神经系统结构和功能的计算模型。
它由大量的人工神经元(节点)组成,并通过节点之间的连接进行信息传递和处理。神经网络模型可以学习和发现数据中的模式和关联,广泛应用于模式识别、分类、回归等任务。
神经网络模型通常包括输入层、隐藏层和输出层。输入层接收原始数据作为输入,隐藏层通过节点之间的权重和激活函数对数据进行非线性变换和特征提取,输出层给出最终的预测结果。通过反向传播算法,神经网络可以自动调整节点之间的权重,以最小化预测误差。
图像分类是根据图像的内容将其分为不同的类别。
下面是一个示例,使用Python和PyTorch库来实现一个简单的图像分类神经网络模型。
题目:构建一个图像分类模型,将猫和狗的图像进行分类。
运行代码
# 导入所需的库
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
# 定义训练数据集
x_train = torch.tensor([[5.1], [5.3], [5.5], [5.7], [5.9], [6.1], [6.3], [6.5], [6.7], [6.9]], dtype=torch.float32)
y_train = torch.tensor([[47.8], [50.2], [52.6], [55.0], [57.4], [59.8], [62.2], [64.6], [67.0], [69.4]], dtype=torch.float32)
# 定义模型结构
class LinearRegression(nn.Module):
def __init__(self):
super(LinearRegression, self).__init__()
self.linear = nn.Linear(1, 1) # 输入特征数为1,输出特征数为1
def forward(self, x):
y_pred = self.linear(x)
return y_pred
# 创建模型实例
model = LinearRegression()
# 定义损失函数和优化器
criterion = nn.MSELoss() # 均方误差损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # SGD优化器
# 训练模型
num_epochs = 1000
losses = []
for epoch in range(num_epochs):
y_pred = model(x_train)
loss = criterion(y_pred, y_train)
losses.append(loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (epoch+1) % 100 == 0:
print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}")
# 可视化训练损失
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss')
plt.show()
# 在测试集上评估模型性能
x_test = torch.tensor([[5.0], [6.0], [7.0]], dtype=torch.float32)
y_test = torch.tensor([[46.2], [60.6], [75.0]], dtype=torch.float32)
with torch.no_grad():
y_pred = model(x_test)
accuracy = ((y_pred - y_test) / y_test).abs().mean() * 100
print(f"Test Accuracy: {accuracy:.2f}%")
# 可视化预测结果
plt.scatter(x_train.numpy(), y_train.numpy(), color='blue', label='Training Data')
plt.scatter(x_test.numpy(), y_test.numpy(), color='red', label='Testing Data')
plt.plot(x_train.numpy(), model(x_train).detach().numpy(), color='green', label='Fitted Line')
plt.legend()
plt.show()
结果: