k均值聚类是一种分区方法。该函数kmeans将数据划分为k 个互斥的簇,并返回它为每个观察分配的簇的索引。 kmeans将数据中的每个观察值视为在空间中具有位置的对象。该函数找到一个分区,其中每个集群中的对象尽可能彼此靠近,并尽可能远离其他集群中的对象。您可以根据数据的属性选择要使用 的距离度量kmeans。像许多聚类方法一样,k-means 聚类要求您在聚类之前指定聚类数k。
与层次聚类不同,k均值聚类对实际观察进行操作,而不是对数据中每对观察之间的差异进行操作。此外,k- means 聚类创建单个级别的集群,而不是多级的集群层次结构。因此,对于大量数据, k- means 聚类通常比层次聚类更合适。
k- means 分区中的每个集群由成员对象和质心(或中心)组成。在每个集群中,kmeans最小化质心与集群所有成员对象之间的距离总和。 kmeans对于支持的距离度量,以不同的方式计算质心簇。
20 世纪 20 年代,植物学家收集了 150 个鸢尾花标本(三个品种各取 50 个标本)的萼片长度、萼片宽度、花瓣长度和花瓣宽度的测量值。这些测量值被称为 Fisher 鸢尾花数据集。
在此数据集中,每个观测值都来自一个已知的品种,因此已经有明显的方法对数据进行分组。现在,我们将忽略品种信息,仅使用原始测量值对数据进行聚类。完成后,我们可以将得到的簇与实际的品种进行比较,以了解这三种鸢尾花是否具有不同的特性。
使用 K 均值聚类方法对 Fisher 鸢尾花数据进行聚类
load fisheriris
[cidx2,cmeans2] = kmeans(meas,2,'dist','sqeuclidean');
[silh2,h] = silhouette(meas,cidx2,'sqeuclidean');
ptsymb = {'bs','r^','md','go','c+'};
for i = 1:2
clust = find(cidx2==i);
plot3(meas(clust,1),meas(clust,2),meas(clust,3),ptsymb{i});
hold on
end
plot3(cmeans2(:,1),cmeans2(:,2),cmeans2(:,3),'ko');
plot3(cmeans2(:,1),cmeans2(:,2),cmeans2(:,3),'kx');
hold off
xlabel('Sepal Length');
ylabel('Sepal Width');
zlabel('Petal Length');
view(-137,10);
grid on
[cidx3,cmeans3] = kmeans(meas,3,'Display','iter');
iter phase num sum
1 1 150 146.424
2 1 5 144.333
3 1 4 143.924
4 1 3 143.61
5 1 1 143.542
6 1 2 143.414
7 1 2 143.023
8 1 2 142.823
9 1 1 142.786
10 1 1 142.754
Best total sum of distances = 142.754
[cidx3,cmeans3,sumd3] = kmeans(meas,3,'replicates',5,'display','final');
Replicate 1, 9 iterations, total sum of distances = 78.8557.
Replicate 2, 10 iterations, total sum of distances = 78.8557.
Replicate 3, 8 iterations, total sum of distances = 78.8557.
Replicate 4, 8 iterations, total sum of distances = 78.8557.
Replicate 5, 1 iterations, total sum of distances = 78.8514.
Best total sum of distances = 78.8514
sum(sumd3)
ans =
78.8514
[silh3,h] = silhouette(meas,cidx3,'sqeuclidean');
for i = 1:3
clust = find(cidx3==i);
plot3(meas(clust,1),meas(clust,2),meas(clust,3),ptsymb{i});
hold on
end
plot3(cmeans3(:,1),cmeans3(:,2),cmeans3(:,3),'ko');
plot3(cmeans3(:,1),cmeans3(:,2),cmeans3(:,3),'kx');
hold off
xlabel('Sepal Length');
ylabel('Sepal Width');
zlabel('Petal Length');
view(-137,10);
grid on
[mean(silh2) mean(silh3)]
ans =
0.8504 0.7357
[cidxCos,cmeansCos] = kmeans(meas,3,'dist','cos');
[silhCos,h] = silhouette(meas,cidxCos,'cos');
[mean(silh2) mean(silh3) mean(silhCos)]
for i = 1:3
clust = find(cidxCos==i);
plot3(meas(clust,1),meas(clust,2),meas(clust,3),ptsymb{i});
hold on
end
hold off
xlabel('Sepal Length');
ylabel('Sepal Width');
zlabel('Petal Length');
view(-137,10);
grid on
lnsymb = {'b-','r-','m-'};
names = {'SL','SW','PL','PW'};
meas0 = meas ./ repmat(sqrt(sum(meas.^2,2)),1,4);
ymin = min(min(meas0));
ymax = max(max(meas0));
for i = 1:3
subplot(1,3,i);
plot(meas0(cidxCos==i,:)',lnsymb{i});
hold on;
plot(cmeansCos(i,:)','k-','LineWidth',2);
hold off;
title(sprintf('Cluster %d',i));
xlim([.9, 4.1]);
ylim([ymin, ymax]);
h_gca = gca;
h_gca.XTick = 1:4;
h_gca.XTickLabel = names;
end
subplot(1,1,1);
for i = 1:3
clust = find(cidxCos==i);
plot3(meas(clust,1),meas(clust,2),meas(clust,3),ptsymb{i});
hold on
end
xlabel('Sepal Length');
ylabel('Sepal Width');
zlabel('Petal Length');
view(-137,10);
grid on
sidx = grp2idx(species);
miss = find(cidxCos ~= sidx);
plot3(meas(miss,1),meas(miss,2),meas(miss,3),'k*');
legend({'setosa','versicolor','virginica'});
hold off
K 均值聚类是一种分区方法,它将数据中的观测值视为具有位置和相互间距离的对象。它将对象划分为 K 个互斥簇,使每个簇中的对象尽可能彼此靠近,并尽可能远离其他簇中的对象。每个簇的特性由其质心或中心点决定。当然,聚类中使用的距离通常不代表空间距离。
[1] https://download.csdn.net/download/kjm13182345320/21487017
[2] https://blog.csdn.net/kjm13182345320/article/details/119839955?spm=1001.2014.3001.5501
[3] https://blog.csdn.net/kjm13182345320/article/details/119610707?spm=1001.2014.3001.5501