概念
K-means算法是一种无监督学习的聚类算法,用于将一组数据点划分为K个簇(cluster)。它基于数据点之间的相似性度量,将相似的数据点归为同一个簇,不相似的数据点归为不同的簇。
算法的概念和定义如下:
-
簇中心(Cluster Center):每个簇都有一个中心点,用于表示该簇的位置。初始时,K-means算法需要随机选择K个点作为初始的簇中心。
-
距离度量(Distance Metric):K-means算法通常使用欧几里得距离作为数据点之间的相似性度量,也可以选择其他距离度量方法,如曼哈顿距离、闵可夫斯基距离等。
-
目标函数(Objective Function):K-means算法的目标是最小化数据点与其所属簇中心之间的距离的总和,即使得簇内的数据点相似度最高,而不同簇之间的数据点相似度最低。
-
迭代过程:K-means算法通过迭代的方式来优化簇的划分。迭代包括以下两个步骤:
a. 分配数据点到最近的簇中心:对于每个数据点,计算其与各个簇中心的距离,将其归入距离最近的簇中。
b. 更新簇中心位置:对于每个簇,重新计算其所有数据点的平均值,将其作为新的簇中心。 -
收敛条件:K-means算法迭代的停止条件通常是簇中心不再发生变化或者达到预定的迭代次数。
实现过程
- 随机选择K个点作为聚类中心。
- 对于每个数据点,计算其与聚类中心的距离(可以使用欧几里得距离、曼哈顿距离等),将其归入距其最近的簇中。
- 对于每个簇,重新计算其聚类中心。
- 重复2和3步,直至满足收敛条件(例如聚类中心不再发生变化)。
优缺点
优点:
- 简单易懂:K-means算法的思想简单且易于实现,不需要太多的理论基础就可以理解和应用。
- 可扩展性好:K-means算法适用于大规模数据集,具有很好的可扩展性。
- 计算效率高:K-means算法的计算速度相对较快,尤其是在处理大规模数据时,迭代次数通常较少。
缺点:
- 需要预先指定簇的数量:K-means算法需要事先确定要分成的簇的数量K,而在某些情况下,簇的数量并不容易确定,这可能导致聚类结果不够准确。
- 对初始中心点敏感:K-means算法的聚类结果与初始选择的中心点有关,不同的初始中心点可能得到不同的聚类结果。
- 对异常值敏感:K-means算法对异常值(离群点)比较敏感,异常值可能会影响到簇的划分结果。
- 仅适用于数值型数据:K-means算法基于距离度量来衡量数据点之间的相似性,因此只适用于数值型数据,无法直接处理分类变量或文本数据。
示例
在以下代码中,首先使用load_iris函数加载Iris数据集,并取花瓣长度和花瓣宽度两个数据特征进行聚类。然后,使用KMeans函数创建一个k-means聚类模型,指定聚类数目为3,并对数据进行拟合。接下来,绘制散点图,用不同颜色表示不同的聚类结果,并在图中标出聚类中心点(用红色叉表示)。最后,展示聚类结果的散点图。
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
# 加载Iris数据集
data = load_iris()
X = data.data[:, [2, 3]] # 取花瓣长度和花瓣宽度两个数据特征进行聚类
y = data.target
# 使用KMeans算法进行聚类
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(X)
# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=100, c='red', marker='x')
plt.xlabel('Petal Length')
plt.ylabel('Petal Width')
plt.show()
运行结果:
k-means聚类算法意义在于将数据集中的样本分为若干个簇,使得同一簇内的样本相似度高,不同簇之间的相似度低。这有助于我们对数据集进行分类、降维、异常检测等操作。在实际应用中,k-means算法被广泛应用于图像分割、用户行为分析、推荐系统等领域。