12.【基础】手写体数字图像聚类--KMeans

本文探讨了使用KMeans进行手写体数字图像的无监督学习聚类,通过分析轮廓系数确定最佳模型为k=3。内容包括KMeans在手写体识别中的应用及其优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文所有实现代码均来自《Python机器学习及实战》

#-*- coding:utf-8 -*-

#分别导入numpy、matplotlib、pandas,用于数学运算、作图以及数据分析
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd 

#第一步:使用pandas读取训练数据和测试数据
digits_train = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tra',header=None)
digits_test = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tes',header=None)

#第二步:已知原始数据有65个特征值,前64个是像素特征,最后一个是每个图像样本的数字类别
#从训练集和测试集上都分离出64维度的像素特征和1维度的数字目标
X_train = digits_train[np.arange(64)]
y_train = digits_train[64]
X_test = digits_test[np.arange(64)]
y_test = digits_test[64]

#第三步:使用KMeans模型进行训练并预测
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=10)
kmeans.fit(X_train)
kmeans_y_predict = kmeans.predict(X_test)

#第四步:评估KMeans模型的性能
### 使用K-Means算法对MNIST手写体数据集进行聚类建模 #### 数据预处理 在应用K-Means算法之前,需要对MNIST数据集进行必要的预处理。这一步骤通常包括加载数据、标准化特征以及调整输入形状以便于后续操作。 ```python from sklearn.datasets import fetch_openml from sklearn.preprocessing import StandardScaler # 加载 MNIST 数据集 mnist = fetch_openml('mnist_784', version=1) data = mnist.data.astype(float) # 对数据进行标准化处理 scaler = StandardScaler() scaled_data = scaler.fit_transform(data) ``` 以上代码展示了如何获取并准备MNIST数据集[^4]。通过`fetch_openml`函数可以下载完整的MNIST数据集,并将其转换为适合机器学习模型使用的浮点数形式。随后利用`StandardScaler`完成数据的标准化,这是为了确保每维特征具有相同的尺度范围,从而提高K-Means算法的效果。 #### 初始化与执行K-Means算法 接下来定义参数并运行K-Means算法来寻找最佳簇心位置。这里采用的是Scikit-Learn库中的实现方式: ```python from sklearn.cluster import KMeans # 设置超参数 num_clusters = 10 # 假设目标类别数量为10(对应数字0到9) kmeans_model = KMeans(n_clusters=num_clusters, random_state=42) # 执行聚类 labels = kmeans_model.fit_predict(scaled_data) centroids = kmeans_model.cluster_centers_ ``` 此部分实现了基本的K-Means流程[^3]。其中设置了期望找到的簇数目为10个(因为MNIST包含十个不同的数字),并通过调用`.fit_predict()`方法一次性完成了模型训练和预测标签分配的任务。最终得到的结果存储在变量`labels`里表示各样本归属的具体分类;而`cluster_centers_`则记录下了各个簇的核心坐标向量。 #### 结果评估 由于这是一个无监督学习任务,在缺乏真实标记的情况下无法直接衡量准确性。然而可以通过其他指标比如轮廓系数(Silhouette Score)或者惯性(Inertia)来进行质量评判: ```python from sklearn.metrics import silhouette_score silhouette_avg = silhouette_score(scaled_data, labels) print(f'Silhouette Coefficient: {silhouette_avg}') ``` 上述脚本计算了整体的数据分布情况下的平均剪影宽度得分[^2]。较高的数值意味着更清晰分离出来的群组结构,因此有助于验证所选参数设置是否合理有效。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值