机器学习之KMeans算法

发布于:2025-03-20 ⋅ 阅读:(18) ⋅ 点赞:(0)

引言

KMeans算法是机器学习中最经典的无监督学习算法之一,广泛应用于数据聚类任务。它的核心思想是通过迭代将数据集划分为K个簇,使得每个数据点属于离它最近的簇中心。由于其简单、高效且易于实现,KMeans算法在图像分割、市场细分、文档聚类等领域得到了广泛应用。

本文将详细介绍KMeans算法的原理、实现步骤、优缺点以及实际应用场景,并提供一个Python实现的示例。

1. KMeans算法简介

KMeans算法是一种基于距离的聚类算法,旨在将数据集划分为K个簇(cluster),使得每个簇内的数据点尽可能相似,而不同簇之间的数据点尽可能不同。KMeans算法的核心思想是通过最小化簇内数据点与簇中心(centroid)之间的距离来实现聚类。

KMeans算法的名称中的“K”表示用户指定的簇的数量,而“Means”表示簇的中心是通过计算簇内数据点的均值得到的。

2. KMeans算法的数学原理

KMeans算法的目标是最小化簇内数据点与簇中心之间的平方误差(Sum of Squared Errors, SSE)。SSE的定义如下:

S S E = ∑ i = 1 K ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 SSE = \sum_{i=1}^{K} \sum_{x \in C_i} ||x - \mu_i||^2 SSE=i=1KxCi∣∣xμi2

其中:

  • ( K ) 是簇的数量。
  • ( Ci ) 表示第 ( i ) 个簇。
  • ( x ) 是簇 ( Ci ) 中的一个数据点。
  • ( ui ) 是簇 ( Ci ) 的中心(均值)。

KMeans算法通过迭代优化SSE,使得每个数据点都被分配到离它最近的簇中心,同时更新簇中心为簇内数据点的均值。

3. KMeans算法的步骤

KMeans算法的具体步骤如下:

  1. 初始化:随机选择K个数据点作为初始簇中心。
  2. 分配数据点:将每个数据点分配到离它最近的簇中心,形成K个簇。
  3. 更新簇中心:计算每个簇的均值,并将该均值作为新的簇中心。
  4. 迭代:重复步骤2和步骤3,直到簇中心不再发生变化或达到最大迭代次数。

3.1 初始化簇中心

KMeans算法的初始簇中心选择对最终结果有很大影响。常见的初始化方法有:

  • 随机选择K个数据点作为初始簇中心。
  • 使用KMeans++算法进行初始化,该方法通过优化初始簇中心的选择,减少算法陷入局部最优的概率。

3.2 分配数据点

在每次迭代中,KMeans算法会计算每个数据点到所有簇中心的距离,并将其分配到离它最近的簇中心。常用的距离度量方法有欧氏距离、曼哈顿距离等。

3.3 更新簇中心

在分配完所有数据点后,KMeans算法会重新计算每个簇的中心。新的簇中心是该簇内所有数据点的均值。

3.4 停止条件

KMeans算法的迭代停止条件通常有以下几种:

  • 簇中心不再发生变化。
  • 达到最大迭代次数。
  • SSE的变化小于某个阈值。

4. KMeans算法的优缺点

4.1 优点

  • 简单高效:KMeans算法的原理简单,易于实现,计算效率高,尤其适用于大规模数据集。
  • 可扩展性强:KMeans算法可以轻松扩展到高维数据。
  • 广泛应用:KMeans算法在图像处理、市场细分、文档聚类等领域有广泛应用。

4.2 缺点

  • 需要预先指定K值:KMeans算法需要用户预先指定簇的数量K,而K值的选择通常依赖于经验或领域知识。
  • 对初始簇中心敏感:KMeans算法的结果受初始簇中心的影响较大,可能会陷入局部最优。
  • 对噪声和异常值敏感:KMeans算法对噪声和异常值较为敏感,可能会影响聚类结果。
  • 仅适用于凸形簇:KMeans算法假设簇是凸形的,对于非凸形簇或形状复杂的簇,KMeans算法的效果较差。

5. KMeans算法的应用场景

KMeans算法在许多领域都有广泛的应用,以下是一些典型的应用场景:

5.1 图像分割

KMeans算法可以用于图像分割,将图像中的像素点聚类为不同的颜色区域,从而实现图像的分割和压缩。

5.2 市场细分

在市场分析中,KMeans算法可以根据客户的消费行为、 demographics等特征将客户划分为不同的群体,帮助企业制定针对性的营销策略。

5.3 文档聚类

在自然语言处理中,KMeans算法可以用于文档聚类,将相似的文档归类到同一簇中,从而实现文档的自动分类和组织。

5.4 异常检测

KMeans算法可以用于异常检测,通过将数据点聚类,识别出远离簇中心的异常点。

6. Python实现KMeans算法

下面是一个使用Python实现KMeans算法的示例代码:

import pandas as pd
from sklearn.cluster import KMeans
from sklearn import metrics

#读取文件
beer = pd.read_table("data.txt",sep=' ',encoding='utf8',engine='python')
#传入变量(列名)
x = beer[["calories","sodium","alcohol","cost"]]

"""根据分成不同的簇,自动计算轮廓系数得分"""

scores = []
for k in range(2,10):#寻找合适的K值
    labels = KMeans(n_clusters=k).fit(x).labels_ #从左到右依次进行计算, labels_ 获取每个样本的聚类标签
    score = metrics.silhouette_score(x,labels)
    #轮廓系数取值范围为[-1, 1]:
    # 接近 1:表示聚类效果好,样本距离自己簇的中心较近,距离其他簇的中心较远。
    # 接近 0:表示聚类效果较差,样本可能处于两个簇的边界。
    # 接近 -1:表示聚类效果很差,样本可能被分配到了错误的簇。
    scores.append(score)
print(scores)

#绘制得分结果
import matplotlib.pyplot as plt

plt.plot(list(range(2,10)),scores)
plt.xlabel("Number of Clusters Initialized")
plt.ylabel("Sihouette Score")
plt.show()

#聚类
km = KMeans(n_clusters=2).fit(x) #k值为2【分为2类】
beer['cluster'] = km.labels_
#将聚类结果(km.labels_)存储到beer数据集的cluster列中。cluster 是新创建的列,用于存储每个样本的簇标签。
#labels_ 是 K-Means 模型的一个属性,返回每个样本的聚类标签。
#例如,如果数据 x 有 100 个样本,km.labels_ 将返回一个长度为 100 的数组,数组中的每个值表示对应样本所属的簇(0 或 1,因为 K=2)。

#对聚类结果进行划分
"""
采用轮廓系数评分
x:数据集  scaled_cluster:聚类结果
score:非标准化聚类结果的轮廓系数
"""
score = metrics.silhouette_score(x,beer.cluster)
print(score)

7. 总结

KMeans算法是机器学习中最常用的聚类算法之一,具有简单、高效、易于实现的特点。尽管KMeans算法有一些局限性,如对初始簇中心敏感、需要预先指定K值等,但通过合理的初始化和参数选择,KMeans算法仍然在许多实际应用中表现出色。

通过本文的介绍,相信大家对KMeans算法的原理、实现步骤和应用场景有了更深入的理解。希望本文能为你在实际项目中使用KMeans算法提供帮助。