k-means clustering均值聚类算法介绍
K-means 聚类算法是一种非常流行的聚类算法,它属于无监督学习范畴。该算法的目标是将 n 个数据点分成 k 个簇,使得每个簇内的数据点尽可能相似,而不同簇之间的数据点尽可能不同。K-means 聚类算法通过迭代的方式实现,具体步骤如下:
初始化:首先,随机选择 k 个数据点作为初始的簇中心(质心)。
分配:然后,对于数据集中的每一个点,计算它与每个簇中心的距离(通常使用欧氏距离),并将该点分配到距离最近的簇中。
更新:接下来,更新每个簇的簇中心。新的簇中心是该簇中所有点的均值(即计算簇中所有点的坐标的平均值)。
迭代:重复步骤 2 和步骤 3,直到满足某个停止条件(例如,簇中心不再发生变化,或者达到预设的迭代次数)。
输出结果:最终,算法输出 k 个簇,每个簇由一组数据点和簇中心表示。
优缺点
优点:
算法简单,易于实现。
计算速度快,特别是对于大数据集。
当簇的密度大致相同时,效果较好。
缺点:
需要事先指定簇的数量 k,这是一个主观的选择。
对初始簇中心的选择敏感,不同的初始簇中心可能导致不同的聚类结果。
对于非球形或大小差异很大的簇,效果可能不佳。
可能会受到噪声和异常值的影响。
应用场景
K-means 聚类算法广泛应用于各种领域,包括但不限于:
市场营销:用于客户细分,识别不同的客户群体。
图像处理:用于图像分割,将图像划分为不同的区域。
文本挖掘:用于文档聚类,将相似的文档组织在一起。
生物信息学:用于基因表达数据的分析,识别具有相似表达模式的基因。
注意事项
在使用 K-means 聚类算法之前,最好对数据进行预处理,包括归一化或标准化,以消除不同特征之间的量纲差异。
可以尝试使用不同的初始簇中心选择策略(如 K-means++),以减少对初始选择的敏感性。
可以通过评估聚类效果(如轮廓系数、Calinski-Harabasz 指数等)来选择最佳的簇数量 k。
k-means clustering均值聚类算法python实现样例
以下是一个示例的Python代码实现k-means聚类算法:
import numpy as np
def kmeans(data, k, max_iter=100):
# 随机选择k个数据点作为初始聚类中心
centroids = data[np.random.choice(range(len(data)), k, replace=False)]
for _ in range(max_iter):
# 分配每个数据点到最近的聚类中心
labels = np.argmin(np.linalg.norm(data[:, np.newaxis] - centroids, axis=-1), axis=-1)
# 更新聚类中心为每个聚类的均值
new_centroids = np.array([data[labels == i].mean(axis=0) for i in range(k)])
# 如果新的聚类中心与旧的聚类中心相同,停止迭代
if np.all(centroids == new_centroids):
break
centroids = new_centroids
return labels, centroids
# 测试代码
data = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])
k = 2
labels, centroids = kmeans(data, k)
print("聚类标签:", labels)
print("聚类中心:", centroids)
在上述代码中,data
是一个二维数组,每行表示一个数据点。k
表示要聚类的簇数。max_iter
表示最大迭代次数,默认为100次。
kmeans
函数首先随机选择k个数据点作为初始聚类中心。然后进行迭代,每次迭代分为两步:
- 分配每个数据点到最近的聚类中心,使用
np.argmin
函数找到距离每个数据点最近的聚类中心的索引。 - 更新聚类中心为每个聚类的均值,使用
data[labels == i].mean(axis=0)
计算每个聚类的均值。
迭代终止的条件是新的聚类中心与旧的聚类中心相同。最后返回每个数据点的聚类标签和最终的聚类中心。
测试时,我们使用一个简单的数据集data
,并设定k为2进行聚类。输出结果会显示每个数据点的聚类标签和最终的聚类中心。