【聚类 | K-means】原理及推导流程(附模板代码,库手撕实现)

news2024/11/30 5:46:08

在这里插入图片描述

🤵‍♂️ 个人主页: @AI_magician
📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。
👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱‍🏍
🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)

在这里插入图片描述

【深度学习 | 核心概念】那些深度学习路上必经的核心概念,确定不来看看? (一)
作者: 计算机魔术师
版本: 1.0 ( 2023.8.27 )

摘要: 本系列旨在普及那些深度学习路上必经的核心概念,文章内容都是博主用心学习收集所写,欢迎大家三联支持!本系列会一直更新,核心概念系列会一直更新!欢迎大家订阅

该文章收录专栏
[✨— 《深入解析机器学习:从原理到应用的全面指南》 —✨]

@toc

K-means聚类算法

K-means聚类算法是一种常用的无监督学习算法,用于将数据集划分成K个不同的簇。它的目标是最小化数据点与所属簇中心之间的平方距离和。

以下是K-means聚类算法的详细步骤及数学公式推导:

步骤1: 数据预处理

  • 假设我们有一个包含m个样本的数据集,每个样本有n个特征。首先需要对数据进行预处理,以确保特征之间的尺度一致性。(由于空间位置度量的关系)

步骤2: 初始化中心点

  • 在K-means算法中,我们需要选择K个初始的簇中心点。可以使用不同的初始化方法,例如随机选择K个样本作为中心点。
  • [evaluation & metrics.md](evaluation & metrics.md) 这里通过不同的评价方法确定簇
  • 假设我们选择了K个中心点,表示为μ1, μ2, …, μK。

步骤3: 分配样本到簇

  • 对于每个样本xi,计算它与每个中心点之间的距离。

  • 使用欧氏距离作为距离度量,计算样本xi到中心点μj的距离为:

    d ( x i , μ j ) = ∑ k = 1 n ( x i k − μ j k ) 2 d(xi, μj) = \sqrt{\sum_{k=1}^{n}(xi_k - μj_k)^2} d(xi,μj)=k=1n(xikμjk)2

  • 样本xi分配到与其距离最近的中心点所对应的簇

步骤4: 更新簇中心点

  • 对于每个簇j,计算该簇中所有样本的均值,得到新的中心点。

  • 计算簇j的新中心点μj的坐标为:

    μ j k = 1 ∣ C j ∣ ∑ x i ∈ C j x i k μj_k = \frac{1}{|Cj|}\sum_{xi\in Cj} xi_k μjk=Cj1xiCjxik

步骤5: 重复步骤3和4

  • 重复步骤3和4,直到簇中心点的变化小于某个阈值,或达到最大迭代次数

步骤6: 输出聚类结果

  • 最终,K-means算法会收敛,并输出每个样本所属的簇。

总的来说,K-means算法通过每个数据点的本身距离位置,根据所确定的簇数不断更新中心点,找到一种部分中心之间在一定阈值下有着相同类似特征的群体,这是根据欧几里得距离来衡量的,这其中有两种问题,其可以从名字得出,

  1. 如何确定选择几个簇最为合适?
  2. 单纯使用均值更新严重受离群点影响
实现案例

接下来,我将为您提供使用Python实现K-means聚类算法的经典案例。

使用sklearn库实现K-means聚类算法

from sklearn.datasets import loadiris
from sklearn.preprocessing import MinMaxScaler
from sklearn.cluster import KMeans

iris=loadiris()
irisdata=iris['data'] 
#提取数据集中的特征
iristarget=iris['target']
#提取数据集中的标签
iris names=iris['featurenames']
#提取特征名
scale=MinMaxScaler()
fit(iris data)
# 训练规则
iris dataScale=scale.transform(iris_data) 
# 应用规则
kmeans=KMeans(n_clusters = -3,random_state=123)
fit(iris dataScale)
#构建并训练模型
print("构建的K-Means模型为: \n", kmeans)

手撕模板实现K-means聚类算法

import numpy as np

def kmeans(X, n_clusters, max_iter=100):
    n_samples, n_features = X.shape
    
    # 初始化中心点
    center_indices = np.random.choice(n_samples, size=n_clusters, replace=False)
    centers = X[center_indices]
    
    for _ in range(max_iter):
        # 分配样本到簇
        distances = np.linalg.norm(X[:, np.newaxis] - centers, axis=-1)
        labels = np.argmin(distances, axis=-1)
        
        # 更新簇中心点
        new_centers = np.array([np.mean(X[labels == k], axis=0) for k in range(n_clusters)])
        
        # 判断是否收敛
        if np.all(centers == new_centers):
            break
        
        centers = new_centers
    
    return labels

# 使用手撕模板实现K-means聚类算法
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
labels = kmeans(X, n_clusters=2)
print(labels)
# [0 0 0 1 1 1]

关于K-means聚类算法的学习资源,以下是一些推荐的参考资料:

  1. K-means聚类算法 - 维基百科
  2. K-means聚类算法 - Scikit-learn文档
  3. K-means聚类算法的数学推导 - 简书
  4. K-means聚类算法详解及Python实现 - CSDN博客

在这里插入图片描述

						  🤞到这里,如果还有什么疑问🤞
					🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
					 	 🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳

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

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

相关文章

代码随想录算法训练营第四十八天|121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 II

LeetCode 121. 买卖股票的最佳时机 题目链接:121. 买卖股票的最佳时机 - 力扣(LeetCode) 直觉告诉我要贪心算法,章节告诉我得用DP来做,行,都做一下! 贪心:只能买一次,所…

找不到vcomp120.dll该如何修复?vcomp120.dll丢失的5个可行解决方法

本文将对vcomp120.dll文件的丢失原因进行详细分析,并提供五个有效的修复方法。同时,本文还将深入介绍vcomp120.dll文件的作用及其在程序运行中的重要性。 一、vcomp120.dll文件丢失原因 操作系统损坏:由于病毒感染、系统错误等原因&#xf…

【Spring】Spring事务详解

📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…

ChatGPT化身“AI间谍”:你在网上说的每句话都将被监控

大多数人使用 ChatGPT 就是用来聊天或者辅助学习、办公。 然而现在一些“间谍软件”公司正在探索如何使用ChatGPT和其他新兴的AI来监视社交媒体上的用户。 其中一家由俄罗斯企业家创立的Social Links的公司正使用 ChatGPT 作为助手,监控着用户在Facebook、Instagr…

【STM32单片机】简易计算器设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器,使用动态数码管模块、矩阵按键、蜂鸣器模块等。 主要功能: 系统运行后,数码管默认显示0,输入对应的操作数进行四则运…

【好玩的 Docker 项目】搭建一个完全自由的音乐播放软件 ————Navidrome 随时随地!想听就听!

前言 随着国内版权意识的提高,现在想听一首歌曲,往往我们可能要切换 3-4 个 APP—— 网易云音乐、QQ 音乐、咪咕音乐…… 切换起来很麻烦,有的 APP 就算你买了 VIP 服务,下载的歌曲还是加密的,一旦 VIP 到期后某些歌你还听不了,非常蛋疼。 顺哥博客 最近被朋友推荐入了…

二叉树经典面试题—折纸

与其明天开始,不如现在行动! 文章目录 1 折纸问题1.1 解决思路1.2 实现代码 💎总结 1 折纸问题 1.1 解决思路 请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时折痕是凹下去的&#xf…

【深入剖析K8s】容器技术基础(三):深入理解容器镜像 文件角度

容器里的进程‘看到’’的文件系统 可能你立刻就能想到,这应该是_个关于MountNamespace的问题:容器里的应用进程理应‘看到”一套完全独立的文件系统这样它就可以在自己的容器目录(比如/tmp)下进行操作’而完全不会受宿主机以及其…

Pycharm Available Packages显示Noting to show

使用Pycharm安装依赖包时Available packages 页面点击添加按钮后,没有任何包显示,并且无法搜索安装. 在各种网站查看到的方法如下: 1.网络问题,需要添加镜像源 点击Manage Repositories 添加一个可用的镜像源地址即可 2.打开了anaconda(那个绿色圈圈小图标),再点一下把它点…

【漏洞复现】OpenTSDB 2.4.0 命令注入(CVE-2020-35476)漏洞复现

漏洞描述 官方文档这样描述:OpenTSDB is a distributed, scalable Time Series Database (TSDB) written ontop of HBase; 翻译过来就是,基于Hbase的分布式的,可伸缩的时间序列数据库。 主要用途,就是做监控系统;譬如收集大规模集群(包括网络设备、操作系统、应用程序…

Cadence Vmanager vsif文件编写指南(持续更新...)

目录 1.NTF格式介绍 1.1.1 {属性:值}定义 1.1.2类别 1.1.3语法 2.vsif文件中有效的container 2.1 session {…} 1.NTF格式介绍 Cadence的Vmanager工具采用vsif类型的文件作为regression的输入文件,采用vplanx/csv类型的文件作为vplan的输入文件&am…

uniapp IOS从打包到上架流程(详细简单)

​ uniapp IOS从打包到上架流程(详细简单) 原创 1.登入苹果开发者网站,打开App Store Connect ​ 2.新App的创建 点击我的App可以进入App管理界面,在右上角点击➕新建App 即可创建新的App,如下图: ​ 3.…

数据结构——哈夫曼树结构总结

一直在找工作,没时间写博客,现在找到工作了,博客回归~ 哈夫曼树定义及构建教程

官网IDM下载和安装的详细步骤

目录 一、IDM是什么 二、下载安装 三、解决下载超时的问题 四、谷歌浏览器打开IDM插件 谷歌浏览器下载官网👇 五、测试 六、资源包获取 一、IDM是什么 IDM(internet download manager)是一个互联网下载工具插件,常见于用…

NX二次开发UF_CURVE_ask_offset_curves 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_offset_curves Defined in: uf_curve.h int UF_CURVE_ask_offset_curves(tag_t offset_curve_object, int * num_curves, tag_t * * offset_curves ) overview 概述 …

双周赛118(模拟、分组循环、记忆化搜索==>动态规划、单调队列优化DP)

文章目录 双周赛118[100121. 查找包含给定字符的单词](https://leetcode.cn/problems/find-words-containing-character/)模拟 [100138. 最大化网格图中正方形空洞的面积](https://leetcode.cn/problems/maximize-area-of-square-hole-in-grid/)题意转换 分组循环 [100133. 购…

鸿蒙(HarmonyOS)应用开发——基础语法例子

前言 在前面几篇文章中,已经介绍了ArkTs中装饰器、声明式UI、自定义组件。知识都是很零散的,我们可以做一个Demo。现在我们一步一步完成下面这样的页面 创建ToDo项目 输入项目的名称,存放的位置,点击完成。IDE创建项目&#xf…

MySQL基本SQL语句(下)

MySQL基本SQL语句(下) 一、扩展常见的数据类型 1、回顾数据表的创建语法 基本语法: mysql> create table 数据表名称(字段名称1 字段类型 字段约束,字段名称2 字段类型 字段约束,...primary key(主键字段 > 不能为空、必须唯一) ) …

2018年11月8日 Go生态洞察:参与2018年Go用户调查

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

共享模型之无锁

目录 无锁实现线程安全 无锁与synchronized效率对比 原子整数 原子引用类型 ABA问题 原子数组 字段更新器 原子累加器LongAdder LongAdder源码分析 Unsafe cas修改对象属性值 案例 对于银行取钱来说,需要保证线程安全,一个1w的账户由1k个线程…