K-均值聚类算法是一种常用的无监督学习算法,用于将样本数据划分为K个不同的聚类。该算法根据样本数据的特征进行聚类,使得同一聚类内的数据点相似度较高,而不同聚类之间的数据点相似度较低。以下是K-均值聚类算法的步骤:
- 初始化K个聚类中心,可以随机选择K个数据点作为初始聚类中心。
- 在每次迭代过程中,将每个数据点分配给距离最近的聚类中心,形成K个聚类。
- 根据每个聚类的数据点,计算聚类中心的均值,更新聚类中心的位置。
- 重复步骤2和3,直到满足停止条件,如聚类中心不再发生变化或达到最大迭代次数。
优点:
- 简单易实现:K-均值算法的原理简单,易于理解和实现。
- 可扩展性:K-均值聚类算法可以扩展到大规模数据集,对于大型数据集具有较高的效率。
- 聚类效果较好:在某些数据集上,K-均值算法能够产生比较好的聚类结果。
缺点:
- 初始聚类中心的选择对结果影响较大:由于初始聚类中心的选择是随机的,可能会导致不同的初始选择得到不同的聚类结果。
- 对离群点敏感:K-均值聚类算法对离群点敏感,离群点可能会对聚类中心位置产生较大影响,进而影响聚类结果。
- 需要预先指定聚类个数K:对于用户来说,很难事先确定聚类个数K。
总结来说,K-均值聚类算法是一种简单而高效的聚类算法,适用于大规模数据集。然而,它对离群点较为敏感,需要事先指定聚类个数K,并且在选择初始聚类中心时需要注意。
下面给出一个例子
% X是一个包含数据点的矩阵,每行代表一个观测值,每列代表一个变量
X = [randn(100,2)*0.75+ones(100,2);
randn(100,2)*0.5-ones(100,2)];
% 指定要分成的簇的数量
k = 3;
% 执行k均值聚类
[idx, C] = kmeans(X, k);
% idx是一个列向量,包含每个观测值的簇索引
% C是一个矩阵,包含每个簇的质心位置
% 可视化聚类结果
figure;
plot(X(idx==1,1), X(idx==1,2), 'r.')
hold on;
plot(X(idx==2,1), X(idx==2,2), 'b.')
plot(X(idx==3,1), X(idx==3,2), 'g.')
plot(C(:,1), C(:,2), 'kx', 'MarkerSize', 15, 'LineWidth', 3);
legend('Cluster 1', 'Cluster 2', 'Cluster 3', 'Centroids');
title('K-Means Clustering');
hold off;
聚类结果如下
在这个例子中,X
是数据矩阵,k
是簇的数量,idx
是每个数据点所属簇的索引,C
是每个簇质心的坐标。kmeans
函数默认使用平方欧几里得距离,并采用k-means++算法进行初始质心的初始化。
此外,kmeans
函数还支持许多其他参数,例如可以指定不同的距离度量、重复聚类的次数、并行计算等。例如,如果你想要使用城市街区距离(Manhattan distance)而不是默认的欧几里得距离,并且想要重复聚类5次以找到最佳的初始质心,可以这样写:
[idx, C] = kmeans(X, k, 'Distance', 'cityblock', 'Replicates', 5);