首页 > 编程语言 >机器学习实验七:K 均值聚类算法实现与测试

机器学习实验七:K 均值聚类算法实现与测试

时间:2024-12-21 16:34:32浏览次数:4  
标签:iris score 均值 算法 train 聚类 test

实验七:K 均值聚类算法实现与测试

一、实验目的

深入理解 K 均值聚类算法的算法原理,进而理解无监督学习的意义,能够使用 Python语言实现 K 均值聚类算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。

 

二、实验内容

(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注意同分布取样);

(2)使用训练集训练 K 均值聚类算法,类别数为 3;

(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择;

(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验七的部分。

 

 

三、算法步骤、代码、及结果

   1. 算法伪代码

1. 导入所需库

   - 导入 numpy

   - 导入 sklearn 中的相关模块(datasets, model_selection, metrics, cluster)

 

2. 加载 iris 数据集

   - iris = load_iris()

   - X = iris.data  # 特征数据

   - y = iris.target  # 真实标签(可选,用于后续评估)

 

3. 划分数据集

   - 使用 train_test_split(X, y, test_size=1/3, random_state=42, stratify=y)

   - X_train, X_test, y_train, y_test = 划分后的数据

 

4. 初始化 K 均值聚类模型

   - kmeans_model = KMeans(n_clusters=3, random_state=42)

 

5. 训练模型

   - kmeans_model.fit(X_train)

 

6. 使用五折交叉验证评估模型性能

   - 由于 K 均值聚类是无监督学习,无法直接计算准确度、精度、召回率和 F1 值

   - 可能需要使用轮廓系数(silhouette score)等指标评估模型性能

   - 使用 cross_val_score 或手动实现交叉验证并计算评价指标

 

7. 使用测试集测试模型的性能

   - y_pred = kmeans_model.predict(X_test)

   - 使用轮廓系数或其他无监督指标评估聚类结果

   - 如果需要,将聚类结果与真实标签进行比较,计算准确度、精度等指标(使用匹配算法如匈牙利算法)

 

8. 输出评估结果

   - 打印五折交叉验证的评价指标

   - 打印测试集的聚类结果分析

 

9. 分析测试结果

   - 根据聚类结果进行分析,讨论模型的性能和潜在改进方向

 

   2. 算法主要代码

完整源代码\调用库方法(函数参数说明)

# 导入所需库
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.cluster import KMeans
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.metrics import silhouette_score

# 1. 加载 iris 数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 2. 留出法将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, stratify=y)

# 3. 训练 K 均值聚类算法,类别数为 3,设置 n_init 参数
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)  # 显式设置 n_init
kmeans.fit(X_train)

# 4. 使用五折交叉验证评估模型性能
# 为了计算准确度、精度、召回率和 F1 值,我们需要将聚类结果和真实标签进行比较
# KMeans 返回聚类标签,我们使用其预测进行评估
# 先得到训练集的预测标签
train_predictions = kmeans.predict(X_train)

# 然后为了便于进行交叉验证,定义一个函数来计算评估指标
def evaluate_model(y_true, y_pred):
    accuracy = accuracy_score(y_true, y_pred)
    precision = precision_score(y_true, y_pred, average='weighted')
    recall = recall_score(y_true, y_pred, average='weighted')
    f1 = f1_score(y_true, y_pred, average='weighted')
    return accuracy, precision, recall, f1

# 进行五折交叉验证
cross_val_scores = cross_val_score(kmeans, X_train, y_train, cv=5)
print(f'五折交叉验证得分: {cross_val_scores}')

# 在训练集上评估模型
accuracy, precision, recall, f1 = evaluate_model(y_train, train_predictions)
print(f'训练集上的评估指标:\n准确度: {accuracy}\n精度: {precision}\n召回率: {recall}\nF1 值: {f1}')

# 5. 在测试集上测试模型性能
test_predictions = kmeans.predict(X_test)
test_accuracy, test_precision, test_recall, test_f1 = evaluate_model(y_test, test_predictions)

print(f'测试集上的评估指标:\n准确度: {test_accuracy}\n精度: {test_precision}\n召回率: {test_recall}\nF1 值: {test_f1}')

# 6. 计算轮廓系数以评估聚类效果
silhouette_avg = silhouette_score(X_test, test_predictions)
print(f'测试集轮廓系数: {silhouette_avg}')

 

调用库方法

 

1. load_iris

加载 Iris 数据集。

from sklearn.datasets import load_iris  

 

参数:

return_X_y: 如果为 True,返回特征和目标。如果为 False,返回一个包含数据的对象(默认值为 False)

返回值:

返回一个包含特征和目标的对象,通常通过 iris.data 和 iris.target 获取。

 

2. train_test_split

将数据随机划分为训练集和测试集。

from sklearn.model_selection import train_test_split  

 

参数:

test_size: 测试集占比(0-1之间的小数,或具体数目)。

random_state: 随机种子(确保划分可重现)。

stratify: 按类别比例划分(确保训练集和测试集类别分布一致)。

 

返回值:

返回划分后的训练数据和测试数据。

 

3. fit

用法: clf.fit(X_train, y_train)

作用: 训练模型。

 

4. cross_val_score

 

用法: cross_val_score(estimator, X, y, cv, scoring)

 

参数:

estimator: 需要评估的模型。

X: 特征数据。

y: 类别标签。

cv: 交叉验证的折数。

scoring: 评估指标(如准确率、精确率)。

 

5. KMeans

用法:KMeans(n_clusters=8, *, init='k-means++', n_init=10, max_iter=300, tol=0.0001,precompute_distances='auto',verbose=0,random_state=None, copy_x=True, n_jobs=None, algorithm='auto')

      

参数:

n_clusters: 期望的聚类数量。

init: 初始化聚类中心的方法(默认为’k-means++')。

n_init: 运行算法的次数,以选择最佳的聚类中心(默认为10)。

max_iter: 单次运行的最大迭代次数(默认为300)。

tol: 收敛准则(默认为0.0001)。

random_state: 随机种子,保证可重复性。

algorithm: 选择使用的算法(默认为’auto’)。

 

  1. precision_score

用法:

precision_score(y_true,y_pred,average='binary',labels=None,sample_weight=None)

      

 

 参数:    

y_true: 真实标签。

y_pred: 预测标签。

average: 计算方式(如’weighted’、‘macro’、'micro’等)。

labels: 计算精度的标签(可选)。

sample_weight: 样本权重(可选)

 

7. accuracy_score

计算模型在给定数据上的准确度。

from sklearn.metrics import accuracy_score  

 

参数:

y_true: 真实标签。

y_pred: 预测标签。

 

返回值:

返回预测准确率(在 0 到 1 之间的小数)。

 

8. classification_report

生成分类绩效的详细报告。

from sklearn.metrics import classification_report  

 

参数:

y_true: 真实标签。

y_pred: 预测标签。

target_names: 可选,类标签名称的列表,以便于输出可读性。

 

返回值:

返回一个字符串,包含每个类的精确率、召回率和 F1 值。

 

 

   3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)

 

 

四、实验结果分析

1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)

 

 

2. 对比分析

在对 Iris 数据集应用 KMeans 聚类算法的分析中,模型的表现显著低于预期。五折交叉验证得分均为负值,显示出模型在训练集上的聚类效果不佳。此外,训练集和测试集的评估指标,包括准确度、精度、召回率和 F1 值,均较低,表明模型未能有效地区分各个聚类,且在未见数据上的泛化能力有限。测试集的轮廓系数为 0.525,显示出聚类效果一般,存在一定的重叠现象。

这些问题可能源于数据特性与 KMeans 假设的不匹配,KMeans 假设聚类呈球形,而实际数据的分布可能更复杂。此外,类别标签与聚类标签之间的映射关系也可能导致评估指标的不理想。为改善聚类效果,建议尝试其他聚类算法,如 DBSCAN 或层次聚类,进行参数调优,并使用特征工程技术,如特征选择或降维,来提升模型性能。

总体而言,KMeans 在 Iris 数据集上的应用结果提示我们需要对模型进行进一步优化和调整,以实现更好的聚类效果。

 

 

五、心得体会

 

通过本次实验,我深入理解了 K 均值聚类算法的算法原理和无监督学习的意义。我认识到,与有监督学习不同,无监督学习没有明确的“正确”答案,因此评估聚类结果的方法也更为复杂和多样。

在实验过程中,我遇到了如何评估聚类结果的问题。由于聚类是无监督的,传统的分类评估指标(如准确度、精度、召回率和 F1 值)并不适用。我学习了如何使用轮廓系数等聚类内部评估指标来评估聚类结果的质量。

同时,我也意识到在聚类任务中,选择合适的聚类中心数量、初始化方法和迭代次数等参数对聚类结果有很大影响。这些参数的选择需要根据数据集的特点和实际需求进行权衡。

总的来说,这次实验不仅提高了我的编程能力,还加深了我对 K 均值聚类算法和无监督学习的理解。我认识到,在实际应用中,除了算法本身外,数据预处理、特征选择和模型评估等方面也同样重要。

 

标签:iris,score,均值,算法,train,聚类,test
From: https://www.cnblogs.com/drz1145141919810/p/18620882

相关文章

  • 机器学习实验八:随机森林算法实现与测试
    实验八:随机森林算法实现与测试一、实验目的深入理解随机森林的算法原理,进而理解集成学习的意义,能够使用Python语言实现随机森林算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。 二、实验内容(1)从scikit-learn库中加载iris数据集,使用留出法留出1/3的......
  • 机器学习实验三:C4.5(带有预剪枝和后剪枝)算法实现与测试
    实验三:C4.5(带有预剪枝和后剪枝)算法实现与测试一、实验目的深入理解决策树、预剪枝和后剪枝的算法原理,能够使用Python语言实现带有预剪枝和后剪枝的决策树算法C4.5算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。 二、实验内容(1)从scikit-learn库中加载......
  • 机器学习实验二:逻辑回归算法实现与测试
    实验二:逻辑回归算法实现与测试一、实验目的深入理解对数几率回归(即逻辑回归的)的算法原理,能够使用Python语言实现对数几率回归的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。 二、实验内容(1)从scikit-learn库中加载iris数据集,使用留出法留出1/3的样本作......
  • 机器学习实验四:SMO 算法实现与测试
    实验四:SMO算法实现与测试一、实验目的 深入理解支持向量机(SVM)的算法原理,能够使用Python语言实现支持向量机的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。 二、实验内容(1)从scikit-learn库中加载iris数据集,使用留出法留出1/3的样本作为测试集(注意同分......
  • 机器学习实验五:BP 神经网络算法实现与测试
    实验五:BP神经网络算法实现与测试一、实验目的深入理解BP神经网络的算法原理,能够使用Python语言实现BP神经网络的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。 二、实验内容(1)从scikit-learn库中加载iris数据集,使用留出法留出1/3的样本作为测试集(注......
  • KMP算法
    更新日志2024/12/21:开工。作用KMP算法本质作用是求字符串前缀的最长border。border:同时是一个字符串前缀和后缀的字符串,称为前者的border。常见的,我们可以使用它进行字符串匹配。思路假如我们要在\(s_1\)中匹配\(s_2\)。我们使用nxt数组储存\(s_2\)所有前......
  • 计算机视觉:YOLO V5目标检测算法模型
    1.YOLOV5模型概述1.1YOLOv5的概念YOLOv5是一种基于深度学习的目标检测模型,相较于YOLOv4,YOLOv5模型在目标检测精度和速度上都有了显著的提升。YOLOv5模型基于PyTorch开发,利用主干网络、检测头和损失函数等模块,能够实现对图像中多个目标的快速检测和定位。1.2YOLOv5模型......
  • 强化学习算法中的log_det_jacobian
    相关:https://colab.research.google.com/github/google/brax/blob/main/notebooks/training_torch.ipynb之前写过一篇同主题的文章,后来发现这个文章中有一些问题,不过也有些不好改动,于是就新开一篇来进行更正和补充!!!之前版本:https://www.cnblogs.com/xyz/p/18564777之所以之......
  • 1v1视频软件源码,如何优化快速排序算法低效问题?
    1v1视频软件源码,如何优化快速排序算法低效问题?快速排序快速排序也遵循分治的思想,它与归并排序不同的是,快速排序是原地排序,而且快速排序会先排序当前数组,再对子数组进行排序,它的算法步骤如下:1、哨兵划分:选取数组中最左端元素为基准数,将小于基准数的元素放在基准数左边,将......
  • 77.《排序算法实现》
    插入排序:直接插入排序:voidInsertSort(ElemTypeA[],intn){inti,j;for(inti=2;i<=n;i++)//从第二个元素开始遍历数组if(A[i]<A[i-1])//如果当前元素小于前一个元素{A[0]=A[i];//将当前元素暂存到A[0]......