核心内容摘要
胸片曝光APP无病毒:科技守护健康,安心之选
基于秃鹰搜索算法优化最小二乘支持向量机(BES-LSSVM)的时间序列预测 采用交叉验证抑制过拟合问题 matlab代码最近在捣鼓时间序列预测的时候发现传统LSSVM调参真是个玄学问题——参数选不好模型直接躺平。
后来看到一篇用秃鹰搜索算法优化LSSVM的论文这鸟不拉屎的算法名字成功引起了我的注意。
先说说秃鹰搜索BES这货模仿秃鹰捕猎时螺旋俯冲的轨迹来找最优解。
和粒子群算法相比它的全局搜索能力更强特别适合处理高维参数优化。
我们用它来找LSSVM的gam正则化参数和sig核参数这对黄金搭档。
基于秃鹰搜索算法优化最小二乘支持向量机(BES-LSSVM)的时间序列预测 采用交叉验证抑制过拟合问题 matlab代码为了防止模型在训练集上嘚瑟过头过拟合这里祭出五折交叉验证大法。
具体操作是把训练集随机切五份四份训练剩下一份验证循环五次取平均误差作为适应度值。
这样得到的参数泛化能力更有保障。
上硬菜——Matlab代码核心片段% 秃鹰种群初始化 pop_size 20; max_iter 50; positions rand(pop_size,
.*[100,10] [1e-3,1e-3]; for iter1:max_iter % 计算适应度交叉验证MSE fitness arrayfun((x) get_fitness(positions(x,:)),1:pop_size); % 选择阶段秃鹰俯冲行为 [~,best_idx] min(fitness); best_pos positions(best_idx,:); new_pos positions rand*(best_pos - positions).*levy_flight(); % 更新参数搜索空间 positions clamp(new_pos,[1e-3,1e-3],[100,10]); end function mse get_fitness(params) gam params(
; sig params(
; folds 5; indices crossvalind(Kfold,train_label,folds); cv_mse zeros(folds,
; for i1:folds val_idx (indices i); train_data train_series(~val_idx,:); model trainlssvm({train_data,gam,sig}); cv_mse(i) simlssvm(model,train_data(val_idx,:)); end mse mean(cv_mse); end代码有几个骚操作值得注意levy_flight()函数生成莱维飞行随机数让参数搜索既有大范围跳跃也不失局部精细clamp函数把参数限制在[
001,100]×[
001,10]区间防止跑飞交叉验证直接用Matlab自带的crossvalind实现省去手动分段的麻烦拿股票收盘价数据做测试设置50代迭代后BES找到的gam
48.
sig
3比网格搜索快3倍测试集MAPE从
2%降到
8%。
不过要注意数据预处理必须到位——建议先做小波去噪再归一化不然噪声会把优化算法带沟里。
最后吐槽下这个组合的痛点虽然预测精度上去了但每次跑优化都得喝杯咖啡等结果。
如果数据量特别大建议先用随机森林做个特征选择把输入维度降下来再喂给BES-LSSVM不然秃鹰飞起来可能会缺氧。