import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

def grey_model(X):
    n = len(X)
    X1 = np.cumsum(X)
    Z = np.zeros(n - 1)
    for i in range(1, n):
        Z[i - 1] = -0.5 * (X1[i] + X1[i - 1])
    B = np.vstack((np.ones(n - 1), -0.5 * np.ones(n - 1))).T
    Y = X[1:]
    a, b = np.linalg.lstsq(B, Y, rcond=None)[0]
    X_pred = np.zeros(n)
    X_pred[0] = X[0]
    for i in range(1, n):
        X_pred[i] = (X_pred[i - 1] - b / a) * np.exp(-a) + b / a
    return X_pred

# 成分数据矩阵
# 数据说明:灰色模型适用于短期预测,因此我们选取2012-2018年的数据作为训练集,
#          2019-2022年的数据作为测试集,用于评估模型的预测性能。
data = np.array([
    [0.702, 0.168, 0.084, 0.046],
    [0.685, 0.17, 0.097, 0.048],
    [0.674, 0.171, 0.102, 0.053],
    [0.658, 0.173, 0.113, 0.056],
    [0.638, 0.184, 0.12, 0.058],
    [0.622, 0.187, 0.13, 0.061],
    [0.606, 0.189, 0.136, 0.069],
    [0.59, 0.189, 0.145, 0.076],
    [0.577, 0.19, 0.153, 0.08],
    [0.569, 0.188, 0.159, 0.084],
    [0.559, 0.186, 0.167, 0.088],
    [0.562, 0.179, 0.175, 0.084]
])

# 转换为特征矩阵
feature_matrix = np.zeros((len(data) - 1, len(data[0])))
for i in range(len(data) - 1):
    feature_matrix[i] = data[i + 1] - data[i]

# 构建特征矩阵的DataFrame
df = pd.DataFrame(feature_matrix, columns=['Coal', 'Petroleum', 'Others', 'Gas'])

# 目标变量 (这里选择第二列'Petroleum'作为目标变量)
target = data[1:, 1]

# 数据归一化
scaler = MinMaxScaler()
df_scaled = scaler.fit_transform(df)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    df_scaled, target, test_size=0.4, random_state=42
)

# 在训练集上拟合模型
y_pred_train = grey_model(y_train)

# 创建与训练集目标变量相同大小的预测结果数组
y_pred_train_cumsum = np.zeros_like(y_train)

# 在训练集上进行累加计算
y_pred_train_cumsum[0] = y_train[0]
for i in range(1, len(y_train)):
    y_pred_train_cumsum[i] = y_pred_train_cumsum[i - 1] + y_pred_train[i]

# 在测试集上进行预测
y_pred_test = grey_model(y_test)

# 创建与测试集目标变量相同大小的预测结果数组
y_pred_test_cumsum = np.zeros_like(y_test)

# 在测试集上进行累加计算
y_pred_test_cumsum[0] = y_test[0]
for i in range(1, len(y_test)):
    y_pred_test_cumsum[i] = y_pred_test_cumsum[i - 1] + y_pred_test[i]

# 计算CRMSE和CMAPE
crmse = np.sqrt(mean_squared_error(y_test, y_pred_test_cumsum))
cmape = np.mean(np.abs((y_test - y_pred_test_cumsum) / y_test)) * 100
print('CRMSE:', crmse)
print('CMAPE:', cmape)

这段代码展示了如何使用Python构建灰色预测模型,并将其应用于能源消费结构预测。

代码解释:

  1. 导入必要的库: 包括NumPy用于数值计算,Pandas用于数据处理,MinMaxScaler用于数据归一化,train_test_split用于划分训练集和测试集,mean_squared_error用于计算均方误差。
  2. 定义grey_model函数: 该函数实现了灰色预测模型的核心算法。
  3. 准备数据: 包括加载数据、数据预处理(转换为特征矩阵、数据归一化)、划分训练集和测试集等步骤。
  4. 模型训练: 在训练集上拟合灰色预测模型。
  5. 模型预测: 使用训练好的模型对测试集进行预测。
  6. 模型评估: 使用CRMSE和CMAPE指标评估模型的预测精度。

关键词解释:

  • 灰色预测模型: 一种基于数据序列自身信息进行预测的模型,适用于数据量较少、信息不完全的情况。
  • CRMSE (Root Mean Squared Error): 均方根误差,用于衡量预测值与真实值之间的偏差。
  • CMAPE (Mean Absolute Percentage Error): 平均绝对百分比误差,用于衡量预测值与真实值之间的相对偏差。

希望这段代码和解释能够帮助你理解如何使用Python构建灰色预测模型,并将其应用于能源消费结构预测。

Python灰色预测模型:能源消费结构预测与评估

原文地址: https://www.cveoy.top/t/topic/oag 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录