模式识别(五)聚类算法(Kmeans)识别手写数字数据集

本文探讨了使用KMeans算法对手写数字数据集进行分类的问题。初步尝试得到的准确率在0.2-0.3之间,可能由于高维度数据导致效果不佳。为解决这个问题,文章提到了使用PCA进行降维,并且指出不应仅依赖标签正确率评估聚类效果,建议采用Adjusted Rand Index作为评价标准。实验结果展示了KMeans在细胞数据集上的分类情况。
摘要由CSDN通过智能技术生成

Kmean分类digits

首先先写了一个,准确率大概在0.2-0.3左右。我考虑了两一下可能的原因:一个是因为维度太高导致结果不佳,因此我用PCA降维;另外一个是因为我不应该单纯以标签正确率作为衡量指标。因为scikitlearn上说:“其实不应该将分类标签作为聚类结果的评价指标,除非你有相关的先验知识或某种假设,知道这种分类类内差距更小”。但是它还是给出了几种评价标准,所以我用了Adjusted Rand index,其中contingency_matrix参考wiki中的contingency table,就是把预期和真实一样的同时表示在一个表里,预测这一类有多少样本。
运行Kmeans.py结果:
在这里插入图片描述

import numpy as np
from sklearn import datasets
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.metrics.cluster import contingency_matrix

def purity_score(y_true,y_pred):
    cm = contingency_matrix(y_true,y_pred)
    return (np.sum(np.amax(cm,axis=0))/y_pred.shape[0])

if __name__ == '__main__':
    digits = datasets.load_digits()
    x = digits.get('data')
    pca = PCA(n_components=2)
    x = pca.fit_transform(x)
    y = digits.get('target')
    # 产生训练集和测试集
    num = x.shape[0]
    ratio = 7 / 3  # 训练集数目:测试集数目
    num_test = int(num / (1 + ratio))
    num_train = num - num_test
    index = np.arange(num)
    np.random.shuffle(index)  # 随机打乱
    # 取出洗牌后前 num_test 作为测试集,剩余的为训练集
    x_test = x[index[:num_test], :]
    y_test = y[index[:num_test]]
    x_train = x[index[num_test:], :]
    y_train = y[index[num_test:]]

    kmeans = KMeans(n_clusters=10) # 分十个类(0-9);这个参数调节影响准确率
    kmeans.fit(x_train)

    centers = kmeans.cluster_centers_
    for i in range(3)
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值