使用肘部法则确定K-Means中的k值

news2024/11/23 14:03:55

一 肘部法则

在K-means算法中,对于确定K(簇的数目),我们经常使用肘部法则。 肘部法则是一种用于确定在k均值聚类算法中使用的质心数(k)的技术。 在这种方法中,为了确定k值,我们连续迭代k=1到k=n(这里n是我们根据要求选择的超参数)。对于k的每个值,我们计算簇内平方和(WCSS)值。

WCSS -每个样本到簇内中心点的距离偏差之和。

现在,为了确定最佳的聚类数(k),我们绘制了k与它们的WCSS值的关系图。令人惊讶的是,该图看起来像一个肘部(我们将在后面看到)。此外,当k=1时,WCSS具有最高值,但随着k值的增加,WCSS值开始减小。我们从图开始看起来像直线的地方选择k值。

二 实战

下面我们将分4步实现肘部法则。首先,我们将创建随机数据集点,然后我们将在此数据集上应用k均值,并计算1到4之间的k的wcss值。

  1. 导入所需库

    from sklearn.cluster import KMeans
    from sklearn import metrics
    from scipy.spatial.distance import cdist
    import numpy as np
    import matplotlib.pyplot as plt
    
  2. 创建和可视化数据

    我们将创建一个随机数组并将其分布可视化

    # Creating the data
    x1 = np.array([3, 1, 1, 2, 1, 6, 6, 6, 5, 6,\
                   7, 8, 9, 8, 9, 9, 8, 4, 4, 5, 4])
    x2 = np.array([5, 4, 5, 6, 5, 8, 6, 7, 6, 7, \
                   1, 2, 1, 2, 3, 2, 3, 9, 10, 9, 10])
    X = np.array(list(zip(x1, x2))).reshape(len(x1), 2)
     
    # Visualizing the data
    plt.plot()
    plt.xlim([0, 10])
    plt.ylim([0, 10])
    plt.title('Dataset')
    plt.scatter(x1, x2)
    plt.show()
    

    从上面的可视化中,我们可以看到集群的最佳数量应该在3左右。但是,仅仅可视化数据并不能总是给予正确的答案。

    定义一个 Distortion = 1/n * Σ(distance(point, centroid)^2), 通常,使用欧几里得距离度量。

    Inertia = Σ(distance(point, centroid)^2)是样本到其最近聚类中心的平方距离之和。

    我们将k的值从1迭代到n,并计算每个k值的Distortion,给定范围内每个k值的Inertia。

  3. 构建聚类模型并计算Distortion和Inertia的值

    distortions = []
    inertias = []
    mapping1 = {}
    mapping2 = {}
    K = range(1, 10)
    
    for k in K:
    	# Building and fitting the model
    	kmeanModel = KMeans(n_clusters=k).fit(X)
    	kmeanModel.fit(X)
    
    	distortions.append(sum(np.min(cdist(X, kmeanModel.cluster_centers_,
    										'euclidean'), axis=1)) / X.shape[0])
    	inertias.append(kmeanModel.inertia_)
    
    	mapping1[k] = sum(np.min(cdist(X, kmeanModel.cluster_centers_,
    								'euclidean'), axis=1)) / X.shape[0]
    	mapping2[k] = kmeanModel.inertia_
    
  4. 列表和可视化结果

    (1)使用不同的Distortion值:

    for key, val in mapping1.items():
    	print(f'{key} : {val}')
    

    输出:

    1 : 3.625551331197001
    2 : 2.0318238533112596
    3 : 1.2423303391744152
    4 : 0.8367738708386461
    5 : 0.736979754424859
    6 : 0.6898254810112422
    7 : 0.6020311621770951
    8 : 0.5234596363982826
    9 : 0.4587221418509788
    

    接下来我们将绘制k与WCSS的关系图:

    plt.plot(K, distortions, 'bx-')
    plt.xlabel('Values of K')
    plt.ylabel('Distortion')
    plt.title('The Elbow Method using Distortion')
    plt.show()
    

    (2)使用不同的Inertia:

    for key, val in mapping2.items():
        print(f'{key} : {val}')
    

    输出:

    1 : 312.95238095238096
    2 : 108.07142857142856
    3 : 39.51746031746031
    4 : 17.978571428571428
    5 : 14.445238095238096
    6 : 11.416666666666668
    7 : 9.266666666666667
    8 : 7.25
    9 : 6.5
    
    plt.plot(K, inertias, 'bx-')
    plt.xlabel('Values of K')
    plt.ylabel('Inertia')
    plt.title('The Elbow Method using Inertia')
    plt.show()
    

    为了确定聚类的最佳数量,我们必须选择“弯头”处的k值,即distortion/inertia开始以线性方式减小的点。因此,对于给定的数据,我们得出结论,数据的最佳聚类数是4。

我们将绘制针对不同k值聚类的数据点的图像。为此,我们将通过迭代k值的范围来对数据集应用k-means算法。

import matplotlib.pyplot as plt

# Create a range of values for k
k_range = range(1, 5)

# Initialize an empty list to
# store the inertia values for each k
inertia_values = []

# Fit and plot the data for each k value
for k in k_range:
	kmeans = KMeans(n_clusters=k, \
					init='k-means++', random_state=42)
	y_kmeans = kmeans.fit_predict(X)
	inertia_values.append(kmeans.inertia_)
	plt.scatter(X[:, 0], X[:, 1], c=y_kmeans)
	plt.scatter(kmeans.cluster_centers_[:, 0],\
				kmeans.cluster_centers_[:, 1], \
				s=100, c='red')
	plt.title('K-means clustering (k={})'.format(k))
	plt.xlabel('Feature 1')
	plt.ylabel('Feature 2')
	plt.show()

# Plot the inertia values for each k
plt.plot(k_range, inertia_values, 'bo-')
plt.title('Elbow Method')
plt.xlabel('Number of clusters (k)')
plt.ylabel('Inertia')
plt.show()

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

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

相关文章

springboot修改组件扫描包位置

步骤很详细,直接上教程 问题分析 默认情况下组件扫描包范围为启动类所在包及其子包 解决方法 我们只需要在启动类上面加个注解配置扫描范围 效果演示 温馨提示 非必要不建议修改,按规范创建项目结构一般不会出现这个问题

此mac无法连接Apple媒体服务,因为“”出现问题。

出现问题: 这是因为mac登陆过别人的appId下载过软件,但是没有完全退出登陆 解决 打开偏好设置,点击头像,点击媒体与已购项目,能看到弹框内AppleID登陆的应用,打开对应的那个应用,我这里是音…

对抗性EM用于变分深度学习:在低剂量PET和低剂量CT中的半监督图像质量增强应用|文献速递--Transformer架构在医学影像分析中的应用

Title 题目 Adversarial EM for variational deep learning: Application to semi-supervised image quality enhancement in low-dose PET and low-dose CT 对抗性EM用于变分深度学习:在低剂量PET和低剂量CT中的半监督图像质量增强应用 01 文献速递介绍 医学影…

OpenAI 全新 o1 模型上线 Cursor,开发者们欢呼!

最近 OpenAI 推出了新一代 o1模型,现在可以在 Cursor 上使用了。这些 o1模型在处理复杂和精细的推理任务上表现出色,令许多开发者为之兴奋。 特别值得一提的是,o1-mini 模型专门为高级编程设计,成为了开发者们的新宠。 最开始&am…

c++类和对象(3):默认成员函数(下)

1.拷贝构造函数 如果⼀个构造函数的第⼀个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数也叫做拷贝构造函数,也就是说拷贝构造是⼀个特殊的构造函数。 c规定:类类型的传值传参必须用拷贝构造 1.1拷贝构造函数…

SpringBoot:Web开发(基于SpringBoot使用MyBatis-Plus+JSP开发)

目录 前期准备 构建项目(IDEA2023.1.2,JDK21,SpringBoot3.3.3) 添加启动器 Model准备 这里我们利用MybatisX插件生成我们所需要的实体类、数据访问层以及服务层 注意选择MyBatis-Plus3以及Lombok 然后再在service接口中定义…

Leetcode 每日一题:Course Schedule II

写在前面: 今天我们继续来看一道经典的图论问题,而这个问题可以说是跟我们一众学生的生活息息相关啊!我们每年都有很多需要完成的必修指标,每一个必修指标可能会有一个或多个先修要求,而我们需要决定是否能将这些课全…

kAFL部署、使用与原理分析

文章目录 前言1、概述1.1、工作原理1.2、工作流程1.2.1、部署kAFL1.2.2、准备工作1.2.2.1、准备主机代理内核1.2.2.2、准备待Fuzz目标1.2.2.3、配置待Fuzz目标1.2.2.4、配置kAFL组件 1.2.3、Fuzz测试1.2.3.1、获取配置信息1.2.3.2、准备工作目录1.2.3.3、复制种子文件1.2.3.4、…

大顶堆+动态规划+二分

前言&#xff1a;我们这一题需要分类讨论 对于我们左边和右边的我们需要预处理 有点类似反悔堆的做法&#xff0c;得出i之前取出 m 个元素代价最小&#xff0c;并且这个代价一定是递减的&#xff08;可以推导一下&#xff09; 题目地址 #include<bits/stdc.h> using name…

Docker 华为云镜像加速器配置

​​ 操作说明 1. 安装/升级容器引擎客户端 推荐安装1.11.2以上版本的容器引擎客户端 2. 加速器地址 访问华为云容器镜像服务&#xff1a;https://console.huaweicloud.com/swr/ 获取加速器地址 https://xxxxxxxxx.mirror.swr.myhuaweicloud.com3. 配置镜像加速器 针对…

c语言快递小项目

struct pack_head{ int fd;//通信的文件描述符 unsigned char type; //消息类型 unsigned char usertype; //用户类型&#xff1a;1&#xff1a;用户 2&#xff1a;快递员 char name[32]; //用户名 char paaswd[32]; //密码 char buf[32]; //调试…

抗金属RFID标签如何提升资产管理效率

在资产管理中&#xff0c;金属表面的设备和资产对传统RFID标签来说是一大挑战。为了解决这一问题&#xff0c;企业开始广泛采用抗金属RFID标签&#xff0c;以确保在金属环境下也能高效地进行资产跟踪与管理。 抗金属RFID标签的应用场景 抗金属RFID标签是一种专门设计用于金属…

如何让Windows控制台窗口不接受鼠标点击(禁用鼠标输入)

一、简述 在我们编写控制台应用程序时&#xff0c;默认情况下程序的打印输出会在控制台窗口中进行显示&#xff0c;我们在写服务功能时在窗口中会不断打印消息输出&#xff0c;这个时候如果使用鼠标点击了控制台窗口&#xff0c;会阻塞程序的继续运行&#xff0c;导致我们的程…

【Unity】在Unity 3D中使用Spine开发2D动画

文章目录 内容概括前言下载安装 Spine Pro导入Unity插件Spine动画导入Unity使用展现动画效果展现 内容概括 本文主要讲解 Spine Pro 免&#xff08;破&#xff09;费&#xff08;解&#xff09;版的安装&#xff0c;以及如何将动画导入到Unity中使用。 前言 通常要用 Spine …

Hadoop林子雨安装

文章目录 hadoop安装教程注意事项&#xff1a; hadoop安装教程 链接: 安装教程 注意事项&#xff1a; 可以先安装ububtu增强功能&#xff0c;完成共享粘贴板和共享文件夹 ubuntu增强功能 2.这里就可以使用共享文件夹 或者在虚拟机浏览器&#xff0c;用 微信文件传输助手 传文…

医学数据分析实训 项目二 数据预处理预备知识(数据标准化处理,数据离差标准化处理,数据二值化处理,独热编码处理,数据PCA降维处理)

文章目录 数据预处理预备知识任务一 数据标准化处理1. 数据准备2. 数据标准化 任务二 数据离差标准化处理任务三 数据二值化处理任务五 独热编码处理对数据进行“离散化处理”&#xff08;装箱&#xff09;将已经装箱的数据进行OneHotEncoder独热编码 任务六 数据PCA降维处理1.…

ingress对外服务

目录 ingress概念 安装ingress ingress-nginx暴露服务的方式 1. DeploymentLoadBalncer 2. DaemonSetHostNetworknodeSelector ​编辑 3.deploymentnodePort ​编辑 ingress-nginx的deploymentnodePorthttps部署 1.创建ssl的证书 2.ingressnginx ingress-nginx的权…

最强AI照片说话Windows一体包下载地址,口型合成音频驱动图片,免安装,下载即用

照片数字一键整合包&#xff1a;点击下载 一键安装包&#xff0c;简单一键启动&#xff0c;即刻使用&#xff0c;秒级体验。 目前效果最好的音频驱动图片说话的软件&#xff0c;比sadtalker、MuseTalk更清晰&#xff0c;效果更好&#xff0c;可以作为DID heygen的开源平替。原…

Vue安装及环境配置【图解版】

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 Facts speak louder than words&#xff01; 目录 一.node.js的安装…

C语言算法

大纲 算法复杂度 排序算法 经典算法