偏最小二乘方法、ARX模型、有源自回归-神经网络结构建立ARX-NN模型、神经网络模型学习

在例子中用到的库

我这里用到的版本是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()
结果:

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于期望最大化算法的有源自回归(ARX)模型参数估计是通过最大化模型对观测数据的可能性来估计模型的参数。ARX模型是一种线性自回归模型,常用于时间序列分析和预测。 ARX模型可以表示为: y(t) = a1*y(t-1) + a2*y(t-2) + ... + an*y(t-n) + b1*u(t-1) + b2*u(t-2) + ... + bn*u(t-n) + e(t) 其中,y(t)是系统的输出,u(t)是系统的输入,a1到an是模型的自回归系数,b1到bn是模型的外部输入系数,e(t)是系统的随机噪声。 基于期望最大化算法的ARX模型参数估计的步骤如下: 1. 初始化模型参数a和b的初值。 2. 使用当前参数估计值计算预测输出y(t)。 3. 根据预测输出和观测数据计算误差e(t)。 4. 根据误差e(t)和观测数据计算参数估计的期望值。 5. 更新参数估计值。 6. 重复步骤2到5,直到参数估计收敛。 下面是基于期望最大化算法的ARX模型参数估计的MATLAB程序实现示例: ```matlab % 输入数据 u = [1 2 3 4 5]; % 外部输入 y = [0 2 4 6 8]; % 输出 % 初始化参数估计值 a = [0.5 0.5]; % 自回归系数 b = [0.5 0.5]; % 外部输入系数 % 迭代计算参数估计 epsilon = 0.001; % 设定收敛阈值 converged = false; while ~converged y_hat = zeros(size(y)); for t = 3:length(y) y_hat(t) = a(1)*y(t-1) + a(2)*y(t-2) + b(1)*u(t-1) + b(2)*u(t-2); % 计算预测输出 end e = y - y_hat; % 计算误差 a_new = (y(3:end)'*[y(2:end-1) y(1:end-2)]') / (y(2:end-1)'*[y(2:end-1) y(1:end-2)]'); % 更新自回归系数 b_new = (y(3:end)'*[u(2:end-1) u(1:end-2)]') / (u(2:end-1)'*[u(2:end-1) u(1:end-2)]'); % 更新外部输入系数 if max(abs(a_new - a), abs(b_new - b)) < epsilon % 判断是否收敛 converged = true; end a = a_new; % 更新参数估计值 b = b_new; end % 输出参数估计结果 disp("自回归系数: " + a) disp("外部输入系数: " + b) ``` 以上MATLAB程序是通过迭代计算最大化ARX模型的可能性函数来估计模型的参数。程序根据输入数据和初始参数估计值,重复计算预测输出和误差,并更新参数估计值,直到参数收敛。最终输出估计得到的自回归系数和外部输入系数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值