当前位置: 首页 > news >正文

K-means聚类学习:原理、实践与API解析

文章目录

  • 一、K-means聚类的基本原理
    • 1.1 核心思想
    • 1.2 算法步骤
    • 1.3 距离度量
  • 二、K-means的优势与局限性
    • 2.1 优势
    • 2.2 局限性
  • 三、基于啤酒数据的K-means聚类实践
    • 3.1 数据说明
    • 3.2 代码实现与解析
      • 3.2.1 数据加载与预处理
      • 3.2.2 确定最优聚类数 K
      • 3.2.3 确定最优 K 并执行聚类
  • 四、sklearn.cluster.KMeans API 详解
    • 4.1 主要参数
    • 4.2 主要属性
    • 4.3 主要方法
  • 五、聚类效果评估指标
    • 5.1 轮廓系数(Silhouette Score)
    • 5.2 肘部法(Elbow Method)
    • 5.3 Calinski-Harabasz 指数
  • 六、总结与拓展

聚类分析是无监督学习的重要组成部分,其目的是从无标签数据中发现内在的结构和模式。K-means作为一种经典的聚类算法,因其原理简单、计算高效,在数据挖掘、模式识别等领域得到了广泛应用。本文将从K-means的基本原理出发,结合啤酒特征数据的实例,详细介绍其实现过程,并对相关API进行深入解析,帮助读者掌握这一算法的核心内容及应用方法。


一、K-means聚类的基本原理

1.1 核心思想

K-means聚类的核心思想是将数据集划分为K个不同的簇(Cluster),使得每个簇内的数据点具有较高的相似度,而不同簇之间的数据点差异较大。这里的相似度通常通过数据点之间的距离来衡量,距离越小则相似度越高。

1.2 算法步骤

K-means算法的实现过程主要包括以下几个步骤:

  1. 确定聚类数K:根据实际问题或数据特点,预先设定需要划分的簇的数量K。
  2. 初始化质心:从数据集中随机选择K个数据点作为初始的聚类中心,即质心(Centroid)。
  3. 分配数据点:计算每个数据点到K个质心的距离,将该数据点分配到距离最近的质心所在的簇。
  4. 更新质心:计算每个簇内所有数据点的均值,将其作为该簇新的质心。
  5. 迭代优化:重复步骤3和步骤4,直到质心的位置不再发生明显变化(即达到收敛条件)或迭代次数达到预设的最大值。

1.3 距离度量

在K-means算法中,常用的距离度量方式是欧氏距离。对于两个n维数据点 x=(x1,x2,⋯,xn)x=(x_1,x_2,\cdots,x_n)x=(x1,x2,,xn)y=(y1,y2,⋯,yn)y=(y_1,y_2,\cdots,y_n)y=(y1,y2,,yn),它们之间的欧氏距离计算公式为:

d(x,y)=∑i=1n(xi−yi)2d(x,y)=\sqrt{\sum_{i=1}^{n}(x_i - y_i)^2}d(x,y)=i=1n(xiyi)2


二、K-means的优势与局限性

2.1 优势

  • 计算效率高:K-means算法的时间复杂度较低,为 O(nkt)O(nkt)O(nkt),其中 nnn 为数据点数量,kkk 为聚类数,ttt 为迭代次数,适合处理大规模数据集。
  • 易于实现:算法的原理和步骤相对简单,容易理解和编程实现。
  • 适用性广:可应用于各种类型的数值型数据,在很多领域都能取得较好的聚类效果。

2.2 局限性

  • 需预先确定K值:K值的选择对聚类结果影响很大,而在实际应用中,很难准确地确定最优的K值。
  • 对初始质心敏感:不同的初始质心选择可能会导致完全不同的聚类结果,容易陷入局部最优解。
  • 对噪声和异常值敏感:由于质心的计算是基于簇内数据点的均值,噪声和异常值会对质心的位置产生较大影响。
  • 难以处理非凸形状的簇:K-means算法更适合处理呈球形分布的数据,对于非凸形状的簇,聚类效果往往不理想。

三、基于啤酒数据的K-means聚类实践

3.1 数据说明

本次实践使用的数据集(data.txt)包含了20种啤酒的相关特征信息,具体字段如下:

  • calories:卡路里含量
  • sodium:钠含量
  • alcohol:酒精浓度
  • cost:价格
name calories sodium alcohol cost
Budweiser 144 15 4.7 0.43
Schlitz 151 19 4.9 0.43
Lowenbrau 157 15 0.9 0.48
Kronenbourg 170 7 5.2 0.73
Heineken 152 11 5.0 0.77
Old_Milwaukee 145 23 4.6 0.28
Augsberger 175 24 5.5 0.40
Srohs_Bohemian_Style 149 27 4.7 0.42
Miller_Lite 99 10 4.3 0.43
Budweiser_Light 113 8 3.7 0.40
Coors 140 18 4.6 0.44
Coors_Light 102 15 4.1 0.46
Michelob_Light 135 11 4.2 0.50
Becks 150 19 4.7 0.76
Kirin 149 6 5.0 0.79
Pabst_Extra_Light 68 15 2.3 0.38
Hamms 139 19 4.4 0.43
Heilemans_Old_Style 144 24 4.9 0.43
Olympia_Goled_Light 72 6 2.9 0.46
Schlitz_Light 97 7 4.2 0.47

这些特征能够在一定程度上反映啤酒的属性差异,通过聚类分析可以发现不同啤酒之间的内在分组情况。

3.2 代码实现与解析

3.2.1 数据加载与预处理

首先,我们需要加载数据并进行简单的预处理,提取出用于聚类的特征矩阵。

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn import metrics
from sklearn.cluster import KMeans# 加载数据
beer = pd.read_table("data.txt",sep=" ",encoding="utf8",engine="python"
)# 提取特征矩阵(排除第一列的啤酒名称)
X = beer.iloc[:, 1:]

3.2.2 确定最优聚类数 K

为了得到较好的聚类效果,需要确定合适的聚类数 K。这里我们采用轮廓系数(Silhouette Score)来评估不同 K 值下的聚类效果。轮廓系数的取值范围在 [-1, 1] 之间,越接近 1 表示聚类效果越好。

scores = []
K = [2, 3, 4, 5, 6, 7, 8, 9]  # 候选聚类数范围
for i in K:# 初始化K-means模型km = KMeans(n_clusters=i,  # 聚类数random_state=0,  # 随机种子,保证结果可复现n_init=10  # 多次初始化取最优结果,避免局部最优)km.fit(X)  # 训练模型labels = km.labels_  # 获取聚类标签# 计算轮廓系数score = metrics.silhouette_score(X, labels)scores.append(score)print(f"当K={i}时,轮廓系数为:{score:.4f}")

3.2.3 确定最优 K 并执行聚类

根据计算得到的轮廓系数,选择轮廓系数最大的 K 值作为最优聚类数,并使用该 K 值进行最终的聚类。

# 确定最优聚类数
best_K = K[np.argmax(scores)]
print(f"最优聚类数为:{best_K}")# 用最优K执行聚类
km = KMeans(n_clusters=best_K, random_state=0, n_init=10)
km.fit(X)
labels = km.labels_  # 每个样本的聚类标签
centroids = km.cluster_centers_  # 聚类中心坐标# 输出聚类结果
print(f"最优K值下的轮廓系数:{metrics.silhouette_score(X, labels):.4f}")
print("各样本的聚类标签:", labels)
print("聚类中心坐标:", centroids)

四、sklearn.cluster.KMeans API 详解

4.1 主要参数

参数说明默认值
n_clusters要形成的簇的数量,即 K 值8
n_init算法运行的初始质心配置次数,最终结果将是这些运行结果中最好的一个10
max_iter最大迭代次数300
tol收敛阈值,当质心的变化小于该值时,算法停止迭代1e-4
random_state随机数生成器的种子,用于初始化质心,设置该参数可以保证结果的可复现性None
algorithm用于计算的算法,可选值为 ‘lloyd’、‘elkan’ 等‘lloyd’

4.2 主要属性

  • labels_:数组,形状为 (n_samples,),每个样本的聚类标签。
  • cluster_centers_:数组,形状为 (n_clusters, n_features),每个簇的质心坐标。
  • inertia_:float,所有样本到其所属簇质心的平方距离之和,用于衡量聚类的紧凑程度。
  • n_iter_:int,实际迭代的次数。

4.3 主要方法

  • fit (X):对数据集 X 进行聚类训练。
  • predict (X):对新的数据集 X 进行预测,返回每个样本的聚类标签。
  • fit_predict (X):同时进行训练和预测,返回聚类标签。
  • transform (X):将 X 转换为样本到各质心的距离矩阵。

五、聚类效果评估指标

5.1 轮廓系数(Silhouette Score)

如前文所述,轮廓系数综合考虑了样本与同簇样本的相似度和与其他簇样本的相似度,是一种常用的聚类效果评估指标。其计算过程如下:

  1. 对于每个样本 iii,计算它与同簇内所有其他样本的平均距离,记为 aia_iai(簇内相似度)。
  2. 计算样本 i 与距离最近的其他簇内所有样本的平均距离,记为 bib_ibi(簇间相似度)。
  3. 样本 iii 的轮廓系数为:si=bi−aimax⁡(ai,bi)s_i = \frac{b_i - a_i}{\max(a_i, b_i)}si=max(ai,bi)biai
  4. 整个数据集的轮廓系数为所有样本轮廓系数的平均值。

5.2 肘部法(Elbow Method)

肘部法通过观察不同 K 值下的 inertia(簇内平方和)变化来确定最优 K 值。随着 K 值的增大,inertia 会逐渐减小,因为更多的簇可以更好地拟合数据。当 K 值增加到一定程度后,inertia 的减小速度会明显变慢,形成一个类似 “肘部” 的拐点,这个拐点对应的 K 值通常被认为是较优的聚类数。

5.3 Calinski-Harabasz 指数

该指数通过计算簇间离散度与簇内离散度的比值来评估聚类效果,值越大表示聚类效果越好。其计算公式为:

CH=between-cluster dispersionwithin-cluster dispersion×n−kk−1CH = \frac{\text{between-cluster dispersion}}{\text{within-cluster dispersion}} \times \frac{n-k}{k-1}CH=within-cluster dispersionbetween-cluster dispersion×k1nk

其中,nnn 为样本数量,kkk 为聚类数。


六、总结与拓展

K-means 聚类算法以其简单、高效的特点,在数据分析领域有着重要的地位。通过本文的学习,我们了解了 K-means 的基本原理、优势与局限性,并结合啤酒数据进行了实战演练,同时也深入解析了 sklearn 中 KMeans 的 API。

在实际应用中,为了得到更好的聚类结果,需要注意以下几点:

  1. 合理选择 K 值,可以结合多种评估指标进行综合判断。
  2. 对数据进行预处理,如标准化或归一化,消除量纲对距离计算的影响。
  3. 针对 K-means 的局限性,可以尝试使用其改进算法,如 K-means++(优化初始质心的选择)、Mini-Batch K-means(适用于大规模数据)等。

基本原理、优势与局限性,并结合啤酒数据进行了实战演练,同时也深入解析了 sklearn 中 KMeans 的 API。

在实际应用中,为了得到更好的聚类结果,需要注意以下几点:

  1. 合理选择 K 值,可以结合多种评估指标进行综合判断。
  2. 对数据进行预处理,如标准化或归一化,消除量纲对距离计算的影响。
  3. 针对 K-means 的局限性,可以尝试使用其改进算法,如 K-means++(优化初始质心的选择)、Mini-Batch K-means(适用于大规模数据)等。

此外,还可以将 K-means 与其他数据挖掘技术结合使用,如在聚类结果的基础上进行分类、关联规则挖掘等,以获取更有价值的信息。希望本文能够帮助读者更好理解和应用 K-means 聚类算法。

http://www.dtcms.com/a/322410.html

相关文章:

  • AI大语言模型在生活场景中的应用日益广泛,主要包括四大类需求:文本处理、信息获取、决策支持和创意生成。
  • 《Learning To Count Everything》论文阅读
  • 动态路由菜单:根据用户角色动态生成菜单栏的实践(包含子菜单)
  • 使用加密技术实现个人密码本保护
  • try/catch/throw 简明指南
  • orcad的操作(1)
  • 写 SPSS文件系统
  • Docker容器
  • 多级缓存详解
  • RAG-大模型课程《李宏毅 2025》作业1笔记
  • 从“人拉肩扛”到“智能协同”——AGV重构消防智能仓储价值链
  • 我用C++和零拷贝重构了文件服务器,性能飙升3倍,CPU占用降低80%
  • 202506 电子学会青少年等级考试机器人二级理论综合真题
  • Spark02 - SparkContext介绍
  • 304 引发的 SEO 难题:缓存策略与内容更新如何两全?
  • 【ref、toRef、toRefs、reactive】ai
  • 比较useCallback、useMemo 和 React.memo
  • kafka架构原理快速入门
  • Opencv[七]——补充
  • 基于HTML的政策问答
  • java组件安全vulhub靶场
  • HTML金色流星雨
  • 服务器硬件电路设计之I2C问答(二):I2C总线的传输速率与上拉电阻有什么关系?
  • ELK常见的问题
  • 华为实验:DHCP 典型配置
  • 《汇编语言:基于X86处理器》第12章 复习题和练习
  • Openlayers基础教程|从前端框架到GIS开发系列课程(19)地图控件和矢量图形绘制
  • Elasticsearch `_search` API Query DSL、性能开关与实战范式
  • 如何优雅的使用进行参数校验
  • Nginx 功能扩展与二次开发实践