机器学习实战教程(十二):聚类算法Kmeans

news2024/11/24 8:51:24

聚类概念

聚类是一种无监督的机器学习方法,它主要是通过在数据集中找到相似的样本并将它们分组来发现数据中的模式和结构。聚类算法可以将数据分成具有相似特征的组,每个组被称为一个簇。

常见的聚类算法有以下几种:

  1. K-means聚类算法:它是最常见的聚类算法之一,它的目标是将数据集分为K个簇,使得每个簇内的数据点相似度最高,不同簇之间的差异最大。

  2. 层次聚类算法:该算法将数据集中的样本逐渐合并到一起,直到形成一个完整的聚类结构,从而形成一颗聚类树。

  3. 密度聚类算法:它是一种基于数据点密度的聚类算法,它将数据点分为密集的区域和稀疏的区域,并将密集区域看作是一个簇。

  4. 均值漂移聚类算法:该算法使用核密度估计来找到数据点的局部最大值,以确定簇的质心。

  5. DBSCAN聚类算法:它基于在数据集中的密度来确定簇的个数和形状,它可以识别任意形状的簇。

K-means简介

K-means是一种基于距离度量的聚类算法,其主要思想是将数据集分成K个簇,每个簇包含距离最近的K个数据点。该算法通过迭代优化簇的中心点,来不断调整簇的划分,最终得到一组最优的簇划分结果。

通俗来说,K-means算法就像是一位假设聪明的小学生在玩“猜数字”游戏。他会先猜一个数字,然后根据猜测与正确答案的距离(越接近答案距离越小),将答案所在的数字范围分成两个区域。接着,他会重复这个过程,直到将数字范围分成了K个区域为止,并记录下每个区域的中心点。最后,他会告诉你每个数字应该属于哪个区域(或者说簇),并告诉你每个区域的中心点。

在K-means算法中,我们需要指定簇的个数K,然后随机选择K个数据点作为初始中心点。接着,我们计算每个数据点距离各个中心点的距离,并将其归入距离最近的簇中。然后,重新计算每个簇的中心点,并重复上述过程(在计算每个点到新中心的举例重新归类到簇),直到簇的中心点不再发生变化为止。最终,我们将得到K个簇,每个簇包含一组距离最近的数据点,并且每个数据点只属于一个簇。

需要注意的是,由于K-means算法的初始中心点是随机选择的,因此可能会得到不同的簇划分结果。为了获得更好的结果,可以多次运行算法,并选择最优的簇划分结果。

K-means和KNN区别

K-Means和K-NN是两种不同的机器学习算法,其区别如下:

  1. K-Means是一种聚类算法,它将数据集划分为K个簇,并将每个数据点分配到其最近的簇中心。K-NN是一种分类算法,它根据最近邻居的标签来预测新数据点的标签。

  2. K-Means需要指定簇的数量K,而K-NN不需要。

  3. K-Means是一种无监督学习算法,它不需要标记数据,而K-NN是一种监督学习算法,需要标记数据。

  4. K-Means使用欧几里得距离来计算数据点之间的相似度,而K-NN可以使用不同的距离度量,如曼哈顿距离、余弦相似度等。

  5. K-Means在处理大规模数据时可能会遇到性能问题,而K-NN可以轻松处理大规模数据。

总的来说,K-Means和K-NN是两种不同的机器学习算法,适用于不同的问题和数据集。

Kmeans的计算过程

(1)适当选择c个类的初始中心;
(2)在k次迭代中,对任意一个样本,求其到c各中心的距离(欧式距离),将该样本归到距离更短的中心所在的类;
(3)利用均值等方法更新该类的中心值;
(4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。

假设 现在有4组数据,每组数据有2个维度,对其进行聚类分为2类,将其可视化一下。
A = ( 1 , 1 ) , B = ( 2 , 1 ) , C = ( 4 , 3 ) , D = ( 5 , 4 ) A=(1,1),B=(2,1),C=(4,3),D=(5,4) A=(1,1),B=(2,1),C=(4,3),D=(5,4)
在这里插入图片描述
假设选取两个星的位置为初始中心 c 1 = ( 1 , 1 ) , c 2 = ( 2 , 1 ) c_1=(1,1),c_2=(2,1) c1=(1,1),c2=(2,1),计算每个点到初始中心的距离,使用欧式距离得到4个点分别距离两个初始中心的距离,归于最近的类:
在这里插入图片描述

D 0 第一行表示 A B C D 四个点到 c 1 的举例,第二行表示 A B C D 四个点到 c 2 的举例,举例使用欧氏距离公式计算出来,以 C 为例,到 c 1 这一组的举例是 3.61 , 到 c 2 这一组的举例是 2.83 说明第一次迭代 C 是属于 g r o u p − 2 D^0第一行表示ABCD四个点到c1的举例,第二行表示ABCD四个点到c2的举例,举例使用欧氏距离公式计算出来,以C为例,到c1这一组的举例是3.61,到c2这一组的举例是2.83说明第一次迭代C是属于group-2 D0第一行表示ABCD四个点到c1的举例,第二行表示ABCD四个点到c2的举例,举例使用欧氏距离公式计算出来,以C为例,到c1这一组的举例是3.61,c2这一组的举例是2.83说明第一次迭代C是属于group2

通过比较,将其进行归类。并使用平均法更新中心位置。
在这里插入图片描述
由于归于group1的只有一个点,一次更新后的中心位置 c 1 = ( 1 , 1 ) c_1=(1,1) c1=(1,1),而 c 2 = ( 11 3 , 8 3 ) c_{2} = (\frac{11}{3}, \frac{8}{3}) c2=(311,38)

group2的新中心点也就是 x = ( x 1 + x 2 + x 3 ) 3 = ( 2 + 4 + 5 ) 3 = 11 3 x={(x1+x2+x3)\over 3} ={(2+4+5)\over3}={11\over3} x=3(x1+x2+x3)=3(2+4+5)=311
y = ( y 1 + y 2 + y 3 ) 3 = ( 1 + 3 + 4 ) 3 = 8 3 y={(y1+y2+y3)\over 3} ={(1+3+4)\over3}={8\over3} y=3(y1+y2+y3)=3(1+3+4)=38
在这里插入图片描述
再次计算每个点与更新后的位置中心的距离

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
继续迭代下去,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时,与上一次的类别标记无变化,即可停止。

Kmeans的编程实现

#%%

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

# 生成随机数据
X, y = make_blobs(n_samples=300, centers=4, random_state=42)

# 使用KMeans算法进行聚类
kmeans = KMeans(n_clusters=4, random_state=42)
kmeans.fit(X)

# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='*', s=150, color='red')
plt.show()

在这里插入图片描述

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

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

相关文章

python面向对象三大特性详解 - 封装 继承 多态

前言 面向对象编程有三大特性:封装、继承、多态,本文带大家来认识和了解这三个特性~ 补充 - 新式类 & 经典类 在python2.x中,新式类是继承了object类的子类,以及该子类的子类 子子类...;经典类就是没有继承没有…

java基础入门-05

Java基础入门-05 13、面向对象进阶(static&继承)1.1 如何定义类1.2 如何通过类创建对象1.3 封装1.3.1 封装的步骤1.3.2 封装的步骤实现 1.4 构造方法1.4.1 构造方法的作用1.4.2 构造方法的格式1.4.3 构造方法的应用 1.5 this关键字的作用1.5.1 this关…

MapReduce 源码分析-1

源码追踪 Class Job 作为使用Java语言编写的MapReduce城西,其入口方法位main方法,在MapReduce Main方法中,整个核心都在围绕着job类,中文称之为作业。 public class WordDriver {public static void main(String[] args) throw…

解决vue中父组件通过props向子组件传递数据,子组件接收不到

问题&#xff1a;父组件在挂载时向后端发起请求获取数据&#xff0c;然后将获取到的数据传递给子组件&#xff0c;子组件想要在挂载时获取数据&#xff0c;获取不到。 代码示例&#xff1a; //父组件 <template><div><HelloWorld :message"message"…

Mysql数据库中的用户管理与授权

1.登录用户的管理 1.1 查看用户密码的信息 用户信息存放在 mysql 数据库下的 user 表&#xff08;MySQL 服务下存在一个系统自带的 mysql 数据库&#xff09;。 经常使用的查看密码信息的命令&#xff1a; 能看到密码信息&#xff1a;是经过加密后的密码信息 select user…

真题详解(关系模型)-软件设计(六十六)

真题详解(ICMP)-软件设计&#xff08;六十五)https://blog.csdn.net/ke1ying/article/details/130475620 2017年下半年 内存按字节编址&#xff0c;若存储容量为32K*8bit的存储芯片构成地址从A0000H到 DFFFFH的内存&#xff0c;至少需要____片芯片。 解析&#xff1a; DFF…

《Netty》从零开始学netty源码(五十二)之PoolThreadCache

PoolThreadCache Netty有一个大的公共内存容器PoolArena&#xff0c;用来管理从操作系统中获得的内存&#xff0c;在高并发下如果所有线程都去这个大容器获取内存它的压力是非常大的&#xff0c;所以Netty为每个线程建立了一个本地缓存&#xff0c;即PoolThreadCache&#xff…

ReentrantLock实现原理-非公平锁

在线程间通信方式2一节中&#xff0c;我们了解了Lock&#xff0c;Condition和ReentrantLock&#xff0c;学习了简单使用Condition和RentrantLock完成线程间通信&#xff0c;从文章中我们了解到ReentrantLock是Lock接口的一个最常用的实现类&#xff0c;ReentrantLock是独占锁&a…

WEBPACK和ROLLUP构建前端工具库

1. WEBPACK webpack 提供了构建和打包不同模块化规则的库&#xff0c;只是需要自己去搭建开发底层架构。vue-cli&#xff0c;基于 webpack &#xff0c; vue-cli 脚手架工具可以快速初始化一个 vue 应用&#xff0c;它也可以初始化一个构建库。 2. ROLLUP rollup 是一个专门…

prusa2.6.0 树形支撑(有机支撑)Organic体验测试 3d打印及下载失败解决

目前官网没有这个2.6版本&#xff0c;只有2.5.2下载&#xff0c;是没有树形支撑的。如果试用2.6版本&#xff0c;需要从GitHub下载。地址为&#xff1a; https://github.com/prusa3d/PrusaSlicer/releases/tag/version_2.6.0-alpha6 或者点击链接&#xff1a; Release PrusaS…

aop切面调用失效问题排查

应用里有较多的地方访问外部供应商接口&#xff0c;由于公网网络不稳定或者外部接口不稳定&#xff08;重启&#xff0c;发版&#xff0c;ip切换&#xff09;的原因&#xff0c;经常报502或者504错误。为了解决HTTP调用的500报错&#xff0c;选择使用spring的retryable注解进行…

Leetcode292. Nim 游戏

Every day a leetcode 题目来源&#xff1a;292. Nim 游戏 解法1&#xff1a;数学推理 让我们考虑一些小例子。 显而易见的是&#xff0c;如果石头堆中只有一块、两块、或是三块石头&#xff0c;那么在你的回合&#xff0c;你就可以把全部石子拿走&#xff0c;从而在游戏中…

李沐动手学深度学习 v2 实战Kaggle比赛:预测房价

前言 最近学习一些深度学习知识&#xff0c;观看了李沐老师的《动手学深度学习》的视频 练习一下 实战Kaggle比赛&#xff1a;预测房价 巩固一下 前面学习的知识&#xff0c; 不coding一下总感觉什么也没学 陆陆续续调了一天 记录一下 导包 %matplotlib inline import numpy…

计算机网络第二章(谢希仁第八版)

作者&#xff1a;爱塔居 专栏&#xff1a;计算机网络 作者简介&#xff1a;大三学生&#xff0c;希望和大家一起进步 文章目录 目录 文章目录 前言 一、物理层的基本概念 1.1 物理层协议的主要任务 1.2 传输媒体&#xff08;了解&#xff09; 二、传输方式 2.1 串行传输…

第二十八章 Unity射线检测

本章节我们介绍一下射线。射线就是从一个固定点向一个方向发射出一条直线&#xff0c;在发射过程中需要判断该射线有没有与游戏物体发送碰撞。射线既可以用来检测射击游戏中武器指向目标&#xff1b;又可以判断鼠标是否指向游戏物体。射线的创建方式&#xff0c;一般使用代码来…

11. Kubernetes 开章

本章讲解知识点 Kubernetes 概念为什么要使用 KubernetesKubernetes 的部署架构Kubernetes 基本命令本章主要是针对 Kubernetes 基本概念为读者讲解,读者能有一个大概印象即可,不需要过于斟酌细节,针对 Kubernetes 的概念将在后面章节中详细讲解。 1. Kubernetes 概念 我们…

学习Transformer前言(Self Attention Multi head self attention)

一、前言 一直在做项目&#xff0c;也比较懒没有挤出时间去学习新的东西&#xff0c;感觉停滞很久了&#xff0c;好长一段时间都没有新的知识输入&#xff0c;早就需要就去学习transformer了&#xff0c;因此先来学习注意力机制&#xff0c;本文为个人的一个笔记总结。主要是基…

Linux系统编程(三)—— 文件编程(3)进程环境

一、main函数 现在的格式&#xff1a;int main(int argc, char *argv[])以前的main函数有三个参数&#xff0c;另一个参数就是环境变量 二、进程的终止&#xff08;两种都要背下来&#xff09; 2.1 正常终止 &#xff08;1&#xff09;从main函数返回 main函数被称为程序的…

第10章:堆

堆是什么&#xff1f; 堆是一种特殊的完全二叉树。 完全二叉树&#xff1a;每层节点都完全填满&#xff0c;最后一层若是没填满&#xff0c;则只缺少右边的节点。所有的节点都大于等于&#xff08;最大堆&#xff09;或小于等于&#xff08;最小堆&#xff09;它的子节点。jav…

软考——数据结构,算法基础,程序设计语言,法律法规,多媒体基础

数据结构与算法基础 数组与矩阵线性表广义表树与二叉树图排序与查找算法基础及常见算法 数组 稀疏矩阵 直接把&#xff08;0&#xff0c;0&#xff09;带入&#xff0c;排除B&#xff0c;C 将&#xff08;1&#xff0c;1&#xff09;带入&#xff0c;排除D&#xff0c; 最终…