K-Means算法简介
K-Means算法是一种广泛使用的聚类算法,旨在将数据集分成K个预定义的簇。每个簇的中心是簇中所有点的均值,称为质心。K-Means算法的目标是最小化每个数据点到其所属簇的质心的距离的平方和。
算法原理
K-Means算法的工作原理可以分为以下几个步骤:
- 初始化: 随机选择K个数据点作为初始质心。
- 分配簇: 将每个数据点分配到距离最近的质心所属的簇。
- 更新质心: 计算每个簇的新质心,质心是簇中所有点的均值。
- 重复: 重复步骤2和3,直到质心不再改变或达到最大迭代次数。
数学公式
假设有 n n n 个数据点 x 1 , x 2 , … , x n x_1, x_2, \ldots, x_n x1,x2,…,xn,每个数据点有 d d d个特征。我们需要将这些数据点划分为 K K K个簇。
- 目标函数: K-Means算法的目标是最小化每个数据点到其所属簇质心的距离的平方和,即目标函数 J J J 为:
J = ∑ i = 1 K ∑ x j ∈ S i ∥ x j − μ i ∥ 2 J = \sum_{i=1}^{K} \sum_{x_j \in S_i} \|x_j - \mu_i\|^2 J=i=1∑Kxj∈Si∑∥xj−μi∥2
其中, S i S_i Si是簇 i i i 中的数据点集合, μ i \mu_i μi是簇 i i i 的质心。
- 质心计算: 簇 i i i的质心 μ i \mu_i μi 为簇中所有点的均值:
μ i = 1 ∣ S i ∣ ∑ x j ∈ S i x j \mu_i = \frac{1}{|S_i|} \sum_{x_j \in S_i} x_j μi=∣Si∣1xj∈Si∑xj
算法步骤
- 初始化: 随机选择 K K K 个初始质心。
- 分配: 对于每个数据点,计算其到每个质心的距离,并将其分配给最近的质心。
Cluster ( x j ) = arg min i ∥ x j − μ i ∥ 2 \text{Cluster}(x_j) = \arg\min_{i} \|x_j - \mu_i\|^2 Cluster(xj)=argimin∥xj−μi∥2
- 更新: 计算新的质心位置。
μ i = 1 ∣ S i ∣ ∑ x j ∈ S i x j \mu_i = \frac{1}{|S_i|} \sum_{x_j \in S_i} x_j μi=∣Si∣1xj∈Si∑xj
- 重复: 重复步骤2和3直到质心不再变化或达到最大迭代次数。
代码实现
以下是Python中的K-Means算法实现,使用scikit-learn
库:
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)
# 使用KMeans算法进行聚类
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, marker='X')
plt.title('K-Means Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()
代码解释
- 生成数据: 使用
make_blobs
生成模拟数据。 - 训练模型: 使用
KMeans
类进行聚类。 - 预测与绘图: 使用
matplotlib
绘制聚类结果及质心。
我们使用make_blobs数据集来绘制效果图
总结
K-Means算法是一种简单而有效的聚类方法,但它也有一些缺点,如对初始质心的选择敏感,可能会陷入局部最优解。为了解决这些问题,可以使用多次初始化(K-Means++)等改进方法。通过合理选择K的值和适当的初始质心,K-Means算法可以为数据分析和模式识别提供有效的支持。
希望这篇博客能帮助你更好地理解K-Means算法及其应用。如果你有任何问题或建议,请随时联系我!
标签:xj,第九天,plt,Means,kmeans,算法,质心 From: https://blog.csdn.net/weixin_54856108/article/details/141017524