MATLAB R2021B环境下基于Takagi-Sugeno-Kang模糊神经网络的时间序列...
MATLAB环境下一种基于Takagi Sugeno Kang型模糊神经网络的时间序列预测方法(以hopkinsirandeath数据集为例)。 算法运行环境为MATLAB R2021B,采用Takagi Sugeno Kang模糊神经网络对时间序列进行预测,以hopkinsirandeat数据为例进行说明。 压缩包=程序+数据+参考。 dat=load('hopkinsirandeath.txt')'; dat1=load('hopkinsiranconfirmed.txt')'; dat2=load('hopkinsiranrecovered.txt')';
最近在折腾时间序列预测的时候,发现TSK模糊神经网络这个组合拳挺有意思的。就拿伊朗的新冠死亡数据(hopkinsirandeath.txt)当例子,咱们一起看看怎么用MATLAB玩转这个预测模型。
先看数据长啥样。把三个数据集都加载进来转置一下,方便后续处理:
dat = load('hopkinsirandeath.txt')'; dat1 = load('hopkinsiranconfirmed.txt')'; dat2 = load('hopkinsiranrecovered.txt')';这里转置操作主要是为了适配后续神经网络输入需要的维度格式。实际用的时候建议先做个归一化,毕竟不同指标的数值量级可能差得离谱。
接下来是核心的TSK模型搭建。MATLAB自带的Fuzzy Logic工具箱里有现成的工具,咱们用genfis生成初始模糊推理系统:
numMFs = 3; % 隶属函数个数 inputDelay = 1:2; % 输入延迟 tskOpt = genfisOptions('SubtractiveClustering'); initialFIS = genfis(dat(:,1:end-1), dat(:,2:end), tskOpt);这段代码有几个需要注意的点:inputDelay设定了用前两个时间步的数据预测下一步,相当于构建了一个动态系统。genfisOptions这里用了减法聚类来自动确定规则数,比手动指定规则更智能些。
MATLAB环境下一种基于Takagi Sugeno Kang型模糊神经网络的时间序列预测方法(以hopkinsirandeath数据集为例)。 算法运行环境为MATLAB R2021B,采用Takagi Sugeno Kang模糊神经网络对时间序列进行预测,以hopkinsirandeat数据为例进行说明。 压缩包=程序+数据+参考。 dat=load('hopkinsirandeath.txt')'; dat1=load('hopkinsiranconfirmed.txt')'; dat2=load('hopkinsiranrecovered.txt')';
训练环节用的是经典的ANFIS算法:
epochs = 50; trnOpt = anfisOptions('InitialFIS', initialFIS, 'EpochNumber', epochs); trnFIS = anfis(dat(:,1:end-1), dat(:,2:end), trnOpt);训练过程中可以实时观察误差下降曲线。如果发现误差没明显下降,可能需要调整隶属函数类型或者增加训练轮次。这里有个小技巧:把训练过程包装在try-catch块里,防止程序崩掉。
预测部分就比较直接了:
predicted = evalfis(trnFIS, dat(:,end)); figure plot([dat(end) predicted]) legend('真实值','预测值')不过实际操作中发现,直接拿原始数据训练效果可能翻车。最好做一下数据滑动窗口处理,像这样生成输入输出对:
lookback = 5; % 回溯窗口 for i = 1:length(dat)-lookback inputData(i,:) = dat(i:i+lookback-1); targetData(i) = dat(i+lookback); end这种处理方式相当于让模型学会根据前5天的数据预测第6天的数值,对波动剧烈的时间序列特别有效。
跑完整个流程后,建议计算几个关键指标:
rmse = sqrt(mean((predicted - dat_test).^2)); mae = mean(abs(predicted - dat_test)); fprintf('RMSE: %.2f, MAE: %.2f\n', rmse, mae);在伊朗死亡数据上跑出来的典型结果,RMSE大概在15-20之间波动。不过要注意这个数据集本身存在不少突变点,建议配合异常检测做预处理。
最后吐槽下遇到的坑:TSK模型对初始参数敏感,有时候换个隶属函数类型结果能差出一倍。还有内存管理的问题,数据量大的时候记得用pack命令清理内存碎片。完整代码包里有数据预处理、模型调参和可视化模块,需要自取。
