【机器学习|学习笔记】粒子群优化(Particle Swarm Optimization, PSO)详解,附代码。
【机器学习|学习笔记】粒子群优化(Particle Swarm Optimization, PSO)详解,附代码。
文章目录
欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “
学术会议小灵通
”或参考学术信息专栏:https://blog.csdn.net/2401_89898861/article/details/147567533
前言
- PSO 以极少的参数和简单的公式模拟鸟群或鱼群的社会行为,通过粒子间的信息共享不断迭代逼近最优解;
- 自1995年Kennedy和Eberhart提出以来,它因易于实现、无需梯度信息且适用大规模连续优化而广泛流行。
- 本文结合机器学习专业视角,系统回顾PSO的理论基础、主要变体及典型应用,并给出完整的Python示例代码。
起源
- 1995年,James Kennedy(社会心理学家)和Russell Eberhart(电气工程师)首次将社会行为模拟与进化计算相结合,提出了粒子群优化算法,用以模拟鸟群觅食或鱼群游动的群体智能行为,从而在连续空间中进行优化搜索。
- 该算法最初旨在研究社会心理学中的“个体—群体”互动模型,后简化为无隐喻的优化范式。
- PSO的直接学术渊源还包括Craig Reynolds于1987年提出的Boids模型,该模型用简单规则成功模拟鸟群飞行的涡流与聚集现象。
- 1995年Kennedy与Eberhart在IEEE会议上发表的原始论文详细回顾了社会仿真向优化算法演变的各阶段,并展示了PSO在基准函数与工程设计问题上的初步成功。
发展
参数收敛与稳定性分析
- Clerc 和 Kennedy于2002年在IEEE Trans. EC上分析了PSO的“爆炸—收敛”行为,提出了收缩因子(constriction factor)方法,为参数(惯性权重 w w w、学习因子 φ p φₚ φp、 φ g φ_g φg)提供了理论收敛域。
- 这一贡献使PSO在高维空间中的稳定性大幅提升,并成为SPSO‑2011标准的理论基础。
算法变体
- Bare‑Bones PSO:2003年Kennedy提出无需显式速度更新的简化版本,通过正态分布直接采样新位置,降低了参数依赖并在若些测试函数上提升了性能。
- Accelerated PSO (APSO):Yang等人于2011年提出在无速度结构下通过全局最优和随机扰动快速收敛的APSO变体,进一步简化并加速了收敛。
- 多目标与多群体:为解决多目标优化和防止提前收敛,研究者发展了多群体PSO(multi‑swarm)和Pareto‑PSO,使算法能同时逼近Pareto前沿。
- 离散与二值PSO:Kennedy & Eberhart在1997年将PSO推广到二值空间,用于组合优化,后续Clerc等人提出基于集合运算的通用离散PSO理论。
元启发式与混合优化
- PSO常与遗传算法(GA)、差分进化(DE)、贝叶斯优化等方法混合,以利用不同算法优势。例如,将PSO用于GA的初代群体生成,或结合DE的变异策略增强全局搜索能力。
原理
基本算法
- 设目标函数 f : R n → R f:R^n→R f:Rn→R 待最小化。令粒子数为 S S S,第 i i i 个粒子在迭代 t t t 的位置与速度分别为 x i t x_i^t xit 与 v i t v_i^t vit,个体最优位置 p i p_i pi 与群体最优 g g g。更新公式为:
- 其中 r p , r g ∼ U ( 0 , 1 ) r_p ,r_g∼U(0,1) rp,rg∼U(0,1) 为随机向量, w w w 为惯性权重, ϕ p , ϕ g ϕ_p,ϕ_g ϕp,ϕg 为学习因子。惯性权重 w w w 平衡全局与局部搜索,典型取值在 (0.4,0.9);学习因子通常取 1–3。
收敛机制
- PSO通过粒子间共享“最佳位置”信息,使得搜索既保留个体探索性又具备群体协同,随着迭代,速度趋于0而位置收敛至局部或全局最优。
应用
PSO已被成功应用于工程、计算机科学、经济学等众多领域:
- 神经网络训练:用PSO优化权重和结构参数,加速收敛并提升精度。
- 控制系统设计:如PID参数整定、无人机轨迹规划、机器人路径优化。
- 电力负荷预测:结合PSO与支持向量回归(SVR)实现短期负荷精准预测。
- 图像处理:滤波器参数优化、图像分割能量函数最小化。
- 组合优化:旅行商、作业调度、网络拓扑优化等离散和混合问题。
- 经济与金融:资产组合优化、风险管理和策略回测参数调优。
Python代码实现
- 下面给出基于NumPy的简易PSO实现示例,可直接用于任意连续优化问题。
import numpy as np
def pso(func, lb, ub, dim, num_particles=30, max_iter=100, w=0.7, c1=1.5, c2=1.5):
# 初始化
X = np.random.uniform(lb, ub, (num_particles, dim)) # 粒子位置
V = np.random.uniform(-(ub-lb), ub-lb, (num_particles, dim)) # 粒子速度
P = X.copy() # 个体最优位置
Pbest = np.array([func(x) for x in P])
g_idx = np.argmin(Pbest)
G = P[g_idx].copy() # 全局最优位置
for t in range(max_iter):
r1, r2 = np.random.rand(), np.random.rand()
# 更新速度与位置
V = w*V + c1*r1*(P - X) + c2*r2*(G - X)
X = X + V
# 边界处理
X = np.clip(X, lb, ub)
# 更新个体/全局最优
fitness = np.array([func(x) for x in X])
better = fitness < Pbest
P[better] = X[better]
Pbest[better] = fitness[better]
if fitness.min() < Pbest.min():
G = X[fitness.argmin()]
return G, func(G)
# 示例:Rosenbrock 函数优化
def rosen(x):
return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)
best_pos, best_val = pso(rosen, lb=-5, ub=5, dim=3)
print("Best position:", best_pos, "Best value:", best_val)
- 以上代码实现了PSO的核心机制,包括随机初始化、速度/位置更新、个体与全局最优跟踪,以及边界处理,用户可调整参数或替换目标函数以满足不同优化需求。