当前位置: 首页 > news >正文

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

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.model_selection import KFold
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

1. 加载数据集并进行数据分析

print("Step 1: Loading and analyzing the dataset")
iris = load_iris()
X = iris.data # 特征数据
y_true = iris.target # 真实标签

数据分析

print(f"Dataset shape: {X.shape}")
print(f"Feature names: {iris.feature_names}")
print(f"Target names: {iris.target_names}")
print("First 5 samples:")
print(pd.DataFrame(X, columns=iris.feature_names).head())

2. 使用五折交叉验证进行模型训练和评估

print("\nStep 2: K-means clustering with 5-fold cross-validation")
k = 3 # 聚类数量,与iris数据集的类别数一致
kf = KFold(n_splits=5, shuffle=True, random_state=42) # 五折交叉验证

存储各折的性能指标

accuracy_scores = []
precision_scores = []
recall_scores = []
f1_scores = []

fold = 1
for train_index, test_index in kf.split(X):
print(f"\nFold {fold}😊

# 划分训练集和测试集
X_train, X_test = X[train_index], X[test_index]
y_train_true, y_test_true = y_true[train_index], y_true[test_index]# 训练K-means模型
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(X_train)# 预测测试集
y_test_pred = kmeans.predict(X_test)# 由于K-means是无监督学习,聚类中心的标签与真实标签可能不一致,需要进行标签匹配
# 使用多数投票法匹配聚类标签和真实标签
from scipy.stats import mode
y_pred_voted = np.zeros_like(y_test_pred)
for i in range(k):mask = (y_test_pred == i)y_pred_voted[mask] = mode(y_test_true[mask])[0]# 计算性能指标
accuracy = accuracy_score(y_test_true, y_pred_voted)
precision = precision_score(y_test_true, y_pred_voted, average='weighted')
recall = recall_score(y_test_true, y_pred_voted, average='weighted')
f1 = f1_score(y_test_true, y_pred_voted, average='weighted')# 存储性能指标
accuracy_scores.append(accuracy)
precision_scores.append(precision)
recall_scores.append(recall)
f1_scores.append(f1)print(f"Accuracy: {accuracy:.4f}")
print(f"Precision: {precision:.4f}")
print(f"Recall: {recall:.4f}")
print(f"F1-score: {f1:.4f}")fold += 1

3. 计算平均性能指标

print("\nStep 3: Performance evaluation")
print(f"\nAverage Accuracy: {np.mean(accuracy_scores):.4f} ± {np.std(accuracy_scores):.4f}")
print(f"Average Precision: {np.mean(precision_scores):.4f} ± {np.std(precision_scores):.4f}")
print(f"Average Recall: {np.mean(recall_scores):.4f} ± {np.std(recall_scores):.4f}")
print(f"Average F1-score: {np.mean(f1_scores):.4f} ± {np.std(f1_scores):.4f}")

4. 可视化聚类结果(使用前两个特征)

print("\nStep 4: Visualization")
kmeans_full = KMeans(n_clusters=k, random_state=42)
kmeans_full.fit(X)
y_pred_full = kmeans_full.predict(X)

匹配聚类标签和真实标签

from scipy.stats import mode
y_pred_voted_full = np.zeros_like(y_pred_full)
for i in range(k):
mask = (y_pred_full == i)
y_pred_voted_full[mask] = mode(y_true[mask])[0]

plt.figure(figsize=(12, 5))

真实标签可视化

plt.subplot(1, 2, 1)
plt.scatter(X[:, 0], X[:, 1], c=y_true, cmap='viridis')
plt.xlabel(iris.feature_names[0])
plt.ylabel(iris.feature_names[1])
plt.title('True Labels')
plt.colorbar(ticks=[0, 1, 2], label='Species')

K-means聚类结果可视化

plt.subplot(1, 2, 2)
plt.scatter(X[:, 0], X[:, 1], c=y_pred_voted_full, cmap='viridis')
plt.scatter(kmeans_full.cluster_centers_[:, 0], kmeans_full.cluster_centers_[:, 1],
s=200, c='red', marker='X', label='Centroids')
plt.xlabel(iris.feature_names[0])
plt.ylabel(iris.feature_names[1])
plt.title('K-means Clustering Results')
plt.colorbar(ticks=[0, 1, 2], label='Cluster')
plt.legend()

plt.tight_layout()
plt.savefig('kmeans_iris_visualization.png')
plt.show()

5. K-means算法参数说明

print("\nStep 5: K-means parameters explanation")
print("KMeans(n_clusters=3, random_state=42)")
print("- n_clusters: 聚类的数量,这里设置为3,与iris数据集的类别数一致")
print("- random_state: 随机种子,确保结果可复现")
print("其他重要参数:")
print("- init: 初始化方法,默认'k-means++',选择距离较远的初始聚类中心")
print("- n_init: 运行算法的次数,默认10,选择最好的结果")
print("- max_iter: 单次运行的最大迭代次数,默认300")
print("- tol: 收敛阈值,默认1e-4")
print("- algorithm: 算法选择,默认'elkan',适用于密集数据")

http://www.zskr.cn/news/171493.html

相关文章:

  • 三维重建技术的最新进展
  • 基于Python的个性化电影推荐可视化系统的设计与实现爬虫可视化
  • 镜像容器相关命令,docker export/import/save/load/commit,导出容器给别人使用
  • 基于Python的摄影师婚纱租赁 预约与交易系统vue
  • 2025.11.8上机实验二:逻辑回归算法实现与测试
  • 中信银行信用卡中心Android高级研发工程师岗位深度解析与技术面试指南
  • 清华大学开源镜像站配置PyTorch源的方法详解
  • 2025.10.30非遗声景漫游馆(项目架构文档)
  • 文法定义了一个典型的表达式文法,支持加法和乘法,具有左递归以实现左结合
  • 2025.11.3社区智慧共享资源管理系统(项目概述文档)
  • 蜕茧成蝶:当代码遇见了工程
  • 从文法的开始符号出发,尝试通过一系列最左推导,构造出与输入串完全匹配的语法树
  • 2025.11.4社区智慧共享资源管理系统(技术架构文档)
  • 2025.11.5社区智慧共享资源管理系统(部署和运行文档)
  • 编译原理中**语法制导翻译**(Syntax-Directed Translation, SDT)在中间代码生成阶段的核心机制
  • Springmvc的底层原理流程描述
  • 布尔表达式的文法与代码结构在编译原理中属于**中间代码生成**阶段的重要内容
  • FIRST/FOLLOW 集是编译原理中语法分析阶段的重要工具,主要用于自顶向下语法分析(如 LL(1) 分析)
  • 江湖四门:邪术门派的绝密智慧
  • 自动驾驶,AutoWareAuto框架全框架梳理思维导图及代码注释。 授人以鱼不如授人以渔,涵...
  • 昆仑 MCGS 与台达 B2 伺服通过 Modbus RTU 通讯控制教程
  • 三菱通过485BD板CRC指令通讯示例(不含详细校验程序)
  • 西门子S7 - 200与两台变频器Modbus RTU通信实战
  • 西门子博图电机控制块实战指南
  • 目标是对输入串 `abbcde#` 进行**自底向上的规范归约**,即使用 LR 分析技术中的“移进-归约”方式
  • 线程池配置-七大关键参数
  • 西门子S7-1500 PLC程序案例:制药厂洁净空调BMS系统(含冷水机组及洁净室空调机组控制
  • 计算机Java毕设实战-基基于SpringBoot+Vue的高校学习讲座预约管理系统设计于SpringBoot的高校学习讲座预约系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 2025.10.24AI儿童故事生成系统
  • 西门子1200博途程序与威纶触摸屏画面实例:V15及以上博图版 - 上位机通讯、modbus4...