聚类算法 画图 Matlab代码 1-普通kmeans聚类 2-kmeans聚类(肘部法估计聚类数量) 3-kmeans聚类(多种评价因子计算) 4-kmeans++聚类 5-C均值聚类(Fcm聚类) 6-DBSCAN聚类(Density-Based Spatial Clustering of Application with Noise) ================= Matlab代码备注清楚,易于使用,改为自己的数据即可 此为打包6种聚类程序,也可在主页选择单独的~ 温馨提示:联系请考虑是否需要,(Example_63)
最近在整理手头的聚类算法代码,发现Matlab生态里藏着不少宝藏工具包。这次把六种常用聚类方法打包成工具箱,从传统K均值到密度聚类全覆盖,实测只需要替换数据矩阵就能跑起来。咱们边看代码边聊特性,顺便分析不同场景下的使用技巧。
先来个最简单的K均值镇场子。数据准备部分建议把样本按行排列,特征按列分布。核心代码就三行:
data = your_data_matrix; % 替换这里!! k = 3; % 预设类别数 [IDX, C] = kmeans(data, k); scatter(data(:,1),data(:,2),10,IDX,'filled')但问题来了——这k值到底怎么定?这时候需要肘部法出场。代码里这个循环计算不同k值的SSE变化:
sse = zeros(1,10); for k=1:10 [~,~,sumd] = kmeans(data,k); sse(k) = sum(sumd); end plot(1:10,sse,'-o') % 找拐点位置当曲线斜率突然变缓的那个点,就是理论上的最佳聚类数。不过实际项目中经常遇到曲线平缓没有明显拐点的情况,这时候需要结合其他评估指标。
说到评估指标,工具箱内置了三种验证函数:
silhouette_score = mean(silhouette(data, IDX)); % 轮廓系数 davies_bouldin = evalclusters(data,IDX,'DaviesBouldin').CriterionValues; calinski = evalclusters(data,IDX,'CalinskiHarabasz').CriterionValues;轮廓系数越接近1越好,戴维森堡丁指数则是越小越好。注意这些指标在密度不均匀的数据集上可能失效,这时候就需要换DBSCAN了。
聚类算法 画图 Matlab代码 1-普通kmeans聚类 2-kmeans聚类(肘部法估计聚类数量) 3-kmeans聚类(多种评价因子计算) 4-kmeans++聚类 5-C均值聚类(Fcm聚类) 6-DBSCAN聚类(Density-Based Spatial Clustering of Application with Noise) ================= Matlab代码备注清楚,易于使用,改为自己的数据即可 此为打包6种聚类程序,也可在主页选择单独的~ 温馨提示:联系请考虑是否需要,(Example_63)
K均值++改进了初始质心选择策略,Matlab自带参数就能调用:
opts = statset('Display','final'); [IDX,C] = kmeans(data,k,'Options',opts,'Replicates',5,'Start','plus');重点在'Start'参数设为'plus',相当于开启了++模式。遇到聚类结果不稳定的情况时,适当增加Replicates值会有奇效。
模糊C均值适合边界不清的数据,代码结构略有不同:
[centers,U] = fcm(data,3); [~,IDX] = max(U); % 转换为硬分类注意输出的是隶属度矩阵U,需要自己取最大值索引。调节m参数(默认2)可以控制模糊程度,数值越大分类越模糊。
最后压轴的DBSCAN实现起来稍复杂:
epsilon = 0.5; % 邻域半径 minPts = 10; % 最小邻居数 IDX = dbscan(data,epsilon,minPts); gscatter(data(:,1),data(:,2),IDX); % 自动区分噪声点这里epsilon的选择有讲究,可以用k距离曲线辅助确定。把每个点到第k近邻居的距离排序后画折线图,拐点处就是建议的epsilon值。
代码包里每个脚本都配置了可视化模块,替换数据时注意保持矩阵方向。遇到环形分布数据优先尝试DBSCAN,高维数据建议先用K均值++配合评估指标验证。需要调参指导的话,示例文件Example_63里有典型数据集的测试案例。