目录
一、理论知识
1、KMeans算法介绍
KMeans算法又称K均值算法,是应用最广泛的聚类算法之一。所谓聚类,即根据样本间的相似性将具有较高相似度的样本划分至同一类簇,以此揭示数据中的潜在规律。聚类与分类最大的区别在于,聚类属于无监督算法,在训练过程中没有标签监督训练,而分类属于有监督算法,训练过程中会利用标签来引导模型参数优化。
2、KMeans算法的计算步骤
(1)随机选择k个样本作为初始簇类中心;
(2)将数据集中的每个样本划分至离它距离最近的簇;
(3)根据每个簇下的所属样本,更新簇类中心;
(4)重复(2)(3)步,当达到设置的迭代次数或着簇类中心不再改变时停止迭代,并输出聚类结果;
二、代码实现
1、导入Python包
import numpy as np
from sklearn.datasets import load_iris
from sklearn.metrics import adjusted_rand_score
2、Kmeans算法核心代码
def run_Kmeans(X, k, max_iter=100):
# 1.随机选择k个样本作为初始聚类中心
ind_center = np.random.choice(range(len(X)), size=k, replace=False)
center = X[ind_center]
for _ in range(max_iter):
# 2.将每个样本分配给距离最近的聚类中心
dist = np.linalg.norm(np.repeat(X[:,None,:], k, 1)-np.repeat(center[None,:,:], len(X), 0), axis=-1)
ind = np.argmin(dist, axis=-1)
# 3.更新聚类中心
center = np.array([np.mean(X[ind==i], axis=0) for i in range(k)])
return ind # 返回聚类结果
3、载入鸢尾花数据集
iris_dataset = load_iris()
X = iris_dataset["data"]
Y = iris_dataset["target"]
print(X.shape, Y.shape)
(150, 4) (150,)
4、运行Kmeans算法
np.random.seed(2023)
pred = run_Kmeans(X, k=len(set(Y)))
print("ARI: {:.4f}".format(adjusted_rand_score(Y, pred)))
ARI: 0.7302