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模型的性能
### KMeans聚类算法详解 #### 3.1 算法原理 K-Means是一种基于距离的聚类算法,其目标是最小化各簇内样本之间的误差平方和。该算法通过迭代过程不断调整簇中心的位置来实现这一目标[^1]。 具体来说,在初始化阶段随机选取k个点作为初始质心;随后进入循环直至收敛条件满足: - 将每个数据点分配给最近的那个质心所属类别; - 更新各个类别的新质心位置为当前属于此类别下所有成员坐标的平均值。 此过程反复执行直到连续两次计算所得的新旧质心间变化量小于设定阈值或达到最大迭代次数为止。 #### 应用实例:手写数字识别中的KMeans聚类 为了更好地理解如何实际运用KMeans来进行数据分析工作,下面给出一个简单的例子——对手写字体图像进行分组处理并可视化展示结果。 ```python from sklearn.datasets import load_digits from sklearn.preprocessing import scale import numpy as np from sklearn.cluster import KMeans import matplotlib.pyplot as plt def bench_k_means(estimator, name, data): """评估不同参数配置下的性能""" estimator.fit(data) print('%-9s\t%.2f' % (name, estimator.inertia_)) digits = load_digits() data = scale(digits.data) n_samples, n_features = data.shape n_digits = len(np.unique(digits.target)) labels = digits.target sample_size = 300 print("n_digits: %d, \t n_samples %d, \t n_features %d" % (n_digits, n_samples, n_features)) bench_k_means(KMeans(init='k-means++', n_clusters=n_digits, n_init=10), name="k-means++", data=data) h = .02 reduced_data = PCA(n_components=2).fit_transform(data) kmeans = KMeans(init='k-means++', n_clusters=n_digits, n_init=10) kmeans.fit(reduced_data) # 可视化 fig = plt.figure(figsize=(8, 6)) colors = ['navy', 'turquoise', 'darkorange'] lw = 2 for color, i in zip(colors, [0, 1, 2]): plt.scatter(reduced_data[pred == i, 0], reduced_data[pred == i, 1], color=color, alpha=.8, lw=lw, label='Cluster %d' % i) plt.legend(loc='best', shadow=False, scatterpoints=1) plt.title('PCA-reduced KMeans Clustering on Handwritten Digits') plt.show() ``` 上述代码片段展示了利用`sklearn`库加载MNIST手写数字数据集,并对其进行标准化预处理后实施KMeans聚类分析的过程。最终还借助降维技术(如PCA)实现了二维平面上的数据点分布情况绘图以便直观观察聚类效果[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值