【菜菜的sklearn课堂笔记】聚类算法Kmeans-基于轮廓系数来选择n_clusters

news2024/10/7 8:27:35

视频作者:菜菜TsaiTsai
链接:【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili

我们通常会绘制轮廓系数分布图和聚类后的数据分布图来选择我们的最佳n_clusters

from sklearn.metrics import silhouette_samples,silhouette_score
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import matplotlib.cm as cm # colormap
import numpy as np
import pandas as pd

X,y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)
fig,(ax1,ax2) = plt.subplots(1,2)
fig.set_size_inches(18,7) 

这里18*7是给两个子图一起用的,因此一个是 9 ∗ 7 9*7 97![[附件/Pasted image 20221116163902.png|400]]

一般有关通过循环得到分数来评价模型优劣的,我们都先写其中一次的代码,然后再写循环的。在写其中一次的时候,把有关循环次数的变量都用命名的变量代替,而不是写数字,例如下面我们会用n_clusters = 4,来代替代码中的4
这里我们先写一次的代码,假设我们让它分4类

cluster = KMeans(n_clusters=n_clusters,random_state=10).fit(X)
cluster_labels = cluster.labels_
silhouette_avg = silhouette_score(X,cluster_labels)
sample_silhouette_values = silhouette_samples(X,cluster_labels)

fig,(ax1,ax2) = plt.subplots(1,2)
fig.set_size_inches(18,7)

ax1我们是为了画不同类每个样本的轮廓系数,这里我们使用填图
X.shape[0]要加上(n_clusters + 1) * 10,是为了让不同类之间以及类和轴之间有10的距离

ax1.set_xlim([-0.1,1])
ax1.set_ylim([0,X.shape[0] + (n_clusters + 1) * 10])

y_lower = 10 # 别贴着x轴画图
for i in range(n_clusters):
    ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i]
    # array的切片之间传递的是值,而不是对象,因此修改ith_cluster_silhouette_values,不会影响sample_silhouette_values
    # 实在不安心可以.copy()
    ith_cluster_silhouette_values.sort() # .sort()排序是直接排序,没有返回值
    
    size_cluster_i = ith_cluster_silhouette_values.shape[0] # 这一簇样本的数量
    y_upper = y_lower + size_cluster_i
    
    color = cm.nipy_spectral(np.random.RandomState(i+3).random(1))
    # nipy_spectral传入一个浮点数,返回一个颜色。也可以传入浮点array
    # 这里+3没有其他目的,只是因为恰巧前四个都是绿的
    
    ax1.fill_betweenx(np.arange(y_lower,y_upper,1) # 倾向于理解是折线图的填充
                    ,ith_cluster_silhouette_values
                    ,0
                    ,facecolor=color
                    ,alpha=0.7)
    # 向x轴填充用fill_between,向y轴填充用fill_betweenx
    
    y_lower = y_upper + 10
    
    ax2.scatter(X[cluster_labels == i,0],X[cluster_labels == i,1]
               ,marker='o'
               ,s=8
               ,c=color) # 颜色和ax1的统一

ax1.text(-0.05
		 ,y_lower + 0.5 * size_cluster_i
		 ,str(i))
ax1.set_title("The silhouette plot for the various clusters.")
ax1.set_xlabel("The silhouette coefficient values")
ax1.set_ylabel("Cluster label")
ax1.axvline(x=silhouette_avg,color='red',linestyle='--')
# axvline添加一条垂直于x轴的线
ax1.set_yticks([])
ax1.set_xticks([-0.1,0,0.2,0.4,0.6,0.8,1])

centers = cluster.cluster_centers_
ax2.scatter(centers[:,0],centers[:,1],marker='x',c='k',s=200)
ax2.set_title("The visualization of the clustered data.")
ax2.set_xlabel("Feature space for the 1st feature")
ax2.set_ylabel("Feature space for the 2nd feature")
plt.suptitle(("Silhouette analysis for KMeans clustering on sample data with n_clusters = %d" % n_clusters)
             ,fontsize=14, fontweight='bold')
plt.show()

![[附件/Pasted image 20221116165406.png|500]]

fill_betweenx(
['y', 'x1', 'x2=0', 'where=None', 'step=None', 'interpolate=False', '*', 'data=None', '**kwargs'],

y:y的范围,注意如果x1,x2不是常数,那么要与x1,x2的shape匹配,y.shapex1.shapex2.shape,且只能是一维数据
x1:上限
x2:下限,可以不填,默认为0

推广到循环

因为我们前面用n_clusters代替了4,所以循环for后面的变量就可以是n_clusters

for n_clusters in range(2,8,1):
    cluster = KMeans(n_clusters=n_clusters,random_state=10).fit(X)
    cluster_labels = cluster.labels_
    silhouette_avg = silhouette_score(X,cluster_labels)
    sample_silhouette_values = silhouette_samples(X,cluster_labels)
    fig,(ax1,ax2) = plt.subplots(1,2)
    fig.set_size_inches(18,7)
	
    ax1.set_xlim([-0.1,1])
    ax1.set_ylim([0,X.shape[0] + (n_clusters + 1) * 10])
	
    y_lower = 10
    
    for i in range(n_clusters):
        ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i]
        ith_cluster_silhouette_values.sort()
        size_cluster_i = ith_cluster_silhouette_values.shape[0]
		
        y_upper = y_lower + size_cluster_i
		
        color = cm.nipy_spectral(np.random.RandomState(i+3).random(1))
		
        ax1.fill_betweenx(np.arange(y_lower,y_upper,1)
                        ,ith_cluster_silhouette_values
                        ,0
                        ,facecolor=color
                        ,alpha=0.7)
		
        y_lower = y_upper + 10
		
        ax2.scatter(X[cluster_labels == i,0],X[cluster_labels == i,1]
                   ,marker='o'
                   ,s=8
                   ,c=color)
    
    ax1.text(-0.05
             ,y_lower + 0.5 * size_cluster_i
             ,str(i))
    ax1.set_title("The silhouette plot for the various clusters.")
    ax1.set_xlabel("The silhouette coefficient values")
    ax1.set_ylabel("Cluster label")
    ax1.axvline(x=silhouette_avg,color='red',linestyle='--')
    ax1.set_yticks([])
    ax1.set_xticks([-0.1,0,0.2,0.4,0.6,0.8,1])    
    centers =cluster.cluster_centers_
    ax2.scatter(centers[:,0],centers[:,1],marker='x',c='k',s=200)
    ax2.set_title("The visualization of the clustered data.")
    ax2.set_xlabel("Feature space for the 1st feature")
    ax2.set_ylabel("Feature space for the 2nd feature")
    ax2.text(0.95, 0.06
       ,('%.2f' %silhouette_avg)
       ,size=15
       ,bbox=dict(boxstyle='round',alpha=0.8,facecolor='white')
       ,transform=ax2.transAxes
       ,horizontalalignment='right') # 借用一下支持向量机的
    plt.suptitle(("Silhouette analysis for KMeans clustering on sample data with n_clusters = %d" % n_clusters)
                 ,fontsize=14, fontweight='bold')
    plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

部分代码和视频中不一样但目标是一样的

观察我们可以发现分成两簇的轮廓系数高于分成四簇的,但是在实际业务中,我们未必是选择轮廓系数最高的,需要结合实际情况

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

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

相关文章

c++还原简单的vector

文章目录vectorvecotor的介绍vector的模拟实现类的框架成员变量迭代器构造函数析构函数size()capacity()operator[]重载扩容resize()尾插验证是否为空尾删clear 清除swap交换insert插入erase删除迭代器区间初始化构造函数拷贝构造赋值运算符重载n个val构造函数再谈构造函数vect…

数仓日记 - 数仓理论

寒刃尽断处,吾心作剑霜作锋🏂 目录 一、数仓简介 二、关系建模与维度建模 1. 关系建模   2. 维度建模    • 三种模型    • 事实表    • 维度表   3. 事实表的分类    • 事务型事实表    • 周期型快照事实表    • 累积型快照事实表…

Python操作Excel表格

本文介绍如何通过轻量级、零依赖(仅使用标准库)的 pylightxl 库操作Excel表格。 官网:Welcome to pylightxl documentation — pylightxl 2019 documentation 目录 一、入门 1. 读写CSV文件 2. 读Excel文件 3. 获取工作表和单元格数据 3…

前端css实现特殊日期网页变灰功能

前端变灰效果在网页实际使用过程中使用的比较少,但有时候又缺一不可,一般在大型哀悼日或纪念日的时候使用,使用后的网站页面会变成灰色(黑白色)。 我们先看下各大网站是怎么实现的: 1.csdn实现方式 2.淘宝 3.人民网 4.京东 5.掘…

Unity【Multiplayer 多人在线】服务端、客户端通用架构的使用指南

文章目录🚩 Import🚀 protogen使用方法🪐 客户端接口🌈 服务端接口🧭 数据处理🎨 Example🚩 Import 下载SKFramework框架,导入到Unity中; 在框架Package Manager中搜索并…

osgEarth示例分析——osgearth_colorfilter

前言 osgearth_colorfilter颜色过滤器示例。本示例中,主要展示了6种颜色过滤器的使用,分别是:HSLColorFilter、RGBColorFilter、CMYKColorFilter、BrightnessContrastColorFilter、GammaColorFilter、ChromaKeyColorFilter。 执行命令 // 一条命令是一…

Docker日常运维小技巧

一、故障定位 1、查看容器内部 https 请求响应时间 docker exec -t $(docker ps -f nameblog_web -q) curl -H X-Forwarded-Proto:https \-w %{time_total} -o /dev/null -s localhost 2、查看容器日志 docker logs --tail 50 --follow --timestamps mediawiki_web_1 3、删…

深圳SMT贴片行业MES系统解决方案~MES系统服务商~先达智控

随着我国工业的迅速发展,所有电子行业都离不开SMT贴片生产,SMT贴片生产是电子行业的至关重要的一道工业环节,我国作为一个工业制造大国,有着完备的SMT现代产业体系。SMT贴片领域是我国支柱性产业其一,SMT贴片产品涵盖工…

【JavaWeb开发-Servlet】day01-使用TomCat实现本地web部署

目录 1、准备java web开发环境 (1)下载javaJDK(推荐使用JDK1.8,企业常用且稳定) (2)下载TomCat服务器 2、创建web服务器TomCat (1)创建一个项目文件夹 (2)在文件夹中新建一个记事本并编以下…

算法大神左程云耗尽5年心血分享程序员代码面试指南第2版文档

前言 学习是一种基础性的能力。然而,“吾生也有涯,而知也无涯。”,如果学习不注意方法,则会“以有涯随无涯,殆矣”。 学习就像吃饭睡觉一样,是人的一种本能,人人都有学习的能力。我们在刚出生…

移动WEB开发之rem布局--苏宁首页案例制作(技术方案1)

案例:苏宁网移动端首页 访问地址:苏宁易购(Suning.com)-家电家装成套购,专注服务省心购! 1. 技术选型 方案:我们采取单独制作移动页面方案 技术:布局采取rem适配布局(less rem 媒体查询&am…

用 TensorFlow.js 在浏览器中训练一个计算机视觉模型(手写数字分类器)

文章目录Building a CNN in JavaScriptUsing Callbacks for VisualizationTraining with the MNIST DatasetRunning Inference on Images in TensorFlow.jsReferences我们在《在浏览器中运行 TensorFlow.js 来训练模型并给出预测结果(Iris 数据集)》中已…

数字源表如何测试MOS管?

MOSFET(金属—氧化物半导体场效应晶体管)是 一种利用电场效应来控制其电流大小的常见半导体器件,可 以 广 泛 应 用 在 模 拟 电 路 和 数 字 电 路 当 中 。 MOSFET可以由硅制作,也可以由石墨烯,碳纳米管 等材料制作,是材料及器件…

集成电路模拟版图入门-转行模拟版图基础学习笔记(二)

在众多IC岗位中,模拟版图确实属于容易入门,吸引来很多想要转行IC行业的朋友,但需要掌握的知识点和技巧并不比设计少,属于门槛简单,上手不易,想要自学模拟版图似乎比较困难。 之前为大家分享过移知学员的模…

(十四)笔记.net学习之RabbitMQ工作模式

RabbitMQ在.net中简单使用一、简单模式1.生产者2.消费者二、工作队列模式1.工作队列模式介绍2.生产者发送消息3.消费能力三、发布/订阅模式1.介绍2.生产者3.消费者四、Routing路由模式1.介绍2.生产着3.消费者五、topic 主题模式1.介绍2. 生产者3.消费者一、简单模式 1.生产者 …

MyBatis系列第1篇:MyBatis未出世之前我们那些痛苦的经历

这么多技术,为什么我们选择的是mybatis 不知道大家是否还记得使用jdbc如何操作数据库? 加载驱动、获取连接、拼接sql、执行sql、获取结果、解析结果、关闭数据库,这些操作是纯jdbc的方式必经的一些过程,每次操作数据库都需要写这…

三面:请设计一个虚拟DOM算法吧

一、问题剖析 这不是前几天面试官开局面试官就让我设计一个路由,二面过了,结果今天来个三面。 问你道简单的送分题:设计一个虚拟DOM算法? 好家伙,来吧,先进行问题剖析,谁让我们是卑微的打工人…

学习python基础知识

1、Python 基础语法 计算机组成:硬件、软件、计算机运行程序方式、Python 语言的特点、应用领域、Python IDE、程序注释:单行注释、多行注释;变量的作用、定义、 命名规则、变量的数据类型、查看变量类型、输入和输入函数、算术运算符、赋值…

gazebo中添加动态障碍物

文章目录gazebo 教程gazebo 添加动态障碍物gazebo添加动态障碍物插件gazebo中动态障碍物实时posegazebo 教程 gazebo github https://github.com/gazebosim/gazebo-classic/tree/gazebo9gazebo tutorials https://classic.gazebosim.org/tutorials运行一个空白环境 <sdf v…

深入了解Java中的SQL注入

深入了解Java中的SQL注入 本文以代码实例复现了Java中JDBC及Mybatis框架采用预编译和非预编译时可能存在SQL注入的几种情况&#xff0c;并给予修复建议。 JDBC 首先看第一段代码&#xff0c;使用了远古时期的JDBC并且并没有使用预编译。这种简单的字符串拼接就存在SQL注入 …