机器学习实战5-KMeans聚类算法

news2024/11/23 20:59:12

文章目录

  • 概述
  • KMeans
  • KMeans参数&接口
    • n_clusters
    • 质心
    • inertia
    • 模型评估指标
      • 轮廓系数
      • Calinski-Harabaz Index
    • 重要参数init & random_state & n_init:初始质心怎么放好?
    • 重要参数max_iter & tol:让迭代停下来
    • 重要属性与重要接口

概述

聚类 VS 分类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-08cI8jam-1691915535493)(https://img1.imgtp.com/2023/08/12/TLpVN5O2.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Puxawm50-1691915535494)(https://img1.imgtp.com/2023/08/12/HAO6YrvZ.png)]
有监督学习 VS 无监督学习
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BaTynru2-1691915535495)(https://img1.imgtp.com/2023/08/12/HKAWFoT5.png)]
sklearn中的聚类算法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x7TFKj9Y-1691915535495)(https://img1.imgtp.com/2023/08/12/R9mPETa6.png)]

KMeans

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iECYm0e1-1691915535496)(https://img1.imgtp.com/2023/08/12/66yZOqS6.png)]

KMeans参数&接口

n_clusters

n_clusters就是KMeans中的K就是告诉模型,要让模型帮助我们分成几类,这个一般是我们必填的一个参数,sklearn中默认为8,通常我们希望这个数是小于8
生成数据

from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
#自己创建数据集
X, y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)
fig, ax1 = plt.subplots(1)
ax1.scatter(X[:, 0], X[:, 1]
           ,marker='o' #点的形状
           ,s=8 #点的大小
           )
plt.show()
#如果我们想要看见这个点的分布,怎么办?
color = ["red","pink","orange","gray"]
fig, ax1 = plt.subplots(1)
for i in range(4):
    ax1.scatter(X[y==i, 0], X[y==i, 1]
           ,marker='o' #点的形状
           ,s=8 #点的大小
           ,c=color[i]
           )
plt.show()
from sklearn.cluster import KMeans
cluster = KMeans(n_clusters=n_clusters, random_state=0).fit(X)
y_pred = cluster.labels_
y_pred

pre = cluster.fit_predict(X)
pre == y_pred

我们只先用一部分数据进行fit然后再predict得到的结果和我们用全部数据进行fit的结果是否相同

# 当数据量非常大的时候我们就需要用predict或者fit_predict()
cluster_smallsub = KMeans(n_clusters=n_clusters, random_state=0).fit(X[:200])
y_pred_ = cluster_smallsub.predict(X)
y_pred == y_pred_

当数据量比较小时结果可能不太好,当数据量比较大时效果比较好但是依然不会完全一样
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g4q9gfb5-1691915535496)(https://img1.imgtp.com/2023/08/13/e8IE7cUI.png)]

质心

centroid = cluster.cluster_centers_
centroid

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u2DbJWZB-1691915535496)(https://img1.imgtp.com/2023/08/13/uWuTeNL3.png)]

inertia

inertia = cluster.inertia_
inertia

返回总距离的平方和

color = ["red", "pink", "orange", "gray"]
fig, ax1 = plt.subplots(1)
for i in range(n_clusters):
    ax1.scatter(X[y_pred == i, 0], X[y_pred == i, 1]
                ,marker='o' #点的形状
                ,s=8 #点的大小
                ,c=color[i] #点的颜色
               )
ax1.scatter(centroid[:,0], centroid[:,1]
            ,marker='x' #点的形状
            ,s=8 #点的大小
            ,c="black" #点的颜色
)
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WZfJ1PAi-1691915535497)(https://img1.imgtp.com/2023/08/13/kfHq0GvO.png)]

n_clusters = 4
cluster_ = KMeans(n_clusters=n_clusters, random_state=0).fit(X)
inertia_ = cluster_.inertia_
inertia_

结果:908.3855684760614
可以看到我们inertia的结果变小了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1C8GW9bM-1691915535497)(https://img1.imgtp.com/2023/08/13/qqJeJcj0.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-npyn7iwW-1691915535497)(https://img1.imgtp.com/2023/08/13/8tp8YV7U.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ncw7uPbJ-1691915535498)(https://img1.imgtp.com/2023/08/13/5Ck4FssG.png)]
我们要inertia最小化的前提是在我们限制一个K的前提下最小化

模型评估指标

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9pO3Hhjk-1691915535498)(https://img1.imgtp.com/2023/08/13/My2zUF0F.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rCa8AE84-1691915535498)(https://img1.imgtp.com/2023/08/13/6C2vWwkH.png)]

轮廓系数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vkSjxKxe-1691915535499)(https://img1.imgtp.com/2023/08/13/gi5TFFRk.png)]
轮廓系数取值再在[-1, 1]越接近1越好

from sklearn.metrics import silhouette_score
from sklearn.metrics import silhouette_samples
silhouette_score(X, cluster_.labels_)
silhouette_samples(X, cluster_.labels_)

silhouette_score返回轮廓系数的均值
silhouette_samples返回每一个样本的轮廓系数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zJCdwpL8-1691915535499)(https://img1.imgtp.com/2023/08/13/dwiHrQYQ.png)]

Calinski-Harabaz Index

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KSOXAeoi-1691915535499)(https://img1.imgtp.com/2023/08/13/gYDaXhS5.png)]
虽然Calinski-Harabaz Index没有界但是相较于轮廓系数而言,其计算快得多

from sklearn.metrics import calinski_harabaz_score
X
y_pred
calinski_harabaz_score(X, y_pred)

重要参数init & random_state & n_init:初始质心怎么放好?

8
9

X
y
plus = KMeans(n_clusters = 10).fit(X)
plus.n_iter_
random = KMeans(n_clusters = 10,init="random",random_state=420).fit(X)
random.n_iter_

重要参数max_iter & tol:让迭代停下来

10

random = KMeans(n_clusters = 10,init="random",max_iter=10,random_state=420).fit(X)
y_pred_max10 = random.labels_
silhouette_score(X,y_pred_max10)
random = KMeans(n_clusters = 10,init="random",max_iter=20,random_state=420).fit(X)
y_pred_max20 = random.labels_
silhouette_score(X,y_pred_max20)

一般当我们的数据量比较大的时候使用这两个参数可以让模型快一点停下来

重要属性与重要接口

11

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

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

相关文章

微信公众号开发基础

开发文档 https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html 一、接入微信公众平台开发 开发者需要按照如下步骤完成: 1.1 填写服务器配置 1.2 验证服务器地址的有效性 开发者提交信息后,微信服务器将发…

【编织时空一:探究顺序表与链表的数据之旅】

本章重点 线性表 顺序表 顺序表OJ题 1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结…

Linux命令 -- vim

Linux命令 -- vim 前言一般模式光标移动复制粘贴内容查找 底线命令行模式 前言 用vim指令进入文件。 刚进入时是命令行模式,也叫一般模式。 按i或者insert进入编辑模式,此时可以编辑文件内容。 按esc可从编辑模式退回到一般模式,输入冒号进…

[C++ 网络协议编程] TCP/IP协议

目录 1. TCP/IP协议栈 2. TCP原理 2.1 TCP套接字中的I/O缓冲 2.2 TCP工作原理 2.2.1 三次握手(连接) 2.2.2 与对方主机的数据交换 2.2.3 四次握手(断开与套接字的连接) TCP(Transmission Control Protocol传输控…

【Apollo】阿波罗自动驾驶:塑造自动驾驶技术的未来

前言 Apollo (阿波罗)是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。 开放能力、共享资源、加速创新、持续共赢是 Apollo 开放平台的口号。百度把自己所拥有的强大、…

前后端分离------后端创建笔记(03)前后端对接(上)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论,如有侵权请联系 源码:https://gitee.com/green_vegetables/x-admin-project.git 素材:https://pan.baidu.com/s/…

Reinforcement Learning with Code【Code 6. Advantage Actor-Critic(A2C)】

Reinforcement Learning with Code【Code 6. Advantage Actor-Critic(A2C)】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiy…

你不得不懂的IT知识-《敏捷项目管理》

国林哥在IBM时,几乎每天都会收到关于“敏捷”相关的邮件,公司鼓励我们去学习邮件里的知识,参加敏捷相关的认证和培训。刚开始我和大多数同事一样不管不顾,后来随着PBC里要求加上成长目标,比如要获得一个认证&#xff0…

为什么要试用CRM系统?有什么优点?

对于那些正在进行CRM选型的企业来说,想要了解一款CRM系统是否好用,亲自试用无疑是最好的方法。那么,有没有可以免费试用的在线CRM系统 CRM系统免费试用的好处 体验产品功能:您可以亲自操作和测试CRM系统的各项功能,如…

从一个GPU到多个GPU

在多GPU运行应用程序时,需要正确设计GPU之间的通信,GPU间数据传输的效率取决于GPU是如何连接在一个节点上并跨集群的 在多GPU系统里有两种连接方式 多GPU通过单个节点连接到PCIe总线上 多GPU连接到集群中的网络交换机上 /* * 本示例演示了如何使用 Open…

【Vue-Router】路由模式

1. WebHashHistory index.ts import { createRouter, createWebHistory, RouteRecordRaw, createWebHashHistory } from "vue-router";// 路由模式 //vue2 mode history -> vue3 createWebHistory //vue2 mode hash -> vue3 createWebHashHistory //vue2 m…

电池的正极是带正电?

首先说明结论:电池正极带正电,负极带负电。 一个错误的实例: 如果说电流是从电池正极流动到电池负极,那么电子就是从负极流动到正极,那么正极就是带负电。----这个说法是错误的。这是因为,根据那么很出名…

verilog学习笔记5——进制和码制、原码/反码/补码

文章目录 前言一、进制转换1、十进制转二进制2、二进制转十进制3、二进制乘除法 二、原码、反码、补码1、由补码计算十进制数2、计算某个负数的补码 前言 2023.8.13 天气晴 一、进制转换 1、十进制转二进制 整数:除以2,余数倒着写 小数:乘…

难解的bug

android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord 【Android TimeCat】 解决 context.startforegroundservice() did not then call service.startforeground() | XiChens Blog http://www…

【Linux从入门到精通】文件I/O操作(C语言vs系统调用)

文章目录 一、C语言的文件IO相关函数操作 1、1 fopen与fclose 1、2 fwrite 1、3 fprintf与fscanf 1、4 fgets与fputs 二、系统调用相关接口 2、1 open与close 2、2 write和read 三、简易模拟实现cat指令 四、总结 🙋‍♂️ 作者:Ggggggtm 🙋‍…

JAVA多线程和并发基础面试问答(翻译)

JAVA多线程和并发基础面试问答(翻译) java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序…

Shell编程之条件测试、if语句、case语句

条件语句 一、条件测试1.1 测试命令1.1 文件测试1.2 整数比较1.3 字符串比较1.4 逻辑测试1.4.1 逻辑与 &&1.4.2 逻辑或 || 1.4.3 组合应用1.5 多个命令组合执行 ( ) { } 二、if语句2.1单分支结构2.2 多分支结构2.4 if语句练习2.4.1 单分支2.4.2 简单的交互式分数反馈 三…

Shell编程之正则表达式(非常详细)

正则表达式 1.通配符和正则表达式的区别2.基本正则表达式2.1 元字符 (字符匹配)2.2 表示匹配次数2.4 位置锚定2.5 分组 和 或者 3.扩展正则表达式4.部分文本处理工具4.1 tr 命令4.2 cut命令4.3 sort命令4.4 uniq命令 1.通配符和正则表达式的区别 通配符一般用于文件…

部署Springboot项目注意事项

步骤 步骤 1:将数据库内容在云服务器上的数据库部署一份 我使用mariadb;会出现一些不兼容现象;我们需要把默认值删掉 2:配置文件你得修改地方 a:linux是磁盘区分(像我自己项目用来储存验证码的文件我们得换这个配置;…

DoIP诊断入门

简介 DoIP(Diagnosis over Internet Protocol)是一种用于车辆诊断的网络通信协议。它基于现代互联网技术,允许通过以太网或IP网络进行车辆诊断和通信。 DoIP的背景是现代车辆中使用的电子控制单元(ECU)数量不断增加&…