K-均值聚类算法是一种常用的无监督学习方法,用于将数据集划分为K个簇(clusters)。其主要目标是使每个簇内部的样本尽量相似,而不同簇之间的样本尽量不同。
K-均值聚类算法的步骤:
- 初始化:随机选择K个数据点作为初始簇中心(centroids)。
- 分配簇:将每个数据点分配给离它最近的簇中心。
- 更新中心:重新计算每个簇的中心点,即簇内所有数据点的均值。
- 重复:重复步骤2和3,直到簇中心不再变化或变化很小,或达到最大迭代次数。
优点:
- 简单易懂:算法简单,易于实现和理解。
- 高效:在处理大型数据集时,K-均值算法的计算效率较高,尤其是使用欧几里得距离时。
- 可扩展性:适合处理大规模数据,且计算复杂度相对较低。
缺点:
- 选择K的困难:K的值需要提前指定,而如何选择合适的K值通常没有明确的标准。
- 对初始值敏感:不同的初始簇中心可能导致不同的聚类结果。使用K-means++方法可以改善这一点。
- 假设簇形状:K-均值假设簇是凸形的,且大小相近,对非凸形和大小差异较大的簇聚类效果差。
- 对噪声敏感:K-均值对异常值和噪声点敏感,这可能会影响最终的聚类结果。
适用场景:
K-均值聚类广泛应用于市场细分、社交网络分析、图像分割等领域,适合用于那些簇之间有明显界限的数据集。
通过合理选择K值和预处理数据,可以提升K-均值聚类的效果,使其更好地适应具体应用场景。
下面通过一个简单的例子,详细介绍 K-均值聚类算法,并提供相应的 Python 代码。
示例:K-均值聚类算法
假设我们有一个二维数据集,数据点分布在平面上,我们想将这些数据点分为三个簇。
1. 数据准备
我们将使用 numpy
和 matplotlib
来生成和可视化数据。接着使用 sklearn
库实现 K-均值聚类。
2. 安装所需库
首先确保安装了所需的库。可以通过以下命令安装:
pip install numpy matplotlib scikit-learn
3. 代码示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 生成示例数据
np.random.seed(42)
# 创建三个簇的数据
data1 = np.random.randn(100, 2) + np.array([5, 5])
data2 = np.random.randn(100, 2) + np.array([0, 0])
data3 = np.random.randn(100, 2) + np.array([-5, 5])
# 合并数据
data = np.vstack([data1, data2, data3])
# 可视化数据点
plt.scatter(data[:, 0], data[:, 1], s=30)
plt.title("Generated Data Points")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.show()
# 使用 K-均值聚类
k = 3 # 设定簇的数量
kmeans = KMeans(n_clusters=k)
kmeans.fit(data)
# 获取聚类结果
centroids = kmeans.cluster_centers_ # 簇中心
labels = kmeans.labels_ # 每个数据点的簇标签
# 可视化聚类结果
plt.scatter(data[:, 0], data[:, 1], c=labels, s=30, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=100, marker='X') # 绘制簇中心
plt.title("K-Means Clustering Result")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.show()
4. 代码解析
-
生成示例数据:
- 使用
numpy
生成三个簇的数据,每个簇的数据点在不同的中心附近分布。
- 使用
-
可视化数据点:
- 使用
matplotlib
绘制生成的数据点,以便于观察数据的分布。
- 使用
-
K-均值聚类:
- 创建
KMeans
对象,并设置n_clusters=3
来指定要划分的簇数量。 - 使用
fit
方法进行聚类分析。
- 创建
-
获取结果:
-
cluster_centers_
属性返回最终的簇中心。 -
labels_
属性返回每个数据点对应的簇标签。
-
-
可视化聚类结果:
- 使用不同的颜色表示不同的簇,并用红色 "X" 标记簇中心。
结果
运行上述代码后,你将看到两个图:
- 第一个图展示了生成的随机数据点。
- 第二个图展示了 K-均值聚类的结果,其中不同颜色代表不同的簇,红色 "X" 表示簇的中心。
总结
K-均值聚类算法是一种直观且实用的聚类方法。通过选择合适的K值并使用适当的初始值,可以得到良好的聚类效果。上述示例展示了K-均值聚类的基本流程及其实现。