经典算法-粒子群算法的python实现

经典算法-粒子群算法的python实现

粒子群算法的思想源于对鸟群觅食行为的研究,鸟群通过集体的信息共享使群体找到最优的目的地。

设想这样一个场景:鸟群在森林中随机搜索食物,它们想要找到食物量最多的位置。但是所有的鸟都不知道食物具体在哪个位置,只能感受到食物大概在哪个方向。每只鸟沿着自己判定的方向进行搜索,并在搜索的过程中记录自己曾经找到过食物且量最多的位置,同时所有的鸟都共享自己每一次发现食物的位置以及食物的量,这样鸟群就知道当前在哪个位置食物的量最多。在搜索的过程中每只鸟都会根据自己记忆中食物量最多的位置和当前鸟群记录的食物量最多的位置调整自己接下来搜索的方向。鸟群经过一段时间的搜索后就可以找到森林中哪个位置的食物量最多(全局最优解)。

随着深度学习,大模型的AI算法技术发展,算法处理能力越来越强大,可以查阅相关文章:

LLM大模型相关文章:

GPT实战系列-ChatGLM3本地部署CUDA11+1080Ti+显卡24G实战方案

GPT实战系列-Baichuan2本地化部署实战方案

GPT实战系列-如何用自己数据微调ChatGLM2模型训练

GPT实战系列-大话LLM大模型训练

GPT实战系列-ChatGLM2模型的微调训练参数解读

GPT实战系列-探究GPT等大模型的文本生成

GPT实战系列-Baichuan2等大模型的计算精度与量化

GPT实战系列-GPT训练的Pretraining,SFT,Reward Modeling,RLHF

GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(二)

GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(一)

群鸟觅食其实是一个最佳决策的过程, 与人类决策的过程相似。Boyd和Re chars on探索了人类的决策过程,并提出了个体学习和文化传递的概念。根据他们的研究成果,人们在决策过程中常常会综合两种重要的信息:第一种是他们自己的经验,即他们根据以前自己的尝试和经历,已经积累了一定的经验,知道怎样的状态会比较好;第二种是其他人的经验,即从周围人的行为获取知识,从中知道哪些选择是正面的,哪些选择是消极的。

同样的道理,群鸟在觅食的过程中,每只鸟的初始状态都处于随机位置,且飞翔的方向也是随机的。每只鸟都不知道食物在哪里,但是随着时间的推移,这些初始处于随机位置的鸟类通过群内相互学习、信息共享和个体不断积累字觅食物的经验,自发组织积聚成一个群落,并逐渐朝唯一的目标-—食物前进。每只鸟能够通过一定经验和信息估计目前所处的位置对于能寻找到食物有多大的价值,即多大的适应值;每只鸟能够记住自己所找到的最好位置,称之为局部最优(p best) 。此外, 还能记住群鸟中所有个体所能找到的最好位置, 称为全局最优(g best) , 整个鸟群的觅食中心都趋向全局最优移动, 这在生物学上称之为“同步效应”。通过鸟群觅食的位置不断移动,即不断迭代,可以使鸟群朝食物步步进逼。

算法流程

PSO算法设计的具体步骤如下:

步骤1:初始化粒子群(速度和位置)、惯性因子、加速常数、最大迭代次数、算法终止的最小允许误差。

步骤2:评价每个粒子的初始适应值。

步骤3:将初始适应值作为当前每个粒子的局部最优值,并将各适应值对应的位置作为每个粒子的局部最优值所在的位置。

步骤4:将最佳初始适应值作为当前全局最优值,并将最佳适应值对应的位置作为全局最优值所在的位置。

步骤5:依据式(8-1)更新每个粒子当前的飞翔速度。

步骤6对每个粒子的飞翔速度进行限幅处理,使之不能超过设定的最大飞翔速度。

步骤7依据式(8-2)更新每个粒子当前所在的位置。

步骤8比较当前每个粒子的适应值是否比历史局部最优值好,如果好,则将当前粒子适应值作为粒子的局部最优值,其对应的位置作为每个粒子的局部最优值所在的位置。

步骤9在当前群中找出全局最优值,并将当前全局最优值对应的位置作为粒子群的全局最优值所在的位置。

步骤10:重复步骤(5)~(9),直到满足设定的最小误差或最大迭代次数

步骤11:输出粒子群的全局最优值和其对应的位置以及每个粒子的局部最优值和其对应的位置。

初始化粒子群参数

def __init__(self, population_size, max_steps):
    self.w = 0.6  # 惯性权重
    self.c1 = self.c2 = 2
    self.population_size = population_size  # 粒子群数量
    self.dim = 2  # 搜索空间的维度
    self.max_steps = max_steps  # 迭代次数
    self.x_bound = [-10, 10]  # 解空间范围
    self.x = np.random.uniform(self.x_bound[0], self.x_bound[1],
                               (self.population_size, self.dim))  # 初始化粒子群位置
    self.v = np.random.rand(self.population_size, self.dim)  # 初始化粒子群速度
    fitness = self.calculate_fitness(self.x)
    self.p = self.x  # 个体的最佳位置
    self.pg = self.x[np.argmin(fitness)]  # 全局最佳位置
    self.individual_best_fitness = fitness  # 个体的最优适应度
    self.global_best_fitness = np.min(fitness)  # 全局最佳适应度

更新粒子群个体

	# 需要更新的个体
    update_id = np.greater(self.individual_best_fitness, fitness)
    self.p[update_id] = self.x[update_id]
    self.individual_best_fitness[update_id] = fitness[update_id]

动力参数更新

	# 更新速度和权重
    self.v = self.w*self.v+self.c1*r1*(self.p-self.x)+self.c2*r2*(self.pg-self.x)
    self.x = self.v + self.x
    plt.clf()
    plt.scatter(self.x[:, 0], self.x[:, 1], s=30, color='k')
    plt.xlim(self.x_bound[0], self.x_bound[1])
    plt.ylim(self.x_bound[0], self.x_bound[1])
    plt.pause(0.01)
    fitness = self.calculate_fitness(self.x)

更新最优解

# 新一代出现了更小的fitness,所以更新全局最优fitness和位置
    if np.min(fitness) < self.global_best_fitness:
        self.pg = self.x[np.argmin(fitness)]
        self.global_best_fitness = np.min(fitness)

python简单实现

import numpy as np
import matplotlib.pyplot as plt
 
 
class PSO(object):
    def __init__(self, population_size, max_steps):
        self.w = 0.6  # 惯性权重
        self.c1 = self.c2 = 2
        self.population_size = population_size  # 粒子群数量
        self.dim = 2  # 搜索空间的维度
        self.max_steps = max_steps  # 迭代次数
        self.x_bound = [-10, 10]  # 解空间范围
        self.x = np.random.uniform(self.x_bound[0], self.x_bound[1],
                                   (self.population_size, self.dim))  # 初始化粒子群位置
        self.v = np.random.rand(self.population_size, self.dim)  # 初始化粒子群速度
        fitness = self.calculate_fitness(self.x)
        self.p = self.x  # 个体的最佳位置
        self.pg = self.x[np.argmin(fitness)]  # 全局最佳位置
        self.individual_best_fitness = fitness  # 个体的最优适应度
        self.global_best_fitness = np.min(fitness)  # 全局最佳适应度
 
    def calculate_fitness(self, x):
        return np.sum(np.square(x), axis=1)
 
    def evolve(self):
        fig = plt.figure()
        for step in range(self.max_steps):
            r1 = np.random.rand(self.population_size, self.dim)
            r2 = np.random.rand(self.population_size, self.dim)

            # 更新速度和权重
            self.v = self.w*self.v+self.c1*r1*(self.p-self.x)+self.c2*r2*(self.pg-self.x)
            self.x = self.v + self.x
            plt.clf()
            plt.scatter(self.x[:, 0], self.x[:, 1], s=30, color='k')
            plt.xlim(self.x_bound[0], self.x_bound[1])
            plt.ylim(self.x_bound[0], self.x_bound[1])
            plt.pause(0.01)
            fitness = self.calculate_fitness(self.x)

            # 需要更新的个体
            update_id = np.greater(self.individual_best_fitness, fitness)
            self.p[update_id] = self.x[update_id]
            self.individual_best_fitness[update_id] = fitness[update_id]

            # 新一代出现了更小的fitness,所以更新全局最优fitness和位置
            if np.min(fitness) < self.global_best_fitness:
                self.pg = self.x[np.argmin(fitness)]
                self.global_best_fitness = np.min(fitness)
            print('best fitness: %.5f, mean fitness: %.5f' % (self.global_best_fitness, np.mean(fitness)))
 
 
pso = PSO(100, 100)
pso.evolve()
plt.show()

优化计算结果:

best fitness: 0.00000, mean fitness: 0.00771

觉得有用 收藏 收藏 收藏

点个赞 点个赞 点个赞

End


GPT专栏文章:

GPT实战系列-ChatGLM3本地部署CUDA11+1080Ti+显卡24G实战方案

GPT实战系列-LangChain + ChatGLM3构建天气查询助手

大模型查询工具助手之股票免费查询接口

GPT实战系列-简单聊聊LangChain

GPT实战系列-大模型为我所用之借用ChatGLM3构建查询助手

GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(二)

GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(一)

GPT实战系列-ChatGLM2模型的微调训练参数解读

GPT实战系列-如何用自己数据微调ChatGLM2模型训练

GPT实战系列-ChatGLM2部署Ubuntu+Cuda11+显存24G实战方案

GPT实战系列-Baichuan2本地化部署实战方案

GPT实战系列-Baichuan2等大模型的计算精度与量化

GPT实战系列-GPT训练的Pretraining,SFT,Reward Modeling,RLHF

GPT实战系列-探究GPT等大模型的文本生成-CSDN博客

你可能感兴趣的:(金融风控,机器学习,GPT实战系列,粒子群算法,经典算法,人工智能,python,优化算法,LLM,启发式算法)