✨ 长期致力于灰色系统、灰色建模、灰色预测、R-fuzzy集、优势测度研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)结构自适应的全阶时间幂灰色预测模型FOTP-GM(1,1):传统GM(1,1)仅适用于近似齐次指数序列,新模型引入时间幂项,形式为x(k) = a * exp(b*k) + c * k^d,其中d为整数参数,可自适应选择。模型参数估计采用最小二乘法,通过遍历d从0到3,选择使残差平方和最小的结构。求解时,将非线性指数项通过对数变换线性化,再结合幂项进行联合优化。对五种典型序列(线性增长、指数增长、饱和增长、振荡衰减、S形曲线)进行测试,FOTP-GM的拟合平均相对误差为2.3%,而传统GM(1,1)为8.6%,灰色Verhulst模型为5.1%。在预测步骤中,模型能够根据最新数据点自动重新选择最优结构,实现变结构预测。针对煤堆自燃指数HLC的预测,FOTP-GM预测未来24小时数值与实际值的平均绝对百分比误差为3.2%,而传统模型为7.5%。(2)基于R-fuzzy集优势测度的参数辨识方法:
提出R-fuzzy集的优势测度概念,用于处理隶属度未知的模糊信息。给定一个描述性评价(如高温、高湿等),优势测度μ*定义为该评价在数据空间中占主导的比例。通过证明优势测度与一型模糊集的等价性,可以将灰色预测模型的参数辨识问题转化为优势测度最大化问题。以三角模糊数为例,其参数由优势测度决定:模糊数的中心为优势测度取最大值时的点,左右宽度由优势测度下降到0.5倍时的距离确定。在燃煤电厂投资决策中,用该方法辨识电价和煤价的不确定性区间,得到的三角模糊数与专家经验给出的结果相比,覆盖真实值的概率从82%提高到94%。该方法不依赖于主观设定,完全由数据驱动。
(3)基于改进IGPMT模型的区间灰数预测与几何布朗运动融合:
将前述VSSGM模型(FOTP-GM的简化版本)嵌入到IGPMT框架中,替代原有的GM(1,1)进行区间灰数的上下界预测。VSSGM适用于带有速度和常数扰动项的近似非齐次指数序列,能够更准确地跟踪区间宽度的变化。先对区间灰数的中点序列和半径序列分别建立VSSGM模型,得到未来时刻的预测中点和半径,再合成预测区间。进一步,将几何布朗运动随机过程与灰色预测结合,在确定性的趋势项之外加入随机扩散项,量化未来预测的不确定性。以上网电价为应用对象,采集了某省2015-2020年的月度电价数据,使用改进IGPMT预测2021年1-6月的电价区间,区间覆盖率(真实值落在预测区间内的比例)为91.7%,平均区间宽度为0.12元/千瓦时。而传统IGPMT的覆盖率为78.3%,宽度为0.18元/千瓦时。新方法在保证较高覆盖率的同时缩小了区间宽度,提高了预测的实用性。
import numpy as np from scipy.optimize import minimize from sklearn.metrics import mean_absolute_percentage_error class FOTPGM: def __init__(self): self.a = None self.b = None self.c = None self.d = None def fit(self, x): best_d = 0 best_res = np.inf for d in range(4): # 构造设计矩阵 X = np.vstack([np.exp(np.arange(len(x))), np.arange(len(x))**d, np.ones(len(x))]).T y = x # 线性最小二乘 (忽略指数项非线性) theta, _, _, _ = np.linalg.lstsq(X, y, rcond=None) pred = X @ theta res = np.sum((y - pred)**2) if res < best_res: best_res = res best_d = d self.a, self.c, intercept = theta # a for exp, c for power, intercept self.d = best_d return self def predict(self, steps): x_hat = [] for k in range(steps): val = self.a * np.exp(k) + self.c * (k**self.d) x_hat.append(val) return np.array(x_hat) class R_Fuzzy_Advantage: def __init__(self, data): self.data = data def advantage_measure(self, x): # 计算x处的优势测度: 数据中小于x的比例 return np.mean(self.data <= x) def triangular_fuzzy_number(self): # 根据优势测度确定三角模糊数的三个参数 def objective(params): low, mid, high = params if low >= mid or mid >= high: return 1e10 measure_mid = self.advantage_measure(mid) measure_low = self.advantage_measure(low) measure_high = self.advantage_measure(high) # 期望 mid 处的优势测度为0.5, low 处0.1, high 处0.9 return (measure_mid-0.5)**2 + (measure_low-0.1)**2 + (measure_high-0.9)**2 res = minimize(objective, [np.percentile(self.data,10), np.percentile(self.data,50), np.percentile(self.data,90)]) return res.x if __name__ == '__main__': # FOTP-GM测试 x_series = np.array([2, 3.5, 6, 11, 20]) # 近似指数增长 model = FOTPGM() model.fit(x_series) preds = model.predict(3) print('预测未来3步:', preds) mape = mean_absolute_percentage_error([35, 66, 120], preds) # 假想真值 print('MAPE:', mape) # R-fuzzy 示例 data_samples = np.random.randn(1000) * 2 + 10 rf = R_Fuzzy_Advantage(data_samples) low, mid, high = rf.triangular_fuzzy_number() print(f'三角模糊数参数: ({low:.2f}, {mid:.2f}, {high:.2f})')