news 2026/4/23 12:41:59

优化的K均值聚类:遗传、粒子群与差分进化算法在Matlab中的实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
优化的K均值聚类:遗传、粒子群与差分进化算法在Matlab中的实现

聚类Cluster,K均值聚类方法,采用遗传算法Genetic Algorithm (GA),粒子群优化算法Particle Swarm Optimization (PSO),差分进化算法Differential Evolution (DE)进行优化,最小化类内距离,支持自定义k值 matlab代码,自带数据集,可以直接运行

在数据挖掘和机器学习领域,聚类是一种重要的无监督学习技术,它将数据点划分成不同的组,使得同一组内的数据点相似度较高,而不同组之间的相似度较低。K均值聚类是最经典且应用广泛的聚类算法之一,不过它对初始聚类中心敏感,容易陷入局部最优解。为了克服这个问题,我们可以使用遗传算法(GA)、粒子群优化算法(PSO)以及差分进化算法(DE)对K均值聚类进行优化,同时支持自定义k值。下面就基于Matlab自带数据集来展示如何实现。

K均值聚类原理简述

K均值聚类算法的核心目标是最小化类内距离,也就是让每个簇内的数据点尽可能靠近其簇中心。算法大致流程如下:

  1. 随机选择k个初始聚类中心。
  2. 计算每个数据点到各个聚类中心的距离,将数据点分配到距离最近的聚类中心所代表的簇中。
  3. 重新计算每个簇的聚类中心,即该簇内所有数据点的均值。
  4. 重复步骤2和3,直到聚类中心不再变化或者达到最大迭代次数。

优化策略

遗传算法(GA)

遗传算法模拟自然选择和遗传机制,通过选择、交叉和变异操作,在解空间中搜索最优解。对于K均值聚类的优化,我们可以将聚类中心编码为染色体,利用遗传算法不断进化得到更好的初始聚类中心,从而避免K均值聚类陷入局部最优。

粒子群优化算法(PSO)

PSO模拟鸟群觅食行为,每个粒子在解空间中代表一个潜在解,粒子根据自身历史最优位置和群体历史最优位置来更新自己的位置和速度,不断向最优解靠近,以此找到更好的K均值聚类初始中心。

差分进化算法(DE)

DE也是一种基于群体的启发式优化算法,它通过对种群中的个体进行差分变异、交叉操作产生新个体,并根据适应度选择更优个体,逐步逼近全局最优解,同样可以用于优化K均值聚类的初始中心。

Matlab代码实现

下面是一个简单的Matlab代码示例,利用自带的鸢尾花数据集,结合上述优化算法对K均值聚类进行实现,并支持自定义k值。

% 加载鸢尾花数据集 load fisheriris X = meas; % 自定义k值 k = 3; % 遗传算法优化K均值聚类 function [idx, C] = ga_kmeans(X, k) % 定义适应度函数 fitnessFcn = @(centers) kmeans_fitness(X, centers, k); % 编码范围 lb = min(X); ub = max(X); % 种群大小 populationSize = 50; % 变量个数,每个聚类中心有4个维度(鸢尾花数据特征维度) numVars = k * size(X, 2); % 创建遗传算法选项 options = gaoptimset('PopulationSize', populationSize, 'Generations', 100, 'PlotFcns', @gaplotbestf); % 运行遗传算法 [bestCenters, ~] = ga(fitnessFcn, numVars, [], [], [], [], lb, ub, [], options); % 重新调整聚类中心格式 bestCenters = reshape(bestCenters, size(X, 2), k); % 使用优化后的聚类中心进行K均值聚类 [idx, C] = kmeans(X, bestCenters, 'Distance', 'euclidean'); end % 粒子群优化算法优化K均值聚类 function [idx, C] = pso_kmeans(X, k) % 定义适应度函数 fitnessFcn = @(centers) kmeans_fitness(X, centers, k); % 编码范围 lb = min(X); ub = max(X); % 粒子群大小 swarmSize = 50; % 最大迭代次数 maxIter = 100; % 学习因子 c1 = 1.5; c2 = 1.5; % 惯性权重 w = 0.7; % 初始化粒子位置和速度 positions = repmat(lb, swarmSize, 1) + repmat((ub - lb), swarmSize, 1).* rand(swarmSize, k * size(X, 2)); velocities = zeros(swarmSize, k * size(X, 2)); % 个体最优位置和适应度 pbestPositions = positions; pbestFitness = inf(swarmSize, 1); % 全局最优位置和适应度 [gbestFitness, gbestIndex] = min(pbestFitness); gbestPosition = pbestPositions(gbestIndex, :); for iter = 1:maxIter % 计算适应度 fitness = arrayfun(fitnessFcn, mat2cell(positions, ones(swarmSize, 1), k * size(X, 2))); % 更新个体最优 improved = fitness < pbestFitness; pbestPositions(improved, :) = positions(improved, :); pbestFitness(improved) = fitness(improved); % 更新全局最优 [currentBestFitness, currentBestIndex] = min(pbestFitness); if currentBestFitness < gbestFitness gbestFitness = currentBestFitness; gbestPosition = pbestPositions(currentBestIndex, :); end % 更新速度和位置 r1 = rand(swarmSize, k * size(X, 2)); r2 = rand(swarmSize, k * size(X, 2)); velocities = w * velocities + c1 * r1.* (pbestPositions - positions) + c2 * r2.* (repmat(gbestPosition, swarmSize, 1) - positions); positions = positions + velocities; % 边界处理 positions(positions < repmat(lb, swarmSize, 1)) = repmat(lb, swarmSize, 1); positions(positions > repmat(ub, swarmSize, 1)) = repmat(ub, swarmSize, 1); end % 重新调整聚类中心格式 bestCenters = reshape(gbestPosition, size(X, 2), k); % 使用优化后的聚类中心进行K均值聚类 [idx, C] = kmeans(X, bestCenters, 'Distance', 'euclidean'); end % 差分进化算法优化K均值聚类 function [idx, C] = de_kmeans(X, k) % 定义适应度函数 fitnessFcn = @(centers) kmeans_fitness(X, centers, k); % 编码范围 lb = min(X); ub = max(X); % 种群大小 NP = 50; % 最大迭代次数 Gmax = 100; % 缩放因子 F = 0.8; % 交叉率 CR = 0.9; % 初始化种群 pop = repmat(lb, NP, 1) + repmat((ub - lb), NP, 1).* rand(NP, k * size(X, 2)); fitness = arrayfun(fitnessFcn, mat2cell(pop, ones(NP, 1), k * size(X, 2))); [bestFitness, bestIndex] = min(fitness); bestSolution = pop(bestIndex, :); for g = 1:Gmax for i = 1:NP % 选择三个不同的个体 r = randperm(NP); r = r(r ~= i); a = pop(r(1), :); b = pop(r(2), :); c = pop(r(3), :); % 变异操作 mutant = a + F * (b - c); % 交叉操作 jrand = randi(k * size(X, 2)); trial = zeros(1, k * size(X, 2)); for j = 1:k * size(X, 2) if rand <= CR || j == jrand trial(j) = mutant(j); else trial(j) = pop(i, j); end end % 边界处理 trial(trial < lb) = lb; trial(trial > ub) = ub; % 计算适应度 trialFitness = fitnessFcn(trial); % 选择操作 if trialFitness < fitness(i) pop(i, :) = trial; fitness(i) = trialFitness; if trialFitness < bestFitness bestFitness = trialFitness; bestSolution = trial; end end end end % 重新调整聚类中心格式 bestCenters = reshape(bestSolution, size(X, 2), k); % 使用优化后的聚类中心进行K均值聚类 [idx, C] = kmeans(X, bestCenters, 'Distance', 'euclidean'); end % K均值聚类适应度函数,计算类内距离之和 function fitness = kmeans_fitness(X, centers, k) centers = reshape(centers, size(X, 2), k); [~, ~, sumd] = kmeans(X, centers, 'Distance', 'euclidean'); fitness = sumd; end % 调用不同优化算法的K均值聚类 [idx_ga, C_ga] = ga_kmeans(X, k); [idx_pso, C_pso] = pso_kmeans(X, k); [idx_de, C_de] = de_kmeans(X, k);

代码分析

  1. 数据加载load fisheriris加载了Matlab自带的鸢尾花数据集,X = meas提取了数据的特征部分。
  2. 自定义k值:通过设置k = 3,可以灵活指定聚类的类别数。
  3. 遗传算法优化部分
    -gakmeans函数首先定义了适应度函数kmeansfitness,该函数计算给定聚类中心下的类内距离之和作为适应度值。
    - 然后设置遗传算法的相关参数,如种群大小populationSize、最大迭代次数Generations等,并调用ga函数进行优化,最后利用优化后的聚类中心进行K均值聚类。
  4. 粒子群优化部分
    -pso_kmeans函数同样定义适应度函数,初始化粒子群的位置、速度等参数。
    - 在迭代过程中,根据粒子群优化算法的公式更新粒子的速度和位置,同时不断更新个体最优和全局最优位置,最终使用全局最优位置作为聚类中心进行K均值聚类。
  5. 差分进化算法优化部分
    -de_kmeans函数定义适应度函数后,初始化种群并进行迭代。
    - 在每次迭代中,对每个个体进行变异、交叉操作产生试验个体,通过比较试验个体和原个体的适应度进行选择操作,更新种群,最后利用最优个体作为聚类中心进行K均值聚类。

通过上述代码,我们可以看到如何使用遗传算法、粒子群优化算法和差分进化算法对K均值聚类进行优化,并且可以方便地根据需求自定义k值。这不仅提升了K均值聚类的性能,也增强了算法在不同场景下的适应性。希望这篇博文能帮助你在聚类分析领域迈出更深入的一步!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:23:13

【限时指南】Open-AutoGLM贡献通道即将关闭?现在加入还来得及!

第一章&#xff1a;Open-AutoGLM开源贡献参与流程参与 Open-AutoGLM 的开源贡献是一项面向开发者、研究人员和社区爱好者的协作实践。该项目遵循标准的开源协作模式&#xff0c;所有参与者可通过 GitHub 平台提交代码、报告问题或完善文档。环境准备与项目克隆 在开始贡献前&am…

作者头像 李华
网站建设 2026/4/22 15:06:41

为什么顶尖工程师都在关注Open-AutoGLM?揭秘其开源协作机制

第一章&#xff1a;为什么顶尖工程师都在关注Open-AutoGLM顶尖工程师持续关注技术创新的前沿&#xff0c;而近期开源项目 Open-AutoGLM 引起了广泛讨论。它不仅代表了自动化代码生成与自然语言理解融合的新方向&#xff0c;更在实际开发中展现出强大的生产力提升潜力。智能代码…

作者头像 李华
网站建设 2026/4/18 1:53:26

从Python基础到Open-AutoGLM开发,如何用4周时间完成逆袭?

第一章&#xff1a;从零开始&#xff1a;Python基础快速回顾变量与数据类型 Python 是一种动态类型语言&#xff0c;变量无需声明类型即可使用。常见的基本数据类型包括整数&#xff08;int&#xff09;、浮点数&#xff08;float&#xff09;、字符串&#xff08;str&#xff…

作者头像 李华
网站建设 2026/4/22 4:27:21

【Open-AutoGLM调试诊断终极指南】:掌握5大核心技巧,快速定位AI模型异常

第一章&#xff1a;Open-AutoGLM调试诊断的核心价值与应用场景Open-AutoGLM作为新一代自动化生成语言模型框架&#xff0c;其内置的调试诊断机制为开发者提供了深度可观测性与高效问题定位能力。通过实时监控模型推理路径、中间状态输出及上下文感知日志追踪&#xff0c;该系统…

作者头像 李华