Kmeans聚类算法原理与Matlab实战指南

Kmeans聚类算法原理与Matlab实战指南 1. Kmeans聚类算法基础与Matlab实现Kmeans算法是一种经典的基于距离的无监督学习算法它通过迭代将数据点分配到最近的聚类中心然后重新计算聚类中心直到满足收敛条件。在Matlab中kmeans函数的基本语法如下[idx, C] kmeans(X, k)其中X是n×p的数据矩阵n个样本p个特征k是指定的聚类数目idx是包含每个样本所属聚类索引的n×1向量C是k×p的矩阵包含k个聚类中心的位置。实际应用中建议先对数据进行标准化处理z-score标准化或min-max标准化避免不同量纲的特征对距离计算产生不均衡影响。Matlab的kmeans函数默认使用k-means算法进行初始化这比随机初始化能获得更好的聚类结果。k-means通过以下步骤选择初始聚类中心随机选择第一个中心点计算每个点到最近中心的距离D(x)按照D(x)²的概率选择下一个中心点重复步骤2-3直到选出k个中心2. 肘部法确定最佳聚类数2.1 肘部法原理肘部法(Elbow Method)通过观察不同k值下聚类误差的变化趋势来确定最佳聚类数。聚类误差通常用所有样本到其所属聚类中心的距离平方和(SSE)来衡量[~, ~, sumd] kmeans(X, k); SSE sum(sumd);随着k增大SSE会逐渐减小当k增加到真实聚类数时SSE的下降幅度会突然变缓这个转折点就是肘部点。2.2 Matlab实现肘部法% 生成测试数据 rng(1); % 设置随机种子保证可重复性 X [randn(100,2)*0.75ones(100,2); randn(100,2)*0.5-ones(100,2)]; % 尝试不同的k值 k_range 1:8; SSE zeros(size(k_range)); for i 1:length(k_range) [~, ~, sumd] kmeans(X, k_range(i), Replicates, 5); SSE(i) sum(sumd); end % 绘制肘部曲线 figure; plot(k_range, SSE, bo-); xlabel(聚类数目 k); ylabel(SSE); title(肘部法确定最佳聚类数); grid on;2.3 结果分析与选择在实际分析肘部曲线时应该寻找SSE下降速度明显变缓的点。例如如果曲线在k2或k3处出现明显拐点那么这两个值都可能是合理的聚类数选择。此时可以结合业务需求和其他评估指标如轮廓系数进行综合判断。3. 高级应用与参数调优3.1 距离度量选择Matlab的kmeans函数支持多种距离度量方式通过Distance参数指定sqeuclidean平方欧氏距离默认cityblock曼哈顿距离cosine余弦距离correlation相关系数距离hamming汉明距离仅适用于二进制数据% 使用余弦距离进行聚类 [idx, C] kmeans(X, 3, Distance, cosine);3.2 并行计算加速对于大型数据集可以使用并行计算加速kmeansoptions statset(UseParallel, 1); [idx, C] kmeans(X, 3, Options, options);3.3 多次重复与初始点选择为避免局部最优可以设置Replicates参数多次运行算法并选择最佳结果[idx, C, sumd] kmeans(X, 3, Replicates, 10, Display, final);4. 实战案例鸢尾花数据集聚类4.1 数据准备与可视化load fisheriris; X meas(:,3:4); % 使用花瓣长度和宽度作为特征 figure; gscatter(X(:,1), X(:,2), species); title(鸢尾花真实类别); xlabel(花瓣长度 (cm)); ylabel(花瓣宽度 (cm));4.2 应用肘部法确定k值k_range 1:5; SSE zeros(size(k_range)); for i 1:length(k_range) [~, ~, sumd] kmeans(X, k_range(i), Replicates, 5); SSE(i) sum(sumd); end figure; plot(k_range, SSE, bo-); xlabel(聚类数目 k); ylabel(SSE); title(鸢尾花数据肘部曲线);4.3 最终聚类与评估k 3; % 根据肘部法选择 [idx, C] kmeans(X, k, Replicates, 10); % 可视化聚类结果 figure; gscatter(X(:,1), X(:,2), idx, rgb, osd); hold on; plot(C(:,1), C(:,2), kx, MarkerSize, 15, LineWidth, 3); legend(Cluster 1, Cluster 2, Cluster 3, Centroids); title(Kmeans聚类结果); xlabel(花瓣长度 (cm)); ylabel(花瓣宽度 (cm));5. 常见问题与解决方案5.1 空聚类处理当某个聚类失去所有成员时kmeans提供三种处理方式error报错默认drop删除空聚类singleton创建一个新聚类包含离当前中心最远的点[idx, C] kmeans(X, k, EmptyAction, singleton);5.2 收敛问题如果算法不收敛可以尝试增加最大迭代次数调整收敛容差使用不同的初始点策略options statset(MaxIter, 1000, TolFun, 1e-6); [idx, C] kmeans(X, k, Options, options);5.3 高维数据聚类对于高维数据建议先进行PCA降维使用更适合高维数据的距离度量如余弦距离增加聚类重复次数[coeff, score] pca(X); X_reduced score(:,1:2); % 保留前两个主成分 [idx, C] kmeans(X_reduced, k);在实际项目中我发现将肘部法与轮廓系数结合使用能获得更可靠的聚类数估计。同时对于不同量纲的特征标准化处理是必不可少的步骤否则距离计算会被量纲较大的特征主导。