第九天:K-Means算法

K-Means算法简介

K-Means算法是一种广泛使用的聚类算法,旨在将数据集分成K个预定义的簇。每个簇的中心是簇中所有点的均值,称为质心。K-Means算法的目标是最小化每个数据点到其所属簇的质心的距离的平方和。

算法原理

K-Means算法的工作原理可以分为以下几个步骤:

  1. 初始化: 随机选择K个数据点作为初始质心。
  2. 分配簇: 将每个数据点分配到距离最近的质心所属的簇。
  3. 更新质心: 计算每个簇的新质心,质心是簇中所有点的均值。
  4. 重复: 重复步骤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个簇。

  1. 目标函数: 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=1KxjSixjμi2

其中, S i S_i Si是簇 i i i 中的数据点集合, μ i \mu_i μi是簇 i i i 的质心。

  1. 质心计算: 簇 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=Si1xjSixj

算法步骤

  1. 初始化: 随机选择 K K K 个初始质心。
  2. 分配: 对于每个数据点,计算其到每个质心的距离,并将其分配给最近的质心。

Cluster ( x j ) = arg ⁡ min ⁡ i ∥ x j − μ i ∥ 2 \text{Cluster}(x_j) = \arg\min_{i} \|x_j - \mu_i\|^2 Cluster(xj)=argiminxjμi2

  1. 更新: 计算新的质心位置。

μ 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=Si1xjSixj

  1. 重复: 重复步骤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()

代码解释

  1. 生成数据: 使用make_blobs生成模拟数据。
  2. 训练模型: 使用KMeans类进行聚类。
  3. 预测与绘图: 使用matplotlib绘制聚类结果及质心。

我们使用make_blobs数据集来绘制效果图

在这里插入图片描述

总结

K-Means算法是一种简单而有效的聚类方法,但它也有一些缺点,如对初始质心的选择敏感,可能会陷入局部最优解。为了解决这些问题,可以使用多次初始化(K-Means++)等改进方法。通过合理选择K的值和适当的初始质心,K-Means算法可以为数据分析和模式识别提供有效的支持。

希望这篇博客能帮助你更好地理解K-Means算法及其应用。如果你有任何问题或建议,请随时联系我!

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值