基于改进TSK模糊模型的能源消费预测与置信区间估计
基于改进TSK模糊模型的能源消费预测与置信区间估计
能源消费预测是能源规划和管理的重要组成部分。传统的预测方法通常难以处理能源消费数据中的非线性和不确定性。为了解决这些问题,本文提出了一种基于改进TSK模糊模型的能源消费预测方法,并通过计算置信区间来评估预测结果的可靠性。
1. TSK模糊模型
TSK模糊模型是一种基于规则的模糊推理系统,它使用模糊集合和模糊规则来描述输入和输出之间的关系。与传统的模糊逻辑系统不同,TSK模糊模型的规则结论是输入变量的线性函数,这使得它能够更好地处理复杂非线性系统。
2. 模型改进
本文对传统的TSK模糊模型进行了一些改进,以提高其预测精度和泛化能力:
- 使用FCM算法进行聚类: 使用FCM聚类算法对输入数据进行聚类,并将聚类中心作为模糊规则的前件部分。* 添加正则化项: 在模型训练过程中添加正则化项,以防止过拟合。
3. 置信区间估计
为了评估预测结果的可靠性,本文使用置信区间来表示预测值的范围。置信区间是根据预测误差的分布计算得到的,它表示在一定的置信水平下,真实值落在这个范围内的概率。
4. Python代码实现
以下是基于改进TSK模糊模型的能源消费预测和置信区间估计的Python代码实现:pythonimport numpy as npimport pandas as pdfrom sklearn.preprocessing import MinMaxScalerfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import mean_squared_errorimport skfuzzy as fuzz
class TSK_FS(): def init(self, n_cluster=20, C=0.1): self.n_cluster = n_cluster self.lamda = C self.trained = False
def fit(self, X_train, y_train): n_samples, n_features = X_train.shape n_cluster = self.n_cluster assert (n_samples == len(y_train)), 'X_train and y_train samples num must be same' centers, delta = self.__fcm__(X_train, n_cluster) self.centers = centers self.delta = delta xg = self.__gaussian_feature__(X_train, centers, delta) xg1 = np.dot(xg.T, xg) pg = np.linalg.pinv(xg1 + self.lamda * np.eye(xg1.shape[0])).dot(xg.T).dot(y_train) self.pg = pg self.trained = True
def predict(self, X_test): assert(self.trained), 'Error when predict, use fit first!' xg_test = self.__gaussian_feature__(X_test, self.centers, self.delta) y_pred = xg_test.dot(self.pg) return y_pred
def __fcm__(self, data, n_cluster): n_samples, n_features = data.shape centers, mem, _, _, _, _, _ = fuzz.cmeans( data.T, n_cluster, 2.0, error=1e-5, maxiter=200)
delta = np.zeros([n_cluster, n_features]) for i in range(n_cluster): d = (data - centers[i, :]) ** 2 delta[i, :] = np.sum(d * mem[i, :].reshape(-1, 1), axis=0) / np.sum(mem[i, :])
return centers, delta
def __gaussian_feature__(self, data, centers, delta): n_cluster = self.n_cluster n_samples = data.shape[0] mu_a = np.zeros([n_samples, n_cluster]) for i in range(n_cluster): tmp_k = 0 - np.sum((data - centers[i, :]) ** 2 / delta[i, :], axis=1) mu_a[:, i] = np.exp(tmp_k) mu_a = mu_a / np.sum(mu_a, axis=1, keepdims=True) data_1 = np.concatenate((data, np.ones([n_samples, 1])), axis=1) zt = [] for i in range(n_cluster): zt.append(data_1 * mu_a[:, i].reshape(-1, 1)) data_fs = np.concatenate(zt, axis=1) data_fs = np.where(data_fs != data_fs, 1e-5, data_fs) return data_fs
成分数据矩阵data = np.array([[0.758, 0.171, 0.049, 0.022], [0.758, 0.172, 0.047, 0.023], [0.762, 0.17, 0.047, 0.021], # ... 数据集 [0.559, 0.186, 0.167, 0.088], [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]
构建特征矩阵的DataFramedf = pd.DataFrame(feature_matrix, columns=['Coal', 'Petroleum', 'Others', 'Gas'])
目标变量(LCC方法将1改成234)target = data[1:, 0] # 使用第一列作为目标变量
数据归一化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模型对象model = TSK_FS(n_cluster=20, C=0.1)# 拟合模型model.fit(X_train, y_train)
在测试集上进行预测y_pred = model.predict(X_test)
计算RMSErmse = np.sqrt(mean_squared_error(y_test, y_pred))print('RMSE:', rmse)
构建未来10年的特征矩阵future_features = np.zeros((10, len(data[0])-1))current_data = data[-1, 1:] # 使用最后一行数据的除Coal外的特征作为当前数据
根据模型预测未来十年的特征for i in range(10): feature = model.predict(current_data.reshape(1, -1)) # 使用模型预测特征 future_features[i] = np.concatenate(([feature[0]], current_data)) # 更新特征矩阵 current_data = np.concatenate((current_data[1:], feature)) # 更新当前数据
归一化未来的特征数据future_scaled = scaler.transform(future_features)
使用TSK_FLS模型预测未来十年的目标变量future_pred = model.predict(future_scaled)
计算置信区间residuals = y_test - y_predmean_residuals = np.mean(residuals)std_residuals = np.std(residuals)n_samples = len(future_pred)z_score = 1.96 # 对应于95%的置信区间margin_of_error = z_score * std_residuals / np.sqrt(n_samples)
lower_bound = future_pred - margin_of_errorupper_bound = future_pred + margin_of_error
输出未来十年的预测置信区间print('未来十年的预测置信区间:')for i in range(len(future_pred)): print(f'年份: {i+1}, 下界: {lower_bound[i]}, 上界: {upper_bound[i]}')
5. 结论
本文提出了一种基于改进TSK模糊模型的能源消费预测方法,并通过计算置信区间来评估预测结果的可靠性。该方法能够有效地处理能源消费数据中的非线性和不确定性,并提供可靠的预测结果。
注意
- 请将代码中的示例数据替换为您的实际数据。* 调整模型参数以获得最佳性能。* 置信区间的计算基于一定的假设,实际应用中需要根据具体情况进行调整。
原文地址: https://www.cveoy.top/t/topic/7D6 著作权归作者所有。请勿转载和采集!