机器学习-聚类分析之KMeans

本文详细介绍了KMeans聚类算法,包括基本思路、聚类过程、优缺点及效果评价。该算法按数据内在相似性划分数据集,原理简单、易实现,小数据集效率高,但易局部收敛、对异常值敏感。还介绍了轮廓系数和Calinski - Harabasz Index等效果评估方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


KMeans聚类

KMeans官方文档:
https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans

GitHub文档地址:https://github.com/gao7025/cluster_kmeans


基本思路

聚类分析是根据在数据中发现的描述对象及其关系的信息,将数据对象分组。目的是,组内的对象相互之间是相似的(相关的),而不同组中的对象是不同的(不相关的)。组内相似性越大,组间差距越大,说明聚类效果越好。KMeans算法,对大量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,是类别内数据相似度较大,而类别间相似度较小。

*class sklearn.cluster.KMeans(n_clusters=8, , init=‘k-means++’, n_init=10, max_iter=300, tol=0.0001, precompute_distances=‘deprecated’, verbose=0, random_state=None, copy_x=True, n_jobs=‘deprecated’, algorithm=‘auto’)

主要有以下几步:

  • 选择数据,设定K值为m类
  • 初始化中心点,随机选取n个
  • 将离数据点近的点划分到相应类
  • 更新类的中心
  • 重新将离数据近的点划分到相应类
  • 重复以上两个步骤,直到类中心不再变化

举例说明聚类过程
如下表所示,有6个样本及对应的坐标数值,并画出散点图查看可大致聚类的分组,可以看出聚成两类或三类是比较合适的,本例以聚成两类举例说明聚类过程。
在这里插入图片描述
在这里插入图片描述
详细过程:
1.设定K=2,聚成两类
2.随机选取初始的两个点,如选取A、B
3.分别计算其他各点到A、B的距离(以欧式距离为例)
在这里插入图片描述
在这里插入图片描述
新的分组:
第一组:B、C、F
第二组:A、D、E

4.计算新的分组类中心:
第一组:( (4+3+3)/3 , (3+3+4)/3 ) = (3.33 , 3.33)
第二组:( (2+3+5)/3 , (1+1+0)/3 ) = (3.33 , 0.67)

5.再次分别计算其他各点到新的分组两个类中心的距离
在这里插入图片描述

此时,我们发现,分组没有变化,聚类收敛,聚类过程结果,否则继续重复1、2、3的过程,直到收敛结束聚类。

优点:
  1. 算法原理简单,容易实现,小数据集运行效率高
  2. 可解释强,适用于高维数据的聚类
  3. 贪心算法策略,提高了局部最优点的质量,使收敛的速度更快
缺点:
  1. 也正是由于贪心算法,容易导致局部收敛,在大规模数据集上计算较大,求解较慢
  2. 对异常值和噪声点敏感,影响聚类的结果
效果评价

从簇内的稠密程度和簇间的离散程度来评估聚类的效果,常见的方法有轮廓系数Silhouette Coefficient和Calinski-Harabasz Index

  1. 轮廓系数(Silhouette Coefficient)结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果。该值处于-1~1之间,值越大,表示聚类效果越好。
  2. 类别内部数据的协方差越小越好,类别之间的协方差越大越好,这样的Calinski-Harabasz分数会高。

代码示例

def kmeans_clusters(X, n, y):
    np.random.seed(123)
    if y == 'y':
        scaler = MinMaxScaler()
        scaler.fit(X.astype(float))
        X = scaler.transform(X)
    est = KMeans(n_clusters=n)
    est.fit(X)
    return X, est

效果示例
在这里插入图片描述

详细代码及数据见
https://github.com/gao7025/cluster_kmeans

示例补充

1)随机生成几个样本ABCDEF及二维数据点,假设k=2。

在这里插入图片描述
2)随机初始类中心
在这里插入图片描述
计算样本点与类中心的距离,距离近的为一类
在这里插入图片描述
3)重新计算类中心
在这里插入图片描述
计算样本点与类中心的距离,距离近的为一类
在这里插入图片描述
4)重新计算类中心
在这里插入图片描述
计算样本点与类中心的距离,距离近的为一类
在这里插入图片描述
5)再重新计算类中心
在这里插入图片描述
再计算样本点与类中心的距离,距离近的为一类
在这里插入图片描述
6)类中心不再变化,没类样本点也没有发生变化,计算结束。最终ABE为一类,CDF为另一类。
在这里插入图片描述
散点图效果
在这里插入图片描述

### 统计学与机器学习中的聚类算法 #### 1. 聚类分析的概念及其应用场景 聚类分析是一种无监督学习技术,旨在将一组对象划分为若干个子集(称为簇),使得同一个簇内的对象尽可能相似,而不同簇的对象差异较大。这种技术在多个领域有广泛应用,例如市场细分、图像分割、异常检测以及推荐系统等[^2]。 #### 2. 常见的聚类算法 常见的聚类算法包括但不限于 K-Means、层次聚类、DBSCAN 和 Mean Shift 等。其中,K-Means 是最常用的聚类算法之一,其基本思想是通过迭代优化的方式找到使簇内平方误差最小化的质心位置[^3]。 #### 3. K-Means 聚类算法的原理 K-Means 算法的核心目标是最小化簇内距离之和。具体而言,它试图解决如下优化问题: \[ J(C, \mu) = \sum_{i=1}^{k}\sum_{x_j \in C_i} ||x_j - \mu_i||^2 \] 其中 \(C\) 表示簇集合,\( \mu \) 表示各簇的中心点,\( k \) 是预定义的簇数量。为了求解这一问题,K-Means 使用交替优化策略:首先随机初始化簇中心,然后反复执行分配样本到最近簇和更新簇中心的操作直到收敛。 #### 4. 如何评估聚类质量? 一种常用的方法是计算 Silhouette 系数或平均轮廓系数。Silhouette 系数值介于 [-1, 1] 之间,越接近 1 表明聚类效果越好;反之,则表示可能需要重新调整参数设置或者尝试其他类型的聚类方法[^4]。 以下是 Python 中实现简单版本 K-Means 的代码片段: ```python from sklearn.cluster import KMeans import numpy as np data = np.array([[1, 2], [1, 4], [1, 0], [10, 2], [10, 4], [10, 0]]) kmeans = KMeans(n_clusters=2, random_state=0).fit(data) print(kmeans.labels_) print(kmeans.cluster_centers_) ``` 上述脚本展示了如何使用 `scikit-learn` 库快速构建并训练一个两分类别的 K-Means 模型。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值