import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
import skfuzzy as fuzz

# 成分数据矩阵
data = np.array([[0.758, 0.171, 0.049, 0.022],
                 [0.758, 0.172, 0.047, 0.023],
                 ...
                 [0.562, 0.179, 0.175, 0.084]])

# 转换为特征矩阵 (LCC方法将1改成234)
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'])

# 目标变量 (LCC方法将1改成234)
target = data[1:, 3]  # 使用第一列作为目标变量,下次改2、3、4

# 数据归一化
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.13, random_state=42)

# TSK模型参数设置
N = 5  # 集群数
cntr, u_orig, _, _, _, _, _ = fuzz.cluster.cmeans(X_train.T, N, 2, error=0.005, maxiter=1000, init=None)

# TSK模型预测
target_values = np.zeros_like(y_train)
for i in range(len(y_train)):
    alphas = u_orig[:, i]  # 获取隶属度
    rules = np.argmax(u_orig, axis=0)[i]  # 获取控制规则
    target_values[i] = np.mean(y_train) + alphas[rules] * (np.std(y_train) / np.std(y_train[i])) * (y_train[i] - np.mean(y_train))

# CRMSE计算
crmse = np.sqrt(np.mean((np.log1p(y_train) - np.log1p(target_values))**2))

# CMAPE计算
cmape = np.mean(np.abs((y_train - target_values) / (y_train + 1))) * 100

print('CRMSE: ', crmse)
print('CMAPE: ', cmape)

代码说明:

  1. 数据预处理:

    • 使用LCC方法对成分数据进行转换,构建特征矩阵。
    • 使用MinMaxScaler对数据进行归一化。
    • 将数据划分为训练集和测试集。
  2. TSK模糊模型:

    • 使用skfuzzy库中的cmeans函数进行模糊聚类,确定TSK模型的规则库。
    • 根据隶属度和控制规则,计算模型预测值。
  3. 模型评估:

    • 使用CRMSE和CMAPE指标对模型进行评估,并输出结果。

注意:

  • 代码中的成分数据矩阵需要替换为实际数据。
  • 可以根据需要调整TSK模型的参数,例如集群数。
  • 可以使用其他指标对模型进行评估,例如RMSE、MAE等。
基于TSK模糊模型的成分数据预测及Python实现

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

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