首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >遗传算法和粒子群算法简介

遗传算法和粒子群算法简介

原创
作者头像
机器学习司猫白
发布2025-01-21 17:40:34
发布2025-01-21 17:40:34
4330
举报

1.遗传算法GA

一 原理

1.初始化种群: 随机生成一组个体(解决方案)作为初始种群。

2.评估适应度: 对每个个体进行适应度评估,衡量其在问题空间中的优劣程度。

3.选择: 通过一定的选择策略(如轮盘赌、锦标赛等)从当前种群中选择出优良的个体,作为繁殖下一代的父代。

4.交叉: 对选出的父代进行交叉操作,生成新的个体。

5.变异: 对新生成的个体进行一定概率的变异,引入新的遗传信息。

6.更新种群: 将新生成的个体与原种群进行比较,选择一定数量的优秀个体进入下一代种群。

7.重复迭代: 重复以上步骤直至达到停止条件(如达到最大迭代次数、达到满意解等)。

二 优缺点

优点:

并行性高:易于并行化处理,加速搜索过程。

适用性广:适用于各种类型的优化问题。

不受局部最优解限制:能够避免陷入局部最优解,具有较强的全局搜索能力。

缺点:

参数调整难度大:需要合适的参数设置才能获得良好的结果。

需要大量计算资源:对于复杂问题,需要大量的计算资源和时间。

不保证收敛性:无法保证一定能够找到最优解,而是以一定概率搜索到最优解或较好解。

代码示例

代码语言:python
复制
mport numpy as np

from sklearn.datasets import make\_classification

from sklearn.svm import SVC

from sklearn.model\_selection import train\_test\_split

from sklearn.metrics import accuracy\_score

from deap import base, creator, tools, algorithms



# 创建适应度评估函数

def evaluate(individual, X, y):

    gamma = individual[0]

    C = individual[1]

    clf = SVC(gamma=gamma, C=C)

    scores = cross\_val\_score(clf, X, y, cv=5)

    return np.mean(scores),



# 创建适应度评估函数的最小化目标

creator.create("FitnessMin", base.Fitness, weights=(-1.0,))



# 创建个体和群体类

creator.create("Individual", list, fitness=creator.FitnessMin)

toolbox = base.Toolbox()

toolbox.register("attr\_float", np.random.uniform, 0, 5)  # 随机生成参数范围在0到5之间的浮点数

toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr\_float, n=2)

toolbox.register("population", tools.initRepeat, list, toolbox.individual)

toolbox.register("mate", tools.cxBlend, alpha=0.5)  # 交叉算子

toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=0.2, indpb=0.2)  # 变异算子

toolbox.register("select", tools.selTournament, tournsize=3)  # 选择算子

toolbox.register("evaluate", evaluate)



# 生成示例数据

X, y = make\_classification(n\_samples=1000, n\_features=20, n\_classes=2, random\_state=42)



# 划分训练集和测试集

X\_train, X\_test, y\_train, y\_test = train\_test\_split(X, y, test\_size=0.2, random\_state=42)



# 生成初始种群

population = toolbox.population(n=50)



# 迭代进化

NGEN = 10

for gen in range(NGEN):

    offspring = algorithms.varAnd(population, toolbox, cxpb=0.5, mutpb=0.1)

    fits = toolbox.map(toolbox.evaluate, offspring)

    for fit, ind in zip(fits, offspring):

        ind.fitness.values = fit

    population = toolbox.select(offspring, k=len(population))



# 输出最优解

best\_individual = tools.selBest(population, k=1)[0]

best\_gamma, best\_C = best\_individual

print("Best gamma:", best\_gamma)

print("Best C:", best\_C)



# 使用最优参数训练模型

clf = SVC(gamma=best\_gamma, C=best\_C)

clf.fit(X\_train, y\_train)



# 在测试集上评估模型性能

y\_pred = clf.predict(X\_test)

accuracy = accuracy\_score(y\_test, y\_pred)

print("Test Accuracy:", accuracy)

粒子群算法PSO

原理

1.初始化粒子群: 随机生成一组粒子(解决方案),每个粒子有自己的位置和速度。

2.评估适应度: 对每个粒子进行适应度评估,衡量其在问题空间中的优劣程度。

3.更新个体最优解: 对于每个粒子,根据其自身历史最优解和当前位置的适应度,更新个体最优解。

4.更新全局最优解: 从所有粒子的个体最优解中选择全局最优解。

5.更新速度和位置: 根据个体和全局最优解,更新每个粒子的速度和位置。

6.重复迭代: 重复以上步骤直至达到停止条件(如达到最大迭代次数、达到满意解等)。

优缺点

优点:

简单易实现:算法结构相对简单,易于理解和实现。

适用范围广:适用于多种类型的优化问题,如连续型和离散型优化问题。

不需要梯度信息:与一些传统的优化算法(如梯度下降)相比,PSO不需要梯度信息,因此适用于非光滑、高度非线性的优化问题。

缺点:

参数敏感性:需要合适的参数设置才能获得良好的结果,如粒子数量、惯性权重等。

可能陷入局部最优解:在某些情况下,由于算法本身的局限性,可能陷入局部最优解而无法全局搜索。

收敛速度慢:相较于一些进化算法(如遗传算法),PSO 的收敛速度可能较慢。

代码示例

代码语言:python
复制
import numpy as np

from sklearn.datasets import make\_classification

from sklearn.svm import SVC

from sklearn.model\_selection import train\_test\_split

from sklearn.metrics import accuracy\_score

from pyswarm import pso



# 生成示例数据

X, y = make\_classification(n\_samples=1000, n\_features=20, n\_classes=2, random\_state=42)



# 划分训练集和测试集

X\_train, X\_test, y\_train, y\_test = train\_test\_split(X, y, test\_size=0.2, random\_state=42)



# 定义适应度评估函数

def evaluate(parameters, X, y):

    gamma, C = parameters

    clf = SVC(gamma=gamma, C=C)

    clf.fit(X, y)

    y\_pred = clf.predict(X)

    accuracy = accuracy\_score(y, y\_pred)

    return -accuracy  # 负号表示最小化问题



# 定义参数优化的目标函数

def objective\_function(parameters):

    return evaluate(parameters, X\_train, y\_train)



# 设定参数范围

lb = [0.1, 0.1]  # 参数下界

ub = [10, 10]    # 参数上界



# 使用粒子群算法进行优化

parameters, \_ = pso(objective\_function, lb, ub, swarmsize=10, maxiter=20)



# 输出优化后的最优参数

best\_gamma, best\_C = parameters

print("Best gamma:", best\_gamma)

print("Best C:", best\_C)



# 使用最优参数训练模型

clf = SVC(gamma=best\_gamma, C=best\_C)

clf.fit(X\_train, y\_train)



# 在测试集上评估模型性能

y\_pred = clf.predict(X\_test)

accuracy = accuracy\_score(y\_test, y\_pred)

print("Test Accuracy:", accuracy)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.遗传算法GA
    • 一 原理
    • 二 优缺点
    • 代码示例
  • 粒子群算法PSO
    • 原理
    • 优缺点
    • 代码示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档