Kmeans聚类时K值选择的方法

这篇具有很好参考价值的文章主要介绍了Kmeans聚类时K值选择的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.K-means算法

(1)简单介绍

聚类属于非监督学习,K均值聚类是最基础常用的聚类算法。它的基本思想是,通过迭代寻找K个簇(Cluster)的一种划分方案,使得聚类结果对应的损失函数最小。其中,损失函数可以定义为各个样本距离所属簇中心点的误差平方和:

Kmeans聚类时K值选择的方法

其中 Kmeans聚类时K值选择的方法代表第 Kmeans聚类时K值选择的方法个样本, Kmeans聚类时K值选择的方法Kmeans聚类时K值选择的方法所属的簇,Kmeans聚类时K值选择的方法代表簇对应的中心点, Kmeans聚类时K值选择的方法是样本总数。

(2)具体步骤

KMeans的核心目标是将给定的数据集划分成K个簇(K是超参),并给出每个样本数据对应的中心点。具体步骤非常简单,可以分为4步:

(1)数据预处理。主要是标准化、异常点过滤。

(2)随机选取K个中心,记为 Kmeans聚类时K值选择的方法

(3)定义损失函数: Kmeans聚类时K值选择的方法

(4)令t=0,1,2,… 为迭代步数,重复如下过程直到Kmeans聚类时K值选择的方法收敛:

(4.1)对于每一个样本 Kmeans聚类时K值选择的方法,将其分配到距离最近的中心

Kmeans聚类时K值选择的方法

(4.2)对于每一个类中心k,重新计算该类的中心

Kmeans聚类时K值选择的方法
KMeans最核心的部分就是先固定中心点,调整每个样本所属的类别来减少 J;再固定每个样本的类别,调整中心点继续减小J 。两个过程交替循环, J单调递减直到最(极)小值,中心点和样本划分的类别同时收敛。

2.K值的选取方法

(1)手肘法

手肘法将簇间误差平方和看成是类簇数量k的函数。随着k的增加,每个类簇内的离散程度越小,总距离平方和也就在不断减小,并且减小的程度越来越不明显。极限情况是当k=N时,每个类簇只有一个点,这时总的误差平方和为0。手肘法认为我们应该选择这样的k:当k继续增大时,总误差平方和减少的趋势不再明显,也就是“拐点”处。具体过程如下:

  1. 选择一个聚类算法(例如K-means),计算不同k时的聚类结果,例如k可以取为0~10。
  2. 对每个k,计算总的簇间距离平方和。
  3. 画出总簇间距离平方和随k值增加的变化趋势。
  4. 图中弯曲的“拐点”处对应的k就是最合适的类簇数量
# 手肘法调研了一下基本是画出图片以后,采取目测的方式选择合适的K,
# 这里我自己写了一个获取K的方法,好像有点不准
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

def get_k_value(distortions, start_class_num = 1):
    """
    通过手肘法计算最优的k值
    Args:
        border_entity_info: 
    Returns:
        k: 最优的k值
    """
    k = 0
    for i in range(len(distortions) - 1):
        if distortions[i] - distortions[i+1] < 1:
            k = i + start_class_num
            break
    return k
    
def elbow_method_K(data, range_K, pro_num):
    K = range(1, range_K + 1)
    meandistortions = []
    for k in K:
        kmeans = KMeans(n_clusters=k)
        kmeans.fit(data)
        meandistortions.append(kmeans.inertia_)
    best_k = get_k_value(meandistortions)
    plt.plot(K, meandistortions, 'bx-')
    plt.xlabel('k')
    plt.ylabel('Average Dispersion')
    plt.title('Selecting k with the Elbow Method')
    plt.savefig(f'/Users/cecilia/Desktop/K_图片/{pro_num}_elbow_K.jpg')
    plt.cla()
    return best_k
# 这个函数是我自己使用的时候封装的
# data是需要进行聚类的数据,可以是多维矩阵
# range_K是类别的可选择范围
# pro_num是名称,没有实际意义是为了将图片保存下来,不想保存图片可以直接使用plt.show()

(2)Gap Statistic

是斯坦福大学的三位教授在2001年的一篇论文中(R. Tibshirani, G. Walther, and T. Hastie, 2001)提出来的,可用于任何的聚类方法。Gap Statistic的主要思想是比较不同k时原始数据的簇内偏差总和与数据在均匀分布推断下的簇内偏差总和。使Gap Statistic这个统计量达到最大值意味着此时的聚类结果结构与随机均匀分布产生的数据的聚类结果差别最大,此时的k就是最优的k。算法如下:

  1. 将原始的观测数据进行聚类,k=0,…, k_max,计算不同k值对应的簇内偏离和W_k。
  2. 通过随机的均匀分布产生B个推断数据,对这些推断数据进行聚类,k=0,…, k_max。计算不同k值对应的在B个推断数据上的平均簇内偏离和W_kb。
  3. 计算gap statistic:W_k与W_kb的log偏差Gap(k)。同时计算这个偏差的标准差sd_k,然后令s_k = sprt(1+1/B*sd_k)。
  4. 选择一个最小的k,这样的k满足Gap(k) > Gap(k+1) - s_k+1。
    流行的做法是直接选择最大的Gap(k)所对应的k作为最优k,也就是忽略上述的第四步。需要注意的是当B=500时,W_kb是非常精确的,在下一次迭代中基本保持不变。
    注意⚠️:使用这个需要安装一个库,具体信息可以看Gap Statistic
from gap_statistic import OptimalK

ef gap_statistic_K(data, range_K, pro_num):
    K = np.arange(1, range_K)
    optimalK = OptimalK(n_jobs=1, parallel_backend='joblib')
    n_clusters = optimalK(data, cluster_array=K)
    # Gap values plot
    plt.plot(optimalK.gap_df.n_clusters, optimalK.gap_df.gap_value, linewidth=3)
    plt.scatter(optimalK.gap_df[optimalK.gap_df.n_clusters == n_clusters].n_clusters,
                optimalK.gap_df[optimalK.gap_df.n_clusters == n_clusters].gap_value, s=250, c='r')
    plt.grid(True)
    plt.xlabel('Cluster Count')
    plt.ylabel('Gap Value')
    plt.title('Gap Values by Cluster Count')
    plt.savefig(f'/Users/cecilia/Desktop/K_图片/{pro_num}_gap_values_K.jpg')
    plt.cla()
    # plt.show()


    # # diff plot
    # plt.plot(optimalK.gap_df.n_clusters, optimalK.gap_df["diff"], linewidth=3)
    # plt.grid(True)
    # plt.xlabel("Cluster Count")
    # plt.ylabel("Diff Value")
    # plt.title("Diff Values by Cluster Count")
    # # plt.show()
    # plt.savefig(f'/Users/cecilia/Desktop/K_图片/{pro_num}_diff_2.jpg')
    # plt.cla()


    # Gap* plot
    # max_ix = optimalK.gap_df[optimalK.gap_df["gap*"] == optimalK.gap_df["gap*"].max()].index[0]
    # plt.plot(optimalK.gap_df.n_clusters, optimalK.gap_df["gap*"], linewidth=3)
    # plt.scatter(
    #     optimalK.gap_df.loc[max_ix]["n_clusters"],
    #     optimalK.gap_df.loc[max_ix]["gap*"],
    #     s=250,
    #     c="r",
    # )
    # plt.grid(True)
    # plt.xlabel("Cluster Count")
    # plt.ylabel("Gap* Value")
    # plt.title("Gap* Values by Cluster Count")
    # plt.savefig(f'/Users/cecilia/Desktop/K_图片/{pro_num}_Gap*_3.jpg')
    # plt.cla()

    # plt.show()

    # # diff* plot
    # plt.plot(optimalK.gap_df.n_clusters, optimalK.gap_df["diff*"], linewidth=3)
    # plt.grid(True)
    # plt.xlabel("Cluster Count")
    # plt.ylabel("Diff* Value")
    # plt.title("Diff* Values by Cluster Count")
    # plt.savefig(f'/Users/cecilia/Desktop/K_图片/{pro_num}_diff*_4.jpg')
    # plt.cla()

    # plt.show()
    return n_clusters

(3)平均轮廓系数法

平均轮廓系数方法衡量了聚类结果的质量,即衡量每个点被放到当前类簇有多合适,平均轮廓系数很高意味着聚类的结果很好。这种方法计算不同k值下,所有点的平均轮廓系数,能够使平均轮廓系数最大的k就是最优的类簇数量(Kaufman and Rousseeuw 1990)。
具体的过程与手肘法是相似的:

  1. 选择一个聚类算法(例如K-means),计算不同k时的聚类结果,例如k可以取为0~10。
  2. 对于每个k,计算所有观测点的平均轮廓系数。
  3. 画出这个指标随着k变化的曲线。
  4. 曲线中最高点对应的k就是最优聚类数量。
from sklearn.metrics import silhouette_score
from sklearn.cluster import KMeans

def get_silhouette_K(data, range_K, pro_num):
    K = range(2, range_K)
    Scores = [] 
    for k in K:
        kmeans = KMeans(n_clusters=k)
        kmeans.fit(data)
        Scores.append(silhouette_score(data, kmeans.labels_, metric='euclidean'))

    max_idx = Scores.index(max(Scores))
    best_k = K[max_idx]
    plt.plot(K, Scores, 'bx-')
    plt.xlabel('k')
    plt.ylabel('silhouette')
    plt.title('Selecting k with the silhouette Method')
    plt.savefig(f'/Users/cecilia/Desktop/K_图片/{pro_num}_silhouette_K.jpg')
    plt.cla()
    return best_k
# 这个函数是我自己使用的时候封装的
# data是需要进行聚类的数据,可以是多维矩阵
# range_K是类别的可选择范围
# pro_num是名称,没有实际意义是为了将图片保存下来,不想保存图片可以直接使用plt.show()

注意⚠️:在使用轮廓系数法时,遇到一个问题就是K值的选择必须从2开始,最多只能选择n_samples -1(最大K候选就是样本数量-1),不然会报错的,具体没有细细研究。文章来源地址https://www.toymoban.com/news/detail-447071.html

到了这里,关于Kmeans聚类时K值选择的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习之K-means聚类算法

    目录 K-means聚类算法 算法流程 优点 缺点 随机点聚类 人脸聚类 旋转物体聚类 K-means聚类算法是一种无监督的学习方法,通过对样本数据进行分组来发现数据内在的结构。K-means的基本思想是将n个实例分成k个簇,使得同一簇内数据相似度高而不同簇之间数据相似度低。 K-means的

    2024年02月11日
    浏览(33)
  • K-means聚类算法原理及实现

    1.1概念 聚类分析,也称为分割分析或分类分析,可将样本数据分成一个个组(即簇)。同一簇中的对象是相似的,不同簇中的对象则明显不同。 Statistics and Machine Learning Toolbox™ 提供了几种聚类方法和相似性度量(也称为距离度量)来创建簇。此外,簇计算可以按照不同的计

    2024年03月18日
    浏览(33)
  • K-means++聚类算法(matlab实现)

    K-means++算法:K-means++算法是K-means算法的改进版,其在选择初始质心时采用了一种更加聪明的方法,能够有效地避免局部最优解。具体来说,K-means++算法的初始质心是根据距离数据点最远的原则来选择的,这样可以保证初始质心的分布更加广泛,从而使得算法更容易找到全局最

    2024年02月07日
    浏览(83)
  • K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means)介绍与对比

      目录  一、概述 二、经典K-means算法 三、K-means++算法 四、ISODATA算法 六、数据集测试       在本篇文章中将对四种聚类算法(K-means,K-means++,ISODATA和Kernel K-means)进行详细介绍,并利用数据集来真实地反映这四种算法之间的区别。       首先需要明确的是上述四种算法都属

    2024年01月23日
    浏览(39)
  • 四种确定K-means最佳聚类个数的方法(K-means++)——附代码

    目录 摘要: 1.K-means算法 2.Calinski-Harabasz Criterion(卡林斯基-哈拉巴斯指标,CH值) 3.Davies-Bouldin Criterion(戴维斯-博尔丁指标,DB值) 4.Gap Value(Gap值) 5.Silhouette Coefficient(轮廓系数) 6.基于Matlab的K-means聚类及最佳聚类数选取结果: 7.本文Matlab代码实现: Kmeans算法中,K值所决

    2024年01月17日
    浏览(33)
  • K-means聚类算法及Python代码实现

    K-means聚类算法(事先数据并没有类别之分!所有的数据都是一样的) 1、概述 K-means算法是集简单和经典于一身的 基于距离的聚类算法 采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。 该算法认为类簇是由距离靠近的对象组成的,因此把得到

    2023年04月24日
    浏览(35)
  • 传统机器学习(三)聚类算法K-means(一)

    K-Means算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛。K-Means基于欧式距离认为两个目标距离越近,相似度越大。 1.1.1 算法流程 (1)图a表达了初始的数据集, 假设k=2; (2)在图b中,随机选择两个k类的对应的类别质心,即图中的红色质

    2023年04月15日
    浏览(30)
  • K-means聚类算法(附Python实现代码)

    本文的代码与数据地址已上传至github:https://github.com/helloWorldchn/MachineLearning 1、基于划分的聚类 划分算法的思想是,将给定待挖掘数据集中的数据对象划分成K组(k≤N,N代表数据集中对象数目),每一组表示一个聚类的簇。并且要满足任何一个数据对象仅可以属于一个聚类,

    2024年02月07日
    浏览(28)
  • K-means聚类算法原理、步骤、评价指标和实现

    1、聚类 聚类与分类不同,聚类分析分通过分析大量含有一定规律但杂乱数据,得到数据间内在的逻辑,将杂乱的数据按照所得的数据规律划分成不同的种类。K-measn、DBSCAN和层次是当前广泛使用的三种聚类方法。以下对三种方法进行分析,选择适合的聚类方法。 方法 K-means

    2024年02月07日
    浏览(43)
  • 【机器学习】K-means聚类算法:原理、应用与优化

    一、引言 1、简述聚类分析的重要性及其在机器学习中的应用   聚类分析,作为机器学习领域中的一种无监督学习方法,在数据探索与知识发现过程中扮演着举足轻重的角色。它能够在没有先验知识或标签信息的情况下,通过挖掘数据中的内在结构和规律,将数据对象自动

    2024年04月13日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包