TSK 模糊系统预测未来石油产量:案例分析和代码实现
使用 TSK 模糊系统预测未来石油产量:案例分析和代码实现
本文将使用 TSK 模糊系统预测未来石油产量,并提供一个 Python 代码示例来演示该方法。
数据准备
首先,我们需要准备石油产量数据。这里我们使用一个包含 40 年石油产量数据的样本数据集,该数据集包含煤炭、天然气、其他和石油四个成分的比例。
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
from scipy.stats import t
# 成分数据矩阵
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.762, 0.17, 0.047, 0.021],
[0.76, 0.171, 0.047, 0.021],
[0.762, 0.166, 0.051, 0.021],
[0.761, 0.171, 0.048, 0.02],
[0.757, 0.175, 0.049, 0.019],
[0.747, 0.182, 0.052, 0.019],
[0.75, 0.174, 0.057, 0.019],
[0.746, 0.175, 0.061, 0.018],
[0.747, 0.18, 0.055, 0.018],
[0.715, 0.204, 0.062, 0.017],
[0.696, 0.215, 0.067, 0.022],
[0.68, 0.232, 0.066, 0.022],
[0.661, 0.246, 0.068, 0.025],
[0.653, 0.243, 0.077, 0.027],
[0.661, 0.234, 0.078, 0.027],
[0.702, 0.201, 0.074, 0.023],
[0.702, 0.199, 0.076, 0.023],
[0.724, 0.178, 0.074, 0.024],
[0.724, 0.175, 0.074, 0.027],
[0.725, 0.17, 0.075, 0.03],
[0.715, 0.167, 0.084, 0.034],
[0.716, 0.164, 0.085, 0.035],
[0.692, 0.174, 0.094, 0.04],
[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]])
# 转换为特征矩阵(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', 'Gas', 'Others', 'Petroleum'])
# 目标变量(LCC方法将1改成234)
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.13, random_state=42)
TSK 模糊系统模型
我们使用 Python 的 fuzzylogic 库来构建 TSK 模糊系统模型。TSK 模型使用高斯函数作为隶属度函数,并使用线性函数作为推理规则。
from fuzzylogic import *
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
# 创建TSK模型对象
model = TSK_FS(n_cluster=20, C=0.1)
# 拟合模型
model.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 输出预测结果
print('预测结果:', y_pred)
# 计算CRMSE和CMAPE
crmse = np.sqrt(mean_squared_error(y_test, y_pred))
cmape = np.mean(np.abs((y_test - y_pred) / y_test)) * 100
print('CRMSE:', crmse)
print('CMAPE:', cmape)
预测未来石油产量
我们使用训练好的 TSK 模型来预测未来 10 年的石油产量。
# 预测未来10年的Petroleum值
num_years = 10
X_future = df_scaled[-1].reshape(1, -1) # 使用最后一条数据作为输入
y_future = []
for _ in range(num_years):
y_pred_future = model.predict(X_future)
y_future.append(y_pred_future[0])
X_future[:, 1] = y_pred_future # 更新输入的第二列为预测值,用于下一次预测
计算预测结果的置信区间
为了更好地评估预测结果,我们计算了未来 10 年石油产量预测值的 95% 置信区间。
# 计算未来10年的Petroleum预测值的95%置信区间
confidence = 0.95
n = len(y_test)
t_value = t.ppf((1 + confidence) / 2, n - 1)
std_dev = np.sqrt(np.sum((y_pred_future - y_test) ** 2) / (n - 1))
margin_of_error = t_value * std_dev / np.sqrt(n)
lower_bound = [y_pred_future - margin_of_error for y_pred_future in y_future]
upper_bound = [y_pred_future + margin_of_error for y_pred_future in y_future]
print('未来10年的Petroleum预测值:')
for year, y_pred_future, lb, ub in zip(range(1, num_years + 1), y_future, lower_bound, upper_bound):
print(f'Year {year}: {y_pred_future:.3f} ({lb:.3f} - {ub:.3f})')
结果分析
通过运行上述代码,我们可以得到未来 10 年石油产量的预测结果及其置信区间。该结果可以帮助我们更好地理解未来石油产量的趋势,并为决策提供参考。
注意
- 本文使用的只是一个简单的示例,实际应用中需要根据具体情况进行调整。
- TSK 模糊系统只是预测未来石油产量的一种方法,还有其他方法可以参考。
- 预测结果的准确性取决于数据质量和模型参数的选择。
结论
本文介绍了使用 TSK 模糊系统预测未来石油产量的方法,并提供了一个 Python 代码示例。该示例使用真实数据演示了如何使用 TSK 模型进行训练和预测,并计算了预测结果的置信区间。TSK 模糊系统是一种灵活且有效的工具,可以应用于各种时间序列预测问题。
原文地址: https://www.cveoy.top/t/topic/8Hj 著作权归作者所有。请勿转载和采集!