K-means 是一种常见的无监督学习算法(Unsupervised Learning Algorithm),用于解决聚类(Clustering)问题。该算法的目标是将数据集中的 (n) 个数据点分成 (K) 个簇(Clusters),使得同一簇内的数据点之间尽可能相似,而不同簇的数据点尽可能不同。
K-means 在市场细分、图像压缩、模式识别等领域得到了广泛应用。其因简单高效而受欢迎,但要充分利用它,理解其工作原理至关重要。
K-means 通过迭代优化的方式将数据划分为 (K) 个簇。每个数据点分配到距离最近的簇中心(Centroid),并不断更新簇中心的位置,直到结果收敛。
K-means 的目标是最小化簇内平方误差和(Sum of Squared Errors, SSE),即所有数据点到其对应簇中心的距离平方和。目标函数公式为:
J = ∑ k = 1 K ∑ x i ∈ C k ∣ ∣ x i − μ k ∣ ∣ 2 J = \sum_{k=1}^{K} \sum_{x_i \in C_k} ||x_i - \mu_k||^2 J=k=1∑Kxi∈Ck∑∣∣xi−μk∣∣2
其中:
该函数的目的是使每个簇内部的数据点尽可能接近其簇中心,从而减少簇内的“离散度”。
K-means 通常使用欧几里得距离(Euclidean Distance)来计算数据点到簇中心的距离:
d ( x i , μ k ) = ∑ j = 1 n ( x i j − μ k j ) 2 d(x_i, \mu_k) = \sqrt{\sum_{j=1}^{n}(x_{ij} - \mu_{kj})^2} d(xi,μk)=j=1∑n(xij−μkj)2
其中:
欧几里得距离是最常用的距离度量方法,它通过计算两个点在多维空间中的直线距离来度量相似性。
下面是 K-means 聚类的详细步骤:
初始化 :随机从数据集中选择 (K) 个点作为初始簇中心。这些点将作为初始簇的中心点。
分配簇 :对每个数据点,计算其到每个簇中心的距离,并将其分配到最近的簇。
更新簇中心 :对于每个簇,重新计算簇内所有数据点的均值作为新的簇中心:
μ k = 1 ∣ C k ∣ ∑ x i ∈ C k x i \mu_k = \frac{1}{|C_k|}\sum_{x_i \in C_k} x_i μk=∣Ck∣1xi∈Ck∑xi
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
# 生成测试数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
# 可视化数据
plt.scatter(X[:, 0], X[:, 1])
plt.show()
# 使用 K-means 聚类
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)
# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75)
plt.show()
make_blobs()
函数生成具有多个中心的测试数据;KMeans()
函数对数据进行 K-means 聚类;fit()
方法训练模型,predict()
方法预测簇;选择合适的 (K) 值是 K-means 聚类的一个关键问题。以下是几种常用的方法:
肘部法 :绘制不同 (K) 值对应的 SSE 曲线,寻找“肘部”位置,该点通常是一个较好的 (K) 值。
轮廓系数 :用于评估聚类效果,取值范围为 ([-1, 1]),值越大表示聚类效果越好。
Gap Statistic :通过比较聚类的 SSE 与随机数据集的 SSE,选择能最大化差距的 (K) 值。
为了解决 K-means 的一些局限性,出现了若干改进方法:
K-means++ :改进了初始簇中心的选择,能显著减少局部最优解的可能性,收敛速度更快。
Mini-batch K-means ⚡:在每次迭代中只使用数据的一个子集,极大提升了处理大规模数据时的速度。
模糊 C 均值 ♂️:允许每个数据点属于多个簇,并为每个簇分配一个
隶属度,从而解决了硬分配的局限性。
假设我们有一组客户购买数据,想通过 K-means 聚类识别不同的客户群体,进而制定更精准的营销策略。
数据准备:首先收集客户的购买金额和购买频率数据。
预处理:对数据进行标准化处理,以确保不同量纲的特征对聚类结果的影响是均衡的。
K-means 聚类:使用 KMeans()
函数对数据进行聚类,选择 (K=4)。
结果分析:通过聚类结果,可以识别出低频低消费、高频高消费等不同的客户群体,并针对性地制定促销策略。
from sklearn.preprocessing import StandardScaler
# 标准化数据
scaler = StandardScaler()
data_scaled = scaler.fit_transform(customer_data)
# 聚类分析
kmeans = KMeans(n_clusters=4)
kmeans.fit(data_scaled)
labels = kmeans.predict(data_scaled)
# 输出聚类标签
print(labels)
通过这种方式,我们能够快速地将客户群体分为若干簇,并进一步分析每个簇的消费习惯和购买行为。
K-means 聚类是一种简单但强大的工具,用于将数据集划分为有意义的组别。虽然它有一些局限性,比如对初始点敏感、无法处理复杂形状的簇等,但通过改进方法(如 K-means++)和正确选择 (K) 值,可以大大提高算法的性能。
最佳实践提示:在应用 K-means 时,建议先对数据进行可视化,采用 K-means++ 初始化策略,并通过肘部法或轮廓系数等方法选择合适的 (K) 值。
希望这篇博客对你有帮助!如果有任何问题或建议,欢迎在评论区讨论。