前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于sklearn的k均值类聚模型理论代码实现——手写数字识别

基于sklearn的k均值类聚模型理论代码实现——手写数字识别

作者头像
月见樽
发布2018-04-27 12:01:38
8920
发布2018-04-27 12:01:38
举报

理论

无监督学习

无监督学习是相对于有监督学习的概念,无监督学习的样本只有数据没有标签(label),由模型自主发现样本之间的关系。可用于数据的类聚(类聚算法)和降维(主成分分析)等。

无监督学习的结果评估

ARI指标

当样本有真实指标(带label)时,可以使用ARI(调整兰德指数),公式为$$RI = \cfrac{a + b}{C_{2}^{n_{sample}}}$$ $$ARI = \cfrac{RI - E(RI)}{max(RI) - E(RI)}$$ 其中:

  • a:在预测结果和测试结果中同属于一类的样本对数
  • b:在预测结果和测试结果中均不属于一类的样本对数

该值越大,说明结果越好

轮廓系数

轮廓系数不需要先验知识,计算过程如下:

  1. 对于每一个样本,计算同类样本中其他样本到该样本的评价距离a
  2. 分别计算其他类样本中各类样本到这个样本的平均距离,找到平均距离最近的一个类到该样本的平均距离
  3. 计算轮廓系数$sc=\cfrac{b - a}{max(a,b)}$

对所有样本重复该过程,取平均值为轮廓系数

k 均值类聚(k-mean)

k均值类聚是一种简单的无监督学习模型,该模型是基于距离的类聚模型,将把特征空间中距离相近的点进行类聚。 在训练k均值类聚模型中,有以下步骤:

  1. 随机在特征空间中指定k个质心
  2. 计算每个样本到质心的距离,归入最近的质心一类
  3. 对每个质心的样本分别求平均,得到新的k个质心
  4. 第二步与第三步不断迭代,直到某次类聚结果不变(或改变归属的样本少于某个值),迭代结束

代码实现——手写数字识别

读取数据

代码语言:javascript
复制
import numpy as np
import pandas as pd
代码语言:javascript
复制
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)

数据预处理——分离数据与label

代码语言:javascript
复制
print(digits_test[:2])
代码语言:javascript
复制
   0   1   2   3   4   5   6   7   8   9  ...  55  56  57  58  59  60  61  62  \
0   0   0   5  13   9   1   0   0   0   0 ...   0   0   0   6  13  10   0   0   
1   0   0   0  12  13   5   0   0   0   0 ...   0   0   0   0  11  16  10   0   

   63  64  
0   0   0  
1   0   1  

[2 rows x 65 columns]
代码语言:javascript
复制
x_train = digits_train[np.arange(64)]
x_test = digits_test[np.arange(64)]
y_train = digits_train[64]
y_test = digits_test[64]

模型训练

代码语言:javascript
复制
from sklearn.cluster import KMeans
kme = KMeans(n_clusters=10)
model = kme.fit(x_train,y_train)
y_pre = kme.predict(x_test)

模型评估

ARI指标

代码语言:javascript
复制
from sklearn.metrics import adjusted_rand_score
adjusted_rand_score(y_test,y_pre)
代码语言:javascript
复制
0.66305779493265249

轮廓系数

代码语言:javascript
复制
from sklearn.metrics import silhouette_score
silhouette_score(y_test.values.reshape(-1,1),y_pre.reshape(-1,1),metric="euclidean")
代码语言:javascript
复制
c:\users\qiank\appdata\local\programs\python\python35\lib\site-packages\sklearn\utils\validation.py:547: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
  y = column_or_1d(y, warn=True)

0.27296875226980805
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.12.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 理论
    • 无监督学习
      • 无监督学习的结果评估
        • ARI指标
        • 轮廓系数
      • k 均值类聚(k-mean)
      • 代码实现——手写数字识别
        • 读取数据
          • 数据预处理——分离数据与label
            • 模型训练
              • 模型评估
                • ARI指标
                • 轮廓系数
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档