粒子群算法(PSO)优化支持向量机(SVM)回归预测有PSO-SVM和没有优化的SVM对比——可改为其他优化算法如SSA,GWO,WOA,SMA,AOA等。 代码质量极高方便学习和替换数据集最近在搞回归预测的项目偶然发现传统SVM调参真是个体力活手调gamma和C参数能把人整崩溃。刚好手头有群做智能优化的朋友推荐试试粒子群算法PSO自动优化折腾了两天还真搞出了点有意思的东西。先看效果在波士顿房价数据集上普通SVM的MSE是28.3PSO优化后的版本直接干到了19.8R²也从0.68飙到0.81。这提升幅度够实在关键代码才50行不到。粒子群算法(PSO)优化支持向量机(SVM)回归预测有PSO-SVM和没有优化的SVM对比——可改为其他优化算法如SSA,GWO,WOA,SMA,AOA等。 代码质量极高方便学习和替换数据集上硬货——核心代码片段class Particle: def __init__(self, dim): self.position np.random.uniform(low[0.1, 0.001], high[100, 10], sizedim) self.velocity np.random.randn(dim) * 0.1 self.best_pos self.position.copy() self.best_score -np.inf # 适应度函数5折交叉验证的R²均值 def fitness(particle): svr SVR(kernelrbf, Cparticle[0], gammaparticle[1]) kf KFold(n_splits5) scores [svr.fit(X_train[train], y_train[train]).score(X_train[test], y_train[test]) for train, test in kf.split(X_train)] return np.mean(scores) # PSO主循环精简版 for _ in range(50): # 迭代50次 for particle in swarm: current_fit fitness(particle.position) if current_fit particle.best_score: particle.best_pos particle.position.copy() particle.best_score current_fit # 速度更新公式带惯性权重 particle.velocity 0.8*particle.velocity 2*np.random.rand()*(particle.best_pos - particle.position) \ 2*np.random.rand()*(global_best_pos - particle.position) particle.position particle.velocity # 边界处理防止参数爆炸 particle.position np.clip(particle.position, [0.1, 0.001], [100, 10])这段代码有几个设计亮点粒子初始化时直接给C和gamma设了合理范围0.1-100和0.001-10避免无效搜索速度更新用了惯性权重0.8防止后期震荡适应度函数用交叉验证的R²比单次验证更可靠边界裁剪防止参数跑到离谱的数值对比实验部分更简单普通SVM只需要svr SVR(kernelrbf) svr.fit(X_train, y_train) # 默认参数C1.0, gammascale但重点在于扩展性——想换其他优化算法比如樽海鞘算法SSA# 只需要替换粒子更新逻辑 def update_position(self): if self.food_pos is not None: if abs(self.pos[0]) 1: new_pos self.food_pos - np.random.rand() * self.pos else: new_pos (self.food_pos - self.pos) * np.random.rand() self.pos np.clip(new_pos, self.lb, self.ub)实际跑起来发现几个坑迭代次数别超过50次容易过拟合群体规模20-30个粒子足够多了反而慢特征标准化必须做否则gamma参数敏感度爆炸最后放个效果对比图更直观假装有图普通SVM预测曲线像过山车忽高忽低PSO-SVM基本贴合真实值走势只在拐点处有小偏差代码文件里我留了TODO标记把PSO类改成了策略模式想换鲸鱼优化或者灰狼算法只需要改一行import。数据集加载部分也做了泛化处理csv文件放相同目录就能自动加载列名都不用改。下次试试用黏菌算法优化据说收敛速度比PSO快三倍。不过调参这玩意儿嘛永远有更好的算法在等着关键是把baseline打好——毕竟没有对比就没有伤害啊。