kmean聚类matlab
时间: 2023-10-18 20:05:07 浏览: 100
在MATLAB中,可以使用自带的kmeans函数进行k-means聚类。首先,使用kmeans函数将数据分成指定数量的簇,例如cluster_num=3,即将数据分成3个簇。然后,可以使用unique函数找出分类出的个数,并使用cell数组存储每个簇中的数据索引。接下来,遍历每个簇,获取对应的数据并使用scatter函数绘制散点图表示每个簇的数据。同时,可以使用plot函数绘制簇的中心点。最后,可以计算轮廓系数(SC)来评估聚类效果。轮廓系数可以使用mean函数计算silhouette函数返回的值。整个过程的代码示例如下:
```
cluster_num=3; %自定义分类数
[index_km,center_km]=kmeans(data,cluster_num); %MATLAB自带kmeans函数
a=unique(index_km); %找出分类出的个数
C=cell(1,length(a));
for i=1:length(a)
C(1,i)={find(index_km==a(i))};
end
figure
subplot(2,1,2)
for j=1:cluster_num
data_get=data(C{1,j},:);
scatter(data_get(:,1),data_get(:,2),100,'filled','MarkerFaceAlpha',.6,'MarkerEdgeAlpha',.9);
hold on
end
plot(center_km(:,1),center_km(:,2),'kd','LineWidth',2);
hold on
sc_k=mean(silhouette(data,index_km));
title_str1=['MATLAB自带kmeans函数',' 聚类数为:',num2str(cluster_num),' SC轮廓系数:',num2str(sc_k)];
title(title_str1);
```
可以在MATLAB中运行以上代码来进行k-means聚类,并可视化聚类结果。
此外,您还可以参考GitHub的一个示例代码,链接如下:[https://github.com/Qyokizzzz/AI-Algorithm/tree/master/K-means](https://github.com/Qyokizzzz/AI-Algorithm/tree/master/K-means) 。
另外,您还可以通过分析数据,选择最佳的k值进行聚类。例如,可以加载fisheriris数据集,并使用其meas的前两个维度来进行聚类。以下是一个示例脚本:
```
load fisheriris
data = normalization(meas);
[idx,C,~ = Kmeans(data(:,1:2),3,0,5000);
figure
gscatter(data(:,1),data(:,2),idx,'bgm')
hold on
plot(C(:,1),C(:,2),'kx')
legend('Cluster 1','Cluster 2','Cluster 3','ClusterCentroid')
```
上述代码将fisheriris数据集进行了归一化处理,并使用Kmeans函数将数据聚类成3个簇。通过gscatter函数绘制散点图表示不同簇的数据,并使用plot函数绘制簇的中心点。
最后,您还可以编写一个计算"有序属性"距离的函数来计算样本点之间的闵可夫斯基距离。例如,可以使用cal_dist函数计算两个样本点之间的欧氏距离或曼哈顿距离。以下是一个示例代码:
```
function dist = cal_dist(X,p)
dim = size(X);
sum = 0;
for i = 1:dim(2)
sum = sum + abs(X(1,i)-X(2,i))^p;
end
dist = sum^(1/p);
end
```
该函数可以根据指定的p值计算两个样本点之间的闵可夫斯基距离,其中p=2为欧氏距离,p=1为曼哈顿距离。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
阅读全文