1.初始化种群: 随机生成一组个体(解决方案)作为初始种群。 2.评估适应度: 对每个个体进行适应度评估,衡量其在问题空间中的优劣程度。 3.选择: 通过一定的选择策略(如轮盘赌、锦标赛等)从当前种群中选择出优良的个体,作为繁殖下一代的父代。 4.交叉: 对选出的父代进行交叉操作,生成新的个体。 5.变异: 对新生成的个体进行一定概率的变异,引入新的遗传信息。 6.更新种群: 将新生成的个体与原种群进行比较,选择一定数量的优秀个体进入下一代种群。 7.重复迭代: 重复以上步骤直至达到停止条件(如达到最大迭代次数、达到满意解等)。
优点:
并行性高:易于并行化处理,加速搜索过程。 适用性广:适用于各种类型的优化问题。 不受局部最优解限制:能够避免陷入局部最优解,具有较强的全局搜索能力。
缺点:
参数调整难度大:需要合适的参数设置才能获得良好的结果。 需要大量计算资源:对于复杂问题,需要大量的计算资源和时间。 不保证收敛性:无法保证一定能够找到最优解,而是以一定概率搜索到最优解或较好解。
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)
1.初始化粒子群: 随机生成一组粒子(解决方案),每个粒子有自己的位置和速度。 2.评估适应度: 对每个粒子进行适应度评估,衡量其在问题空间中的优劣程度。 3.更新个体最优解: 对于每个粒子,根据其自身历史最优解和当前位置的适应度,更新个体最优解。 4.更新全局最优解: 从所有粒子的个体最优解中选择全局最优解。 5.更新速度和位置: 根据个体和全局最优解,更新每个粒子的速度和位置。 6.重复迭代: 重复以上步骤直至达到停止条件(如达到最大迭代次数、达到满意解等)。
优点:
简单易实现:算法结构相对简单,易于理解和实现。 适用范围广:适用于多种类型的优化问题,如连续型和离散型优化问题。 不需要梯度信息:与一些传统的优化算法(如梯度下降)相比,PSO不需要梯度信息,因此适用于非光滑、高度非线性的优化问题。
缺点:
参数敏感性:需要合适的参数设置才能获得良好的结果,如粒子数量、惯性权重等。 可能陷入局部最优解:在某些情况下,由于算法本身的局限性,可能陷入局部最优解而无法全局搜索。 收敛速度慢:相较于一些进化算法(如遗传算法),PSO 的收敛速度可能较慢。
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)