机器学习B:实验七:K 均值聚类算法实现与测试
一、实验目的
深入理解 K 均值聚类算法的算法原理,进而理解无监督学习的意义,能够使用 Python语言实现 K 均值聚类算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注
意同分布取样);
(2)使用训练集训练 K 均值聚类算法,类别数为 3;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选
择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验七的
部分。
三、算法步骤、代码、及结果
1. 算法伪代码
输入:数据集 D,类别数 K,迭代次数 max_iter
输出:每个数据点的聚类标签
1. 随机选择 K 个数据点作为初始聚类中心
2. 对于 D 中的每个数据点 do
a. 计算其与每个聚类中心的距离
b. 将数据点分配给最近的聚类中心
3. 对于每个聚类 do
a. 重新计算聚类中心为聚类中所有点的均值
4. 重复步骤 2 和 3,直到满足以下条件之一:
a. 达到 max_iter 次迭代
b. 聚类中心的变化小于阈值
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.cluster import KMeans
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.metrics import normalized_mutual_info_score
# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
# 使用留出法留出1/3的样本作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=1)
# 创建K均值聚类模型,类别数为3
kmeans = KMeans(n_clusters=3, random_state=1)
# 训练模型
kmeans.fit(X_train)
# 预测训练集和测试集的聚类标签
y_train_pred = kmeans.predict(X_train)
y_test_pred = kmeans.predict(X_test)
nmi = normalized_mutual_info_score(y_test, y_test_pred)
print(f"测试集标准化互信息(NMI): {nmi:.4f}")
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
聚类效果评估:通过将聚类标签映射到最频繁的真实标签,我们能够近似计算出准确率、精度、召回率和F1值。这些指标提供了一个关于聚类效果与真实标签一致性的量化度量。
映射的局限性:映射方法假设每个聚类对应一个真实的类别,这在实际中可能不成立。如果聚类结果与真实标签的分布不一致,这种映射可能会导致评估指标失真。
聚类质量的多维度评估:除了映射后的指标,我们还应该使用无监督的评估指标,如轮廓系数、戴维斯-邦丁指数和标准化互信息(NMI),来全面评估聚类的质量。这些指标不依赖于预先定义的标签,能够更准确地反映聚类算法的性能。
参数选择的影响:K值的选择对聚类结果有显著影响。通过肘部法则等方法选择最佳的K值,可以提高聚类的效果。不同的K值可能导致聚类结果的显著差异,因此在实际应用中需要仔细选择。
算法的适用性:K均值聚类算法适用于特征空间线性可分且各聚类具有相似方差的数据集。对于非球形的聚类或有噪声的数据集,可能需要考虑其他聚类算法,如DBSCAN或层次聚类。
算法的稳定性:K均值聚类算法对初始聚类中心的选择敏感,不同的初始化可能导致不同的聚类结果。使用KMeans++等方法可以提高算法的稳定性。
算法的可扩展性:K均值聚类算法在处理大规模数据集时相对高效,但在高维数据上可能会遇到维度灾难,此时需要降维或使用其他算法。
实验结论:实验结果表明,K均值聚类算法在iris数据集上能够获得合理的聚类效果。通过无监督评估指标,我们验证了聚类的合理性。同时,通过将聚类结果与真实标签的映射,我们得到了一个关于聚类效果的近似评估。这些结果有助于我们理解K均值聚类算法的工作原理和在实际应用中的潜在价值。
综上所述,K均值聚类算法是一个强大的工具,尤其适用于大规模数据集的聚类分析。然而,为了获得最佳结果,需要仔细选择参数,并结合多种评估指标来全面评估聚类的效果。