使用肘部法则选择KMeans聚类中的k值

在这篇文章中,我们将讨论如何选择最好的k(聚类数)的k-Means聚类算法。

肘部法则简介

任何无监督算法的基本步骤是确定数据可以被聚类到的聚类的最佳数量。因为我们在无监督学习中没有任何预定义数量的聚类。我们倾向于使用一些可以帮助我们决定最佳聚类数的方法。 在K-Means聚类的情况下,我们使用肘部法则来定义最佳的聚类数。

什么是K-Means聚类中肘部法则?

如我们所知,在k-means聚类算法中,我们随机初始化k个聚类,并且我们迭代地调整这k个聚类,直到这些k-质心处于平衡状态。然而,在初始化这些集群之前,我们要做的主要事情是确定我们必须使用多少个集群。

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

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

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

使用Sklearn实现

我们将看到如何在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)

定义一个Distortion, 通常,使用欧几里得距离度量。

Inertia:它是样本到其最近聚类中心的平方距离之和。

             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 modelkmeanModel = 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:列表和可视化结果

a)使用不同的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()

在这里插入图片描述
b)使用不同的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值的范围来对数据集应用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.mzph.cn/news/199227.shtml

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

相关文章

通过断点调试解决node 运行js程序直接退出(没有任何报错提示)的问题

现象: node运行程序直接退出,但是从echo $?的返回值可以知道: 一定出现了错误,但是没有显示出来 解决办法: 1. 使用node --inspect-brk 启动程序 然后在浏览器访问chrome://inspect 然后点击inspect 进行单步调试 …

go语言项目的目录结构

Golang 的项目目录结构并没有一个强制的标准,但社区中形成了一些共识和最佳实践,以便更好地组织和管理代码。以下是一个典型的 Golang 项目目录结构示例: /myproject ├── /cmd | ├── /app | | └── main.go | …

APB Introduction

• APB: Advanced Peripheral Bus ( 高级外设总线 ) • 应用场景:提供了一个低功耗接口,降低接口复杂性。 • 特性: • 可工作在高频下 • 协议简单:无复杂的时序 • 控制逻辑简单 • 同步总线:总线上所有的 transaction (读

你有哪些工作提效的工具或方法?

RPA专门解决一些高度重复、具有规则性的流程任务,这样的任务,在我们的职场上可谓多得数不胜数 RPA的使用,也不难,把握RPA使用三部曲 第一步:确定目标流程 首先需要确定要实现自动化的业务流程。这就包括了分析当前的…

汽车标定技术(十一)--XCP应用场景分析

目录 1.模型在环场景 2.软件在环场景 3.硬件在环场景 4.Bypassing分析 5.软件Debug over XCP

springboot(ssm高校奖助学金系统 奖助学金管理系统Java(codeLW)

springboot(ssm高校奖助学金系统 奖助学金管理系统Java(code&LW) 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0&am…

Java中的File详细说明

File的概述--> File常见的构造方法--> 代码示范---> /*public File(String pathname) 根据文件路径创建文件对象根据字符串表示的路径,创建File对象*/String str "E:\\java_code\\a.txt";File f1 new File(str);System.out.println(f1);//结果…

000FreeCAD源码学习--MainGui.cpp

目录 1 MainGui.cpp源代码 2 int main()函数分析 3 编译运行截图 FreeCADMain项目下的MainGui.cpp 1 MainGui.cpp源代码 int main( int argc, char ** argv ) { #if defined (FC_OS_LINUX) || defined(FC_OS_BSD)setlocale(LC_ALL, ""); // use native environm…

使用pyscenedetect进行视频场景切割

1. 简介 在视频剪辑有转场一词:一个视频场景转换到另一个视频场景,场景与场景之间的过渡或转换,就叫做转场。 本篇介绍一个强大的开源工具PySceneDetect,它是一款基于opencv的视频场景切换检测和分析工具,项目地址: h…

龙迅#LT8311X3 USB中继器应用描述!

1. 概述 LT8311X3是一款USB 2.0高速信号中继器,用于补偿ISI引起的高速信号衰减。通过外部下拉电阻器选择的编程补偿增益有助于提高 USB 2.0 高速信号质量并通过 CTS 测试。 2. 特点 • 兼容 USB 2.0、OTG 2.0 和 BC 1.2• 支持 HS、FS、LS 信令 • 自动检测和补偿 U…

界面控件DevExpress WPF导航组件,助力升级应用程序用户体验!(上)

DevExpress WPF的Side Navigation(侧边导航)、TreeView、导航面板组件能帮助开发者在WPF项目中添加Windows样式的资源管理器栏或Outlook NavBar(导航栏),DevExpress WPF NavBar和Accordion控件包含了许多开发人员友好的…

Python OS模块常用方法整理

os模块包含了普遍的操作系统和文件目录方法 引入类库 首先需要引入类库 import os 常用方法 OS模块方法 获取操作系统类型 nt->window:Microsoft Windows NT posix->Linux/Mac OS: Portable Operating System Interface of UNIX(可移植操作系统接口&…

linux中DNS服务器解析

DNS服务器 DNS服务器DNS介绍域名的分层结构DNS的分层结构DNS解析过程 DNS术语递归查询迭代查询TTLTLD ServerDNS ResolverRoot Server DNS记录类型DNS客户端检测工具dighost 配置DNS方式本机解析使用本地DNS服务器解析修改网卡配置文件定义DNS DNS服务器 DNS介绍 域名的分层结…

深入理解Java核心技术:Java工程师的实用干货笔记

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 在Java工程师的职业生涯中,深入理解…

K8S部署nginx并且使用NFS存储数据

安装NFS 在master安装NFS systemctl start nfs-server修改配置 /etc/exports /data *(rw,no_root_squash,no_all_squash,sync)目录为 /data 允许所有地址访问 验证下 [rootmaster nginx]# showmount -e 192.168.57.61 Export list for 192.168.57.61: /data *共享可以正常…

基于 springboot + vue 健身房管理系统 毕业设计-附源码

qq(2829419543)获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:springboot 前端:采用vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件&#xf…

使用 husky 和 lint-staged 配置代码检查工作流

提交代码前做代码检查 如果我们不做代码检查,有时候有代码错误,我们不能及时发现,只有打开代码块才知道,这样在提交仓库时也会忽略,很危险。 1、初始化 git仓库,执行 git init 即可 2、初始化 husky 工具配…

Redis rdb源码解析

前置学习:Redis server启动源码-CSDN博客

12月5日作业

以下是一个简单的比喻,将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴子等。现在,动物园里有一位讲解员&…

QT——数据转换(int/QString/QByteArray/char/string)等

目录 1. QString怎么转成int 2. int转QString 3. int转string 4. string转int 5. QString转string 6. string转QString 7. QByteArray转QString 8. QString转QByteArray 9. QByteArray 转化为 char * 10. char * 转化为 QByteArray 11.QString 转 char * 12. char*转…