Kmeans算法的K值选择技巧【Elbow Method + Silhouette Score Method】

news2024/11/15 9:46:36

文章目录

  • 一、方法简述
  • 二、使用到的数据集
  • 三、代码实现
  • 四、结论


一、方法简述

在Kmeans算法中最终聚类数量K的选择主要通过两个方法综合判断:

  1. Elbow Method
    这是一种绘制k值范围的平方和的方法。如果此图看起来像一只手臂,则k是选择的类似肘部的值。从这个肘值开始,平方和(惯性)开始以线性方式减小,因此被认为是最佳值。
    在这里插入图片描述
    上图的最佳K值为3

  2. Silhouette Score Method
    这是一种根据数据点与彼此相似的其他数据点的聚类程度来评估聚类质量的方法。使用距离公式计算该分数,并且选择具有最高分数的k值用于建模。
    具体来说,Silhouette Score 是一种衡量聚类结果质量的指标,它结合了聚类内部的紧密度和不同簇之间的分离度。对于每个数据点,Silhouette Score 考虑了以下几个因素:
      1.紧密度:数据点到同簇其他点的平均距离
      2.分离度:数据点到最近不同簇的平均距离
    设紧密度为a,分离度为b,Silhouette Score 计算公式为 ( b − a ) / m a x ( a , b ) (b - a) / max(a, b) (ba)/max(a,b)。该值的范围在 -1 到 1 之间,越接近 1 表示数据点聚类得越好,越接近 -1 则表示聚类结果较差。
    在这里插入图片描述
    上图的最佳值为2,3,4

综合两种方法进行判断后,K值选3较为合适


二、使用到的数据集

  • 用到的数据集:
    各国发展水平统计信息↓
    https://download.csdn.net/download/weixin_43721000/88480791
  • 字段解释:
    country : 国名
    child_mort : 每1000个婴儿的5年死亡率
    exports : 人均商品和服务出口,以人均国内生产总值的百分比给出
    health : 人均卫生支出总额,以人均国内生产总值的百分比给出
    imports : 人均商品和服务进口,以人均国内生产总值的百分比给出
    Income : 人均净收入
    Inflation : 国内生产总值年增长率的测算(通货膨胀率)
    life_expec : 如果按照目前的死亡率模式,新生儿的平均寿命是多少年
    total_fer : 如果目前的年龄生育率保持不变,每个妇女生育的孩子数量
    gdpp : 人均国内生产总值,计算方法是国内生产总值除以总人口
  • 任务类型:
    对所有国家发展水平聚类,确定待援助国家,涵盖算法:K-Means、DBSCAN、Hierarchical

三、代码实现

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
pd.options.display.float_format = '{:.2f}'.format
import warnings
warnings.filterwarnings('ignore')

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import MinMaxScaler, StandardScaler



def show_elbow_and_silhouette_score(data_values):
    '''
    1.计算Elbow Method
    2.计算Silhouette Score Method
    3.绘图
    :return:
    '''
    sse = {}
    sil = []
    kmax = 10
    fig = plt.subplots(nrows=1, ncols=2, figsize=(20, 5))

    # Elbow Method :
    plt.subplot(1, 2, 1)
    for k in range(1, 10):
        kmeans = KMeans(n_clusters=k, max_iter=1000).fit(data_values)
        sse[k] = kmeans.inertia_  # Inertia: Sum of distances of samples to their closest cluster center
    sns.lineplot(x=list(sse.keys()), y=list(sse.values()))
    plt.title('Elbow Method')
    plt.xlabel("k : Number of cluster")
    plt.ylabel("Sum of Squared Error")
    plt.grid()

    # Silhouette Score Method
    plt.subplot(1, 2, 2)
    for k in range(2, kmax + 1):
        kmeans = KMeans(n_clusters=k).fit(data_values)
        labels = kmeans.labels_
        sil.append(silhouette_score(data_values, labels, metric='euclidean'))
    sns.lineplot(x=range(2, kmax + 1), y=sil)
    plt.title('Silhouette Score Method')
    plt.xlabel("k : Number of cluster")
    plt.ylabel("Silhouette Score")
    plt.grid()

    plt.show()


if __name__ == '__main__':


    # 读取数据
    data = pd.read_csv('./data/Country-data.csv')
    print(data.head())
    #                country  child_mort  exports  ...  life_expec  total_fer   gdpp
    # 0          Afghanistan       90.20    10.00  ...       56.20       5.82    553
    # 1              Albania       16.60    28.00  ...       76.30       1.65   4090
    # 2              Algeria       27.30    38.40  ...       76.50       2.89   4460
    # 3               Angola      119.00    62.30  ...       60.10       6.16   3530
    # 4  Antigua and Barbuda       10.30    45.50  ...       76.80       2.13  12200


    # 数据降维
    # 将较为细分的领域数据合并
    # health <== child_mort, health, life_expec, total_fer
    # trade <== imports, exports
    # finance <== income, inflation, gdpp
    # 最终由9个维度降至3维
    df = pd.DataFrame()
    df['Health'] = (data['child_mort'] / data['child_mort'].mean()) + (data['health'] / data['health'].mean()) + (
                data['life_expec'] / data['life_expec'].mean()) + (data['total_fer'] / data['total_fer'].mean())
    df['Trade'] = (data['imports'] / data['imports'].mean()) + (data['exports'] / data['exports'].mean())
    df['Finance'] = (data['income'] / data['income'].mean()) + (data['inflation'] / data['inflation'].mean()) + (
                data['gdpp'] / data['gdpp'].mean())
    print(df.head())
    #    Health  Trade  Finance
    # 0    6.24   1.20     1.35
    # 1    3.04   1.72     1.47
    # 2    3.39   1.60     3.17
    # 3    6.47   2.43     3.49
    # 4    2.96   2.36     2.24


    # 数据归一化
    mms = MinMaxScaler()  # Normalization
    # ss = StandardScaler()  # Standardization
    df['Health'] = mms.fit_transform(df[['Health']])
    df['Trade'] = mms.fit_transform(df[['Trade']])
    df['Finance'] = mms.fit_transform(df[['Finance']])
    df.insert(loc=0, value=list(data['country']), column='Country')
    print(df.head())
    #                Country  Health  Trade  Finance
    # 0          Afghanistan    0.63   0.14     0.08
    # 1              Albania    0.13   0.20     0.09
    # 2              Algeria    0.18   0.19     0.21
    # 3               Angola    0.66   0.28     0.24
    # 4  Antigua and Barbuda    0.12   0.28     0.15


    # 取出归一化之后的各项特征张量
    data_values = df.drop(columns=['Country']).values  # Feature Combination : Health - Trade - Finance
    print(data_values)
    # [[0.6257404  0.13961443 0.07981958]
    #  [0.12745148 0.19990106 0.08875623]
    #  [0.18248518 0.18662177 0.2128085 ]
    #  [0.66138147 0.28305774 0.23694587]
    #      ...       ...        ...
    #  [0.17006974 0.40338563 0.12143593]
    #  [0.39745068 0.17024776 0.22963179]
    #  [0.52690852 0.18140481 0.13499709]]


    # 聚类并绘制 elbow 和 silhouette_score 方法的图像
    show_elbow_and_silhouette_score(data_values)


在这里插入图片描述


四、结论

  1. Elbow Method 显示肘部位置 K=3
  2. Silhouette Score Method 显示的较高分数在 K=2,3 时表现较好
  3. 综合两个方法最终确认 K的选值为 3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1144368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

走进人工智能的大门:打造职业梦想的契机

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;不再是科幻小说的情节&#xff0c;而是我们现实生活和职业生涯中的现实部分。从自动驾驶汽车到智能助手&#xff0c;AI 的影响已经渗透到各个领域。而中国&#xff0c;作为全球人工智能市场的重要一员&#xff…

HTML简单实现v-if与v-for与v-model

Vue启动&#xff01;&#xff01; 首先VIewModel将View和Model连接一起&#xff0c;Model的数据改变View的数据也变 使用Visual Studio Code 启动Vue需要vue.js插件和导入CDN(包) vue.js插件&#xff1a;CTRL shift x 在搜索栏搜 索vue.js安装即可 CDN&#xff1a; http…

利用HTTP2,新型DDoS攻击峰值破纪录

亚马逊、Cloudflare 和谷歌周二联合发布消息称&#xff0c;一种依赖于 HTTP/2 快速重置技术的攻击行为对它们造成了破纪录的分布式拒绝服务 (DDoS) 攻击。 根据披露的信息&#xff0c;该攻击自8月下旬以来便一直存在&#xff0c;所利用的漏洞被跟踪为CVE-2023-44487&#xff0c…

花园这样去装,让户外空间更上一个层次

花园这样去装&#xff0c;让户外空间更上一个层次 园林设计师马修-布罗姆利&#xff08;Matthew Bromley&#xff09;说&#xff1a;”我深受法国和英国花园传统的影响&#xff0c;而这些客户想要的是一个能让人回想起在法国南部迷人的凉棚下度过的时光的空间。斑驳的树荫、燃烧…

关于Web应用和容器的指纹收集以及自动化软件的制作

一次对Web应用的渗透&#xff0c;九成都是从信息收集开始&#xff0c;所以信息收集就显得尤为重要。关键信息的收集可以使你在后期渗透的时候更加的得心应手&#xff0c;把渗透比喻成走黑暗迷宫的话&#xff0c;那信息收集可以帮你点亮迷宫的大部分地图。 信息收集涉及的点特别…

[Leetcode] 0094. 二叉树的中序遍历

94. 二叉树的中序遍历 题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&…

现代风格设计,大美至简!福州中宅装饰,福州装修

风格&#xff1a;现代 面积&#xff1a;70m 户型&#xff1a;住宅 现代风格设计是较为流行的风格 注重家居空间的布局与使用功能的结合 追求时尚和潮流 客厅空间 简约风格已经成为装修的一种流行趋势 讲究以简洁的视觉制造出简单的风格 客厅的空间整体户型 是纵向客餐厅…

【Python】一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格

题目要求&#xff1a;一个句子中也许有多个连续空格&#xff0c;过滤掉多余的空格&#xff0c;只留下一个空格 例&#xff1a;&#xff08;为了方便观看&#xff0c;以 ▢ 代替空格&#xff09; 输入&#xff1a;123▢▢abc▢▢▢python 输出&#xff1a;123▢abc▢python 参考…

vue源码分析(五)——vue render 函数的使用

文章目录 前言一、render函数1、render函数是什么&#xff1f; 二、render 源码分析1.执行initRender方法2.vm._c 和 vm.$createElement 调用 createElement 方法详解&#xff08;1&#xff09;区别&#xff08;2&#xff09;代码 3、原型上的_render方法&#xff08;1&#xf…

轻量级仿 Spring Boot=嵌入式 Tomcat+Spring MVC

啥&#xff1f;Spring Boot 不用&#xff1f;——对。就只是使用 Spring MVC Embedded Tomcat&#xff0c;而不用 Boot。为啥&#xff1f;——因为 Boot 太重了&#xff1a;&#xff09; 那是反智吗&#xff1f;Spring Boot 好好的就只是因为太重就不用&#xff1f;——稍安勿…

EfficientViT:高分辨率密集预测的多尺度线性关注

标题&#xff1a;EfficientViT: Multi-Scale Linear Attention for High-Resolution Dense Prediction 论文&#xff1a;https://arxiv.org/abs/2205.14756 中文版&#xff1a;【读点论文】EfficientViT: Enhanced Linear Attention for High-Resolution Low-Computation将soft…

Betaflight关于STM32F405 SBUS协议兼容硬件电气特性问题

Betaflight关于STM32F405 SBUS协议兼容硬件电气特性问题 1. 源由2. 储备知识2.1 三态逻辑(Tri-state Logic)2.1 上拉 (Pull-up)2.2 下拉 (Pull-down)2.3 Current Sink2.4 Current Source2.5 GPIO输入模式2.6 GPIO输出模式 3. FPV系统协议简介3.1 TX Protocols – communication…

Elasticsearch跨集群检索配置

跨集群检索字面意思&#xff0c;同一个检索语句&#xff0c;可以检索到多个ES集群中的数据&#xff0c;ES集群默认是支持跨集群检索的&#xff0c;只需要动态的增加入节点即可&#xff0c;下面跟我一起来体验下ES的跨集群检索的魅力。 Elasticsearch 跨集群检索推荐的是不同集群…

vue源码分析(一)——源码目录说明

文章目录 一、如何下载源码&#xff08;可忽略&#xff09;&#xff08;1&#xff09;打开地址&#xff08;2&#xff09;复制链接&#xff08;3&#xff09;git clone 链接 二、源码目录说明1.可以根据你下载的源码通过package.json文件查看vue版本2.源码目录说明 一、如何下载…

Java中作为数据库某个表的实体类为什么一定要实现Serializable接口

在Java中&#xff0c;实体类并不一定要实现 Serializable 接口来作为数据库的某个表的映射。这个接口的实现主要与对象的序列化和反序列化相关。序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。在反序列化过程中&#xff0c;这些信息可以用来重构原始对象。 下面…

Go学习第十五章——Gin(参数绑定bind与验证器)

Go web框架——Gin&#xff08;参数绑定bind与验证器&#xff09; 1 bind参数绑定1.1 JSON参数1.2 Query参数1.3 Uri绑定动态参数1.4 ShouldBind自动绑定 2 验证器2.1 常用验证器2.2 gin内置验证器2.3 自定义验证的错误信息2.4 自定义验证器 1 bind参数绑定 在Gin框架中&#…

人工智能轨道交通行业周刊-第64期(2023.10.16-10.29)

本期关键词&#xff1a;北斗应用、供电智能运维、5G-R、铁路职称、星火大模型 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界铁路那…

数据结构和算法——用C语言实现所有排序算法

文章目录 前言排序算法的基本概念内部排序插入排序直接插入排序折半插入排序希尔排序 交换排序冒泡排序快速排序 选择排序简单选择排序堆排序 归并排序基数排序 外部排序多路归并败者树置换——选择排序最佳归并树 前言 本文所有代码均在仓库中&#xff0c;这是一个完整的由纯…

哨兵1和2号遥感数据请求失败

哨兵1和2号遥感数据请求失败 问题描述 在23年10月底下载哨兵数据的时候发现&#xff0c;22年12月前的哨兵数据都请求失败了&#xff0c;但是之后的数据都能够下载&#xff0c;是否是哨兵数据下载也有时间限制&#xff1f;网站上只能保存近一年来的数据呢&#xff1f; 解决方案…

C# | Chaikin算法 —— 计算折线对应的平滑曲线坐标点

Chaikin算法——计算折线对应的平滑曲线坐标点 本文将介绍一种计算折线对应的平滑曲线坐标点的算法。该算法使用Chaikin曲线平滑处理的方法&#xff0c;通过控制张力因子和迭代次数来调整曲线的平滑程度和精度。通过对原始点集合进行切割和插值操作&#xff0c;得到平滑的曲线坐…