【机器学习】(八)——聚类算法K-means

本文深入解析了K-Means算法的工作原理,包括模型的收敛过程、超参数选择及代码实现。讨论了K-Means算法的优点,如简单易懂、收敛速度快,同时也指出了其缺点,如对初始点敏感、对非凸数据集处理不佳等问题。通过详细的步骤说明,读者可以了解到如何从数据集中随机选择初始质心,进行迭代计算直至聚类稳定。

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

学习目标

1、k-means:模型原理、收敛过程、超参数的选择

2、代码实现

学习内容

【1】

模型原理:k-means算法将将训练集分成k个靠近彼此的不同样本聚类。对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。

  聚类试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集成为一个“簇”。通过这样的划分,每个簇可能对应于一些潜在的概念(也就是类别),如“浅色瓜” “深色瓜”,“有籽瓜” “无籽瓜”,甚至“本地瓜” “外地瓜”等;需说明的是,这些概念对聚类算法而言事先是未知的,聚类过程仅能自动形成簇结构,簇对应的概念语义由使用者来把握和命名。

优点:

  1、 简单,易于理解和实现
  2、 收敛快,一般仅需5-10次迭代即可,高效
缺点:
  1、对K值得选取把握不同对结果有很大的不同
  2、对于初始点的选取敏感,不同的随机初始点得到的聚类结果可能完全不同
  3、对于不是凸的数据集比较难收敛
  4、对噪点过于敏感,因为算法是根据基于均值的
  5、结果不一定是全局最优,只能保证局部最优
  6、对球形簇的分组效果较好,对非球型簇、不同尺寸、不同密度的簇分组效果不好。

收敛过程

选择K个点作为初始质心  
repeat  
    将每个点指派到最近的质心,形成K个簇  
    重新计算每个簇的质心  
until 簇不发生变化或达到最大迭代次数 

输入:
  样本集D={x_{1},x_{2},...,x_{m}};
  聚类簇数k

过程:
  从D中随机选择k个样本作为初始均值向量{\mu _{1},\mu _{2},...,\mu _{k}}
  repeat
    令C_{i}=空集(1<=i<=k)
    for j=1,2,...m do
      计算样本x_{j}与各均值向量μ_{i}(1<=i<=k)的距离:d_{ji}=||x_{j}_{i}||_{2}
      根据距离最近的均值向量确定x_{j}的簇标记:λ_{j}=argmin_{i}∈{1,2,...,k}d_{ji};
      将样本x_{j}划入相应的的簇:C_{\lambda _{j}}=C_{\lambda _{j}}∪{x_{j}};
    end for
    for i=1,2,...k do
      计算新均值向量:\mu {}'_{i}=\frac{1}{\left | C_{i} \right |}\sum_{x\epsilon C_{i}}x
      if \mu {}'_{i}\neq \mu _{i} then

        将当前均值向量μ_{i}更新为\mu {}'_{i}

      else

        保持当前均值向量不变

      end if
    end for

until 当前均值向量未更新

输出:簇划分C={{C_{1},C_{2},...,C_{k}}}

超参数的选择

可优化的 K-Means 超参数

使用以下超参数优化 Amazon SageMaker k-means 模型。对 k-means 目标指标影响最大的超参数为:mini_batch_sizeextra_center_factor 和 init_method。优化超参数 epochs 通常会得到较小的改进。

参数名称参数类型建议的范围
epochs

IntegerParameterRanges

最小值:1

最大值:10

extra_center_factorIntegerParameterRanges

最小值:4

最大值:10

init_methodCategoricalParameterRanges['kmeans++', 'random']
mini_batch_sizeIntegerParameterRanges

最小值:3000

最大值:15000

【2】

# dataSet样本点,k 簇的个数
# disMeas距离量度,默认为欧几里得距离
# createCent,初始点的选取
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
    m = shape(dataSet)[0] #样本数
    clusterAssment = mat(zeros((m,2))) #m*2的矩阵                   
    centroids = createCent(dataSet, k) #初始化k个中心
    clusterChanged = True             
    while clusterChanged:      #当聚类不再变化
        clusterChanged = False
        for i in range(m):
            minDist = inf; minIndex = -1
            for j in range(k): #找到最近的质心
                distJI = distMeas(centroids[j,:],dataSet[i,:])
                if distJI < minDist:
                    minDist = distJI; minIndex = j
            if clusterAssment[i,0] != minIndex: clusterChanged = True
            # 第1列为所属质心,第2列为距离
            clusterAssment[i,:] = minIndex,minDist**2
        print centroids

        # 更改质心位置
        for cent in range(k):
            ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]
            centroids[cent,:] = mean(ptsInClust, axis=0) 
    return centroids, clusterAssment

 

### K-Means聚类算法原理 K-Means是一种基于划分的无监督机器学习方法,旨在将一组未标记的数据划分为若干个簇(cluster),使得同一簇内的对象相似度尽可能高,而不同簇之间的对象差异较大。具体来说,该算法通过迭代优化来最小化各簇内样本到其对应质心的距离平方和。 #### 初始化阶段 首先随机选取\( k \)个初始中心点作为各个簇的心脏位置,在这里\( k \)表示预期得到的类别数量[^1]。 #### 迭代更新过程 对于每一迭代- **分配步骤**:计算所有数据点与当前已知质心间的距离,并据此决定它们所属的最佳簇;通常采用欧几里得距离衡量这种接近程度。 - **更新步骤**:重新计算每个新形成的簇的新质心坐标,即取属于同一个组的所有成员坐标的平均值作为新的代表向量[^2]。 上述两个操作会不断重复直到满足特定条件为止——比如达到最大允许循环次数或是前后两次所得结果相差甚微不再显著变化时停止运算。 ### Python实现示例 下面给出一段简单的Python代码用于展示如何利用`scikit-learn`库来进行基本的KMeans聚类分析: ```python from sklearn.cluster import KMeans import numpy as np # 创建模拟二维空间中的观测数据集 X = np.array([[1, 2], [1, 4], [1, 0], [10, 2], [10, 4], [10, 0]]) # 定义并训练模型 (指定要找寻三个群集) kmeans_model = KMeans(n_clusters=3).fit(X) # 输出最终获得的分类标签以及对应的质心位置 print("Labels:", kmeans_model.labels_) print("Centroids:\n", kmeans_model.cluster_centers_) ``` 此段脚本先构建了一个小型的人工数据集合,接着调用了Scikit-Learn提供的现成工具完成整个建模流程,最后打印出了预测出来的分组情况还有各自的核心节点所在之处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值