前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【聚类 | K-means】原理及推导流程(附模板代码,库&手撕实现)

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

作者头像
计算机魔术师
发布2023-11-27 10:46:15
发布2023-11-27 10:46:15
3.3K00
代码可运行
举报
文章被收录于专栏:计算机魔术师计算机魔术师
运行总次数:0
代码可运行

🤵‍♂️ 个人主页: @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(xi, μj) = \sqrt{\sum_{k=1}^{n}(xi_k - μj_k)^2}
  • 样本xi分配到与其距离最近的中心点所对应的簇

步骤4: 更新簇中心点

  • 对于每个簇j,计算该簇中所有样本的均值,得到新的中心点。
  • 计算簇j的新中心点μj的坐标为:
μj_k = \frac{1}{|Cj|}\sum_{xi\in Cj} xi_k

步骤5: 重复步骤3和4

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

步骤6: 输出聚类结果

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

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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聚类算法

代码语言:javascript
代码运行次数:0
运行
复制
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博客
代码语言:javascript
代码运行次数:0
运行
复制
						  🤞到这里,如果还有什么疑问🤞
					🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
					 	 🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • K-means聚类算法
    • 实现案例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档