K - 均值聚类(K - Means Clustering)是一种广泛应用的无监督学习算法,用于将数据集划分为 K 个不同的簇,每个簇内的数据点具有较高的相似性,而不同簇之间的数据点具有较大的差异性。以下从多个方面对其进行详细介绍。
算法原理
K - 均值聚类的核心目标是最小化每个数据点到其所属簇中心的距离的平方和,也就是最小化簇内误差平方和(Within - Cluster Sum of Squares,WCSS)。其基本步骤如下:
- 初始化:随机选择 K 个数据点作为初始的簇中心(也称为质心)。
- 分配数据点:对于数据集中的每个数据点,计算它与 K 个簇中心的距离(通常使用欧几里得距离),并将该数据点分配给距离最近的簇。
- 更新簇中心:重新计算每个簇内所有数据点的均值,将这个均值作为新的簇中心。
- 重复步骤2和3:不断重复分配数据点和更新簇中心的过程,直到簇中心不再发生显著变化,或者达到预设的最大迭代次数。
算法公式
- 欧几里得距离:用于计算数据点 (x_i) 和簇中心 (c_j) 之间的距离,公式为 (d(x_i, c_j)=\sqrt{\sum_{k = 1}^{n}(x_{i,k}-c_{j,k})^2}),其中 (n) 是数据点的特征维度。
- 簇内误差平方和(WCSS):用于衡量聚类的质量,公式为 (WCSS=\sum_{j = 1}^{K}\sum_{x_i\in C_j}d(x_i, c_j)^2),其中 (C_j) 表示第 (j) 个簇,(K) 是簇的数量。
优缺点
- 优点
- 简单易实现:算法的原理和实现过程相对简单,易于理解和应用。
- 计算效率高:对于大规模数据集,K - 均值聚类的计算速度较快。
- 可扩展性强:可以应用于各种类型的数据,只要能够定义合适的距离度量。
- 缺点
- 需要预先指定 K 值:在实际应用中,很难确定最优的簇数量 (K)。
- 对初始簇中心敏感:不同的初始簇中心选择可能会导致不同的聚类结果。
- 对异常值敏感:异常值可能会对簇中心的计算产生较大影响,从而影响聚类结果。
- 只能发现球形簇:K - 均值聚类假设簇是球形的,对于非球形的簇结构,聚类效果可能不佳。
应用场景
- 市场细分:将客户根据其购买行为、偏好等特征划分为不同的群体,以便企业制定针对性的营销策略。
- 图像分割:将图像中的像素点划分为不同的区域,每个区域代表不同的物体或特征。
- 文档分类:将文档根据其内容主题划分为不同的类别。
示例代码(Python实现)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# 生成样本数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
# 创建K - 均值聚类模型
kmeans = KMeans(n_clusters=4, init='k-means++', max_iter=300, n_init=10, random_state=0)
pred_y = kmeans.fit_predict(X)
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=pred_y, s=50, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5)
plt.show()
在这个示例中,使用 make_blobs
生成了一个包含 300 个样本的数据集,然后使用 KMeans
类进行聚类,最后将聚类结果可视化展示。
注意:本文归作者所有,未经作者允许,不得转载