🤵♂️ 个人主页: @AI_magician
📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。
👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱🏍
🙋♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)
摘要: 本系列旨在普及那些深度学习路上必经的核心概念,文章内容都是博主用心学习收集所写,欢迎大家三联支持!本系列会一直更新,核心概念系列会一直更新!欢迎大家订阅
该文章收录专栏
[✨— 《深入解析机器学习:从原理到应用的全面指南》 —✨]
@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=1∑n(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=∣Cj∣1xi∈Cj∑xik
步骤5: 重复步骤3和4
- 重复步骤3和4,直到簇中心点的变化小于某个阈值,或达到最大迭代次数。
步骤6: 输出聚类结果
- 最终,K-means算法会收敛,并输出每个样本所属的簇。
总的来说,K-means算法通过每个数据点的本身距离位置,根据所确定的簇数不断更新中心点,找到一种部分中心之间在一定阈值下有着相同类似特征的群体,这是根据欧几里得距离来衡量的,这其中有两种问题,其可以从名字得出,
- 如何确定选择几个簇最为合适?
- 单纯使用均值更新严重受离群点影响
实现案例
接下来,我将为您提供使用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聚类算法的学习资源,以下是一些推荐的参考资料:
- K-means聚类算法 - 维基百科
- K-means聚类算法 - Scikit-learn文档
- K-means聚类算法的数学推导 - 简书
- K-means聚类算法详解及Python实现 - CSDN博客
🤞到这里,如果还有什么疑问🤞
🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳