Scikit-Learn K均值聚类

Scikit-Learn K均值聚类

    • 1、K均值聚类
      • 1.1、K均值聚类及原理
      • 1.2、K均值聚类的优缺点
    • 2、Scikit-Learn K均值聚类
      • 2.1、Scikit-Learn K均值聚类API
      • 2.2、K均值聚类案例



1、K均值聚类


K-均值(K-Means)是一种聚类算法,属于无监督学习。K-Means在机器学习知识结构中的位置如下:

1.1、K均值聚类及原理


聚类(Clustering)是指将一个数据对象集合划分成簇(子集),使得簇内对象彼此相似,簇间对象不相似。通俗来说,就是将数据划分到不同组中

根据算法原理,常用的聚类算法可分为:基于划分的聚类算法K-Means、基于层次的聚类算法HC、基于密度的聚类算法。本文主要介绍K-Means聚类

K-Means算法起源于1967年,由James MacQueen和J.B.Hartigan提出。K-Means中的K指的是类的数量,Means指均值

K-Means算法的基本原理是:根据样本特征的相似度或距离远近,将样本(N个点)划分成若干个类(K个集群),使得每个点都属于离其最近的中心点(均值)对应的类(集群)

其中,相似度通常使用欧几里得距离来度量,用于计算数据点与质心之间的距离(使用平方):
d ( X i , C j ) = ∣ ∣ X i − C j ∣ ∣ 2 d(X_i,C_j)=||X_i-C_j||^2 d(Xi,Cj)=∣∣XiCj2

其中, X i X_i Xi是数据点, C j C_j Cj是质心

K-Means假设一个样本属于一个类,K-Means的类别是样本的中心(均值);K-Means的损失函数是样本与其所属类的中心之间的距离平方和:
J = ∑ j = 1 k ∑ i = 1 N j ∣ ∣ X i − C j ∣ ∣ 2 J=\sum_{j=1}^{k}\sum_{i=1}^{N_j}||X_i-C_j||^2 J=j=1ki=1Nj∣∣XiCj2

其中, N j N_j Nj表示第 j j j个簇中的样本数量

K-Means算法的本质是物以类聚,其主要执行步骤如下:

  • 初始化聚类中心(随机选取K个样本作为初始的聚类中心)
  • 给聚类中心分配样本(计算各样本与各聚类中心的距离,把每个样本分配给距离它最近的聚类中心)
  • 移动聚类中心(新的聚类中心移动到这个聚类所有样本的均值处)
  • 停止移动(重复第二、第三步,直到聚类中心不再移动为止)

K-Means算法采用的是迭代的方法,得到的是局部最优解

那么,如何确定K值呢?K-Means通常根据损失函数和轮廓系数确定K值, J J J越小,聚类效果越好;轮廓系数越大,聚类效果越好

1.2、K均值聚类的优缺点


2、Scikit-Learn K均值聚类

2.1、Scikit-Learn K均值聚类API


Scikit-Learn提供了K均值聚类算法的API:

class sklearn.cluster.KMeans(n_clusters=8, *, init='k-means++', n_init='auto', max_iter=300, tol=0.0001, verbose=0, random_state=None, copy_x=True, algorithm='lloyd')

官方对该API的描述为:

K-Means算法通过把样本分离成n个具有相同方差的类的方式来对数据进行聚类,最小化一个称为惯量或簇内平方和的准则。该算法需要指定簇的数量。它可以很好地扩展到大量样本,并已经在许多不同领域的应用领域被广泛使用

k-Means算法将一组N样本X划分成K个不相交的簇C,每个都用该簇中样本的均值 μ j \mu_j μj描述。这个均值通常被称为簇的“质心”;尽管它们处在同一个空间,但它们通常不是从X中挑选出的点,虽然它们是处在同一个空间

K-Means算法旨在选择一个质心,能够最小化惯性或簇内平方和的标准:
∑ i = 0 n min ⁡ μ j ∈ C ( ∣ x i − μ j ∣ 2 ) \sum_{i=0}^{n} \min {\mu{j} \in C}\left(\left|x_{i}-\mu_{j}\right|^{2}\right) i=0nminμjC(xiμj2)

官方文档:https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html

中文官方文档:https://scikit-learn.org.cn/view/383.html

API参数及说明如下:

参数说明
n_clusters要形成的簇数或要生成的质心数,默认为8
init初始化方法,默认为k-means++,表示选择初始的聚类中心之间的距离要尽可能远;其他还有random:从初始质心的数据中随机选择观测值
n_init使用不同质心运行K均值算法的次数种子,默认为auto
max_iterk均值算法的最大迭代次数,默认300
tol收敛阈值,默认为1e-4
random_state确定质心初始化的随机数生成,默认为None
copy_x是否复制原始数据,默认为True
algorithmK-Means要使用的算法,默认为auto,其他参数有fullelkan

常用属性及说明如下:

属性说明
cluster_centers_簇中心坐标
inertia_样本到其最近的聚类中心的距离平方和
n_iter_迭代次数

常用方法及说明如下:

方法说明
fit(X,y)训练K-均值聚类
fit_transform(X)训练K-均值聚类并将X变换为簇距离空间
predict(X)预测X中每个样本所属的最接近的聚类
transform(X)将X转换为簇距离空间

2.2、K均值聚类案例


下面使用样本数据进行演示

创建样本数据:

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs

# 生成了包含5个类别的1000条样本数据
X, y = make_blobs(n_samples=1000, centers=5, random_state=1)
plt.scatter(X[:, 0], X[:, 1], marker="o", c=y, s=15)

plt.show()

在这里插入图片描述

这里我们指定聚类的数目为5,但是实际情况中我们是不知道聚类的数目是多少的,这需要多次尝试

模型训练与评估:

from sklearn.model_selection import train_test_split
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score   # 轮廓系数法SC

# 划分训练集(80%)和测试集(20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# K-Means聚类器
kmeans = KMeans(n_clusters=5, n_init="auto")

# 训练模型
kmeans.fit(X_train, y_train)

# 模型评估
# 损失函数J(拐点法/手肘法)
print(kmeans.inertia_)   # 1525.6665836724683
# 轮廓系数法SC
print(silhouette_score(X_test, y_test))   # 0.5635285557582774

绘制质心:

from pylab import mpl

# 使用全局字体
plt.rcParams["font.family"] = "SimHei"
# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False

# 创建一个画板和两个子图(1x2)
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 4))
markers = ["x", "o", "^", "s", "*"]
centers = kmeans.cluster_centers_

axes[0].scatter(X_train[:, 0], X_train[:, 1], marker="o", c=y_train, s=15)
axes[0].set_title("训练集的质心位置")

axes[1].scatter(X_test[:, 0], X_test[:, 1], marker="o", c=y_test, s=15)
axes[1].set_title("测试集的质心位置")

for idx, c in enumerate(centers):
    axes[0].plot(c[0], c[1], markers[idx], markersize=10)
    axes[1].plot(c[0], c[1], markers[idx], markersize=10)

plt.show()

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python使用subprocess模拟输入adb命令

如何在Python中执行ADB命令 1. 简介 ADB(Android Debug Bridge)是Android开发工具包(SDK)提供的一个命令行工具,用于与Android设备进行通信和调试。在Python中,我们可以通过调用系统命令来执行ADB命令。本…

vue项目视频播放ckplayer使用

ckplayer 官方网址,点击访问 1,打开网页后能看到这里,我现在使用的是最新 X3版手册 2,这个ckplayer不是npm 插件,要下载安装包解压到项目里面使用 安装包网址 通过gitee下载 3,解析安装包到项目中 publ…

ChatGPT会取代Salesforce顾问吗?

当ChatGPT问世时,许多Salesforce顾问很乐意使用该工具完成日常任务。然而,许多专业人士仍未使用过该工具或发现它的多种功能。Salesforce顾问负责处理复杂的项目、兼顾客户需求,并在不断发展的生态系统中通过各种云服务保持领先地位。因此&am…

【图论】【拓扑排序】1857. 有向图中最大颜色值

本文涉及的知识点 图论 拓扑排序 LeetCode1857. 有向图中最大颜色值 给你一个 有向图 ,它含有 n 个节点和 m 条边。节点编号从 0 到 n - 1 。 给你一个字符串 colors ,其中 colors[i] 是小写英文字母,表示图中第 i 个节点的 颜色 &#xf…

【深耕 Python】Data Science with Python 数据科学(7)书352页练习题

写在前面 关于数据科学环境的建立,可以参考我的博客: 【深耕 Python】Data Science with Python 数据科学(1)环境搭建 往期数据科学博文: 【深耕 Python】Data Science with Python 数据科学(2&#xf…

鸿蒙实战开发-如何实现多设备自适应服务卡片

​介绍 本示例展示Js工程中服务卡片的布局和使用,其中卡片内容显示使用了一次开发,多端部署的能力实现多设备自适应。用到了卡片扩展模块接口,ohos.app.form.FormExtensionAbility 。 卡片信息和状态等相关类型和枚举接口,ohos.…

避雷!新增5本SCI被标记On Hold!1区、CCF推荐上榜

毕业推荐 SSCI • 社科类,分区稳步上升(最快13天录用) IEEE: • 计算机类,1区(TOP),CCF推荐 SCIE • 计算机工程类,CCF推荐(最快16天录用) 期刊动态 科睿唯安新增5…

再谈数据中心网络传输

我在 大历史下的 pacing 中误会程序员了,程序员的路子是正确的(虽然并不指网络方面)。本文接着扯网络,从系统程序员熟悉的开始: 当 cpu 过多时,把大的 spinlock 拆成 percpu lock;使用 hash 时,倾向于 per…

C++之智能指针std::unique_ptr与std::make_unique分配内存方式总结(二百六十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

【Zblog搭建博客网站】windows环境搭建属于自己的博客并发布上线 – cpolar内网穿透

目录 1. 前言 2. Z-blog网站搭建 2.1 XAMPP环境设置 2.2 Z-blog安装 2.3 Z-blog网页测试 2.4 Cpolar安装和注册 3. 本地网页发布 3.1. Cpolar云端设置 3.2 Cpolar本地设置 4. 公网访问测试 5. 结语 1. 前言 想要成为一个合格的技术宅或程序员,自己搭建网…

Nacos单机版安装

1. 下载 nacos-server-2.0.3.tar.gz 官网 https://github.com/alibaba/nacos/releases 2. 上传到服务器 3. 解压 tar -zxvf nacos-server-2.0.3.tar.gz -C /opt 4. 配置数据库 4.1准备好mysql数据库 4.2创建一个新的数据库 创建新数据库nacos 4.3执行nacos建库脚本 在…

XMind 2023 下载地址及安装教程

XMind是一款流行的思维导图软件,它帮助用户以图形化的方式组织和呈现思维、概念和信息。XMind可以应用于各个领域,如项目管理、思维导图、会议记录、学习笔记等。 XMind提供了直观和易于使用的界面,用户可以通过拖放和连线来创建思维导图。它…

2024第16届成都学校团餐供应链展6月1日举办

2024第16届成都学校团餐供应链展6月1日举办 邀请函 主办单位: 中国西部教体融合博览会组委会 承办单位:重庆港华展览有限公司 博览会主题:责任教育 科教兴邦 学校团餐,就是老师和学生团体用餐的简称,也叫学校食堂…

使用Flutter混淆技术保护应用隐私与数据安全

在移动应用开发中,保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具,帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆,并提供了相关的操作步骤和注意事项。 📝 摘要 本…

深入理解指针1:指针变量、指针运算、野指针、const修饰指针

生活中我们把门牌号也叫地址,在计算机中我们把内存单元的编号也称为地址。C语⾔中给地址起 了新的名字叫:指针。 所以我们可以理解为:内存单元的编号地址指针 1、指针变量 我们知道的是:数组名是数组首元素的地址。也就是说&…

linux离线安装NodeJs

一、官方下载 地址:Node.js — Download Node.js 选择linux系统版本 为了防止安装过程出现一些适配问题,我没有选择下载最新版,实际应该下载你的前端所用的nodejs版本 未完待续。。

Object 类的使用

如何理解根父类 类 java.lang.Object是类层次结构的根类,即所有其它类的父类。每个类都使用 Object 作为超类。 Object类型的变量与除Object以外的任意引用数据类型的对象都存在多态引用 method(Object obj){…} //可以接收任何类作为其参数 Person o new Person(…

奇趣相机AI摄影,让每个儿童成长故事都独一无二

随着科技的日新月异,亲子互动方式也在不断进化。近日,一款名为“奇趣相机”的微信小程序凭借其精准捕捉亚洲儿童特质与激发创意的独特功能,在年轻父母群体中引发热烈关注。这款应用程序不仅革新了儿童摄影的传统模式,更成为连接科…

iOS App Store审核要求与Flutter应用的兼容性分析

本文探讨了使用Flutter开发的iOS应用能否上架,以及上架的具体流程。苹果提供了App Store作为正式上架渠道,同时也有TestFlight供开发者进行内测。合规并通过审核后,Flutter应用可以顺利上架。但上架过程可能存在一些挑战,因此可能…

Node.js-知识点学习总结归纳

Node.js-知识点学习总结归纳 安装nodenode运行方式通过Node.js直接运行js文件(也就不用通过网页html了)绝对路径调用:相对路径调用:直接运行js命令: Vscode控制台使用node运行js文件 安装node 这个就不用讲了吧,网上搜…