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

news/2024/5/20 6:23:10 标签: 聚类, kmeans, 数据挖掘

在这里插入图片描述

🤵‍♂️ 个人主页: @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.niftyadmin.cn/n/5217353.html

相关文章

【Python游戏开发】使用Python编写拼图益智游戏教程

使用Python编写拼图益智游戏 大家一般都玩过拼图益智游戏,或者类似的游戏。今天,就给大家使用pygame库在Python中构建一个拼图益智小游戏。这个拼图小游戏是构建一个围绕着将1-15个数字排列在16个方块的网格中的游戏。 现在,让我们从今天的惊…

C#,《小白学程序》第三课:类class,类的数组及类数组的排序

类class把数值与功能巧妙的进行了结合&#xff0c;是编程技术的主要进步。 下面的程序你可以确立 分数 与 姓名 之间关系&#xff0c;并排序。 1 文本格式 /// <summary> /// 同学信息类 /// </summary> public class Classmate { /// <summary> /…

JVM运行参数介绍 -Xms -Xmx -Xmn -Xss

文章目录 CharGPT问答Java运行参数“-Xmx2048m -Xms1024m -Xmn512m -Xss256k”如何调优jvm的运行参数 JVM相关介绍Java 虚拟机底层原理知识总结 CharGPT问答 Java运行参数“-Xmx2048m -Xms1024m -Xmn512m -Xss256k” 2023/11/26 20:30:27 这些参数是用于配置 Java 虚拟机&am…

试写一算法将两个递增有序的带头结点的单链表合并为一个递增有序的带头结点的单链表。(利用原表结点空间)

试写一算法将两个递增有序的带头结点的单链表合并为一个递增有序的带头结点的单链表。 &#xff08;利用原表结点空间&#xff09; 比如现在要将下面两个链表合并&#xff0c;这里是要求利用原表空间 我们先创建一个辅助的链表L3&#xff0c;用p和q分别标记L1和L2的数据元素&…

基于halo框架采用docker-compose快速部署个人博客

halo快速部署个人博客 技术方案 dockerdocker-composenginxmysql halo简介 Halo是一款现代化的开源博客/CMS系统&#xff0c;所有代码开源在GitHub上且处于积极维护状态。它是基于 Java Spring Boot 构建的&#xff0c;易于部署&#xff0c;支持REST API、模板系统、附件系…

An example of a function uniformly continuous on R but not Lipschitz continuous

See https://math.stackexchange.com/questions/69457/an-example-of-a-function-uniformly-continuous-on-mathbbr-but-not-lipschitz?noredirect1

GWAS:plink进行meta分析

之前教程提到过Metal是可以做Meta分析&#xff0c;除了Metal&#xff0c;PLINK也可以进行Meta分析。 命令如下所示&#xff1a; plink --meta-analysis gwas1.plink gwas2.plink gwas3.plink logscale qt --meta-analysis-snp-field SNP --meta-analysis-chr-field CHR --me…

使用CMake构建

使用CMake构建 CMake是一个工具,用于简化跨不同平台的开发项目的构建过程。CMake自动生成生成系统,如Makefiles和Visual Studio项目文件。 CMake是一个自带的第三方工具证明文件。本主题描述了如何使用CMake3.1.0带Qt 5。 开始使用CMake 开始find_package找到Qt附带的库和…