K-均值聚类算法
K-均值聚类是机器学习中常用的无监督学习算法之一,主要应用于数据分类、数据分析和数据挖掘等领域。
K-均值聚类算法的基本思想是将样本集合划分为 K 个不同的簇,使得簇内的样本相似度高,簇间的相似度低。具体实现过程如下:
1. 选择 K 个初始的聚类中心点。
2. 对于每个样本点,计算其与各个聚类中心的距离,将其划分到距离最近的簇中。
3. 对于每个簇,重新计算其中样本的中心点。
4. 重复步骤 2 和步骤 3 直到聚类中心点不再变化或达到预设的最大迭代次数。
在算法的执行过程中,可以采用多种距离度量方法,如欧氏距离、曼哈顿距离等。还可以使用不同的初始化方法,例如随机选取初始簇中心、基于数据分布的初始簇中心等。
欧氏距离计算
K-均值聚类算法的优点:
1. 简单、易于实现:K-均值聚类算法不需要预先知道样本的类别标签,只需要选择 K 值,即可以在未知标签的情况下对数据进行分类。
2. 易于扩展:K-均值聚类算法可以处理大规模数据,并且可以方便地添加新的聚类中心点和样本数据。
3. 易于理解:K-均值聚类算法的可视化结果直观,可以直观地观察到簇与簇之间的区别。
K-均值聚类算法也存在一些缺点:
1. 对初始点的敏感性:初始点的选择会影响最终的聚类结果。不同的初始点可能导致不同的结果。
2. 只能处理凸形数据:K-均值聚类算法只能处理凸形的数据簇,对于非凸形数据簇的聚类效果可能不尽人意。
3. K 值的选择问题:K 值的选择需要根据实际情况进行权衡,如果选择不当,可能导致聚类结果不理想。。
为了改进K-均值聚类算法的局限性,还可以尝试使用其他聚类算法,如层次聚类、密度聚类等,或结合其他特征选择和降维方法,以提高聚类结果的质量和准确性。
K-均值聚类算法代码
import numpy as np
def kmeans(X, K, max_iters=100):
# 初始化随机选择的簇中心
centers = X[np.random.choice(range(len(X)), K, replace=False)]for _ in range(max_iters):
# 分配数据点到最近的簇中心
labels = np.argmin(np.linalg.norm(X[:, np.newaxis] - centers, axis=-1), axis=-1)# 更新簇中心为簇内数据点的均值
new_centers = np.array([X[labels == k].mean(axis=0) for k in range(K)])# 如果簇中心不再发生变化,停止迭代
if np.all(centers == new_centers):
breakcenters = new_centers
return labels, centers
# 示例用法
X = np.array([[1, 3], [1, 4], [2, 4], [5, 1], [5, 2], [6, 1]])
K = 2labels, centers = kmeans(X, K)
print("Cluster labels:", labels)
print("Cluster centers:", centers)
参考
【1】机器学习核心算法编程实例.丁伟雄著