一二博_一二博近邻算法,分类MNIST数据集

中国围棋网2018年04月16日 08时04分39秒
62

原标题:教程 | 用Scikit-Learn构建K-近邻算法,分类MNIST数据集


机器之心编译

参与:乾树、刘晓坤

K 近邻算法,简称 K-NN。在如今深度学习盛行的时代,这个经典的机器学习算法经常被轻视。本篇教程将带你使用 Scikit-Learn 构建 K 近邻算法,并应用于 MNIST 数据集。然后,作者将带你构建自己的 K-NN 算法,开发出比 Scikit-Learn K-NN 更准更快的算法。

K 近邻分类模型


懒惰的程序员


K 近邻算法是一种容易实现的监督机器学习算法,并且其分类性能的鲁棒性还不错。K-NN 最大的优点之一就是它是一个惰性算法,即该模型无须训练就可以对数据进行分类,而不像其他需要训练的 ML 算法,如 SVM、回归和多层感知机。


K-NN 如何工作


为了对给定的数据点 p 进行分类,K-NN 模型首先使用某个距离度量将 p 与其数据库中其它点进行比较。


距离度量就是类似欧几里得距离之类的标准,以两个点为输入并返回这两个点之间距离的简单函数。


因此,可以假设距离较小的两个点比距离较大的两个点相似度更高。这是 K-NN 的核心思想。


该过程将返回一个无序数组,其中数组中的每一项都表示 p 与模型数据库中 n 个数据点之间的距离。所以返回数组的大小为 n。


K 近邻的 K 的含义是:k 是一个任意值(通常在 3-11 之间),表示模型在对 p 分类时应该考虑多少个最相似的点。然后模型将记录这 k 个最相似的值,并使用投票算法来决定 p 属于哪一类,如下图所示。


懒惰的程序员


上图中的 K-NN 模型的 k 值为 3,箭头指向的中心点为 p,算法将对这个点进行分类。


如你所见,圆圈中的三个点是与 p 最接近或最相似的三个点。因此,使用简单的投票算法,p 将被归为「白色」,因为白色在 k 个最相似值中占大多数。


酷炫!但令人惊讶的是,这个简单的算法可以在某些情况下实现不俗的结果,并且可以应用于各种各样的问题,我们将在下面介绍。


在 Scikit-Learn 中实现 K-NN 算法用来分类 MNIST 图像


数据:


对于这个例子,我们将使用常见的 MNIST 数据集。MNIST 数据集是机器学习中最常用的数据集之一,因为它很容易实现,而且是验证我们模型的可靠方法。



MNIST 是一组包含 70,000 个手写数字 0-9 的数据集。任意两个手写数字都不相同,有些可能很难正确分类。


算法:


我们从 Scikit-Learn 的 Python 库的 KNeighborsClassifier() 函数入手。这个函数有很多参数,但在这个例子中我们只需用少量几个参数。具体来说,我们只会传递 n_neighbors 参数的值(就是 k 值啦)。


weights 参数给出了模型使用的投票算法的类型,其中默认值是 uniform。这意味着在对 p 进行分类时,k 个点中的每一个的权重都一样。algorithm 参数也将使用默认值 auto,因为我们希望 Scikit-Learn 自动找到对 MNIST 数据进行分类的最佳算法。


以下是一个用 Scikit-Learn 构建 K-NN 分类器的 Jupyter Notebook:


Scikit-Learn 实现的用于 MNIST 的 K 近邻算法


Notebook 地址:https://gist.github.com/samgrassi01/82d0e5f89daac3e65531a6ef497cc129#file-skl-knn-ipynb


我们通过导入所需的库直接开始。


In [1]:
import numpy as np

from sklearn import datasets, model_selection
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report

mnist = datasets.fetch_mldata('MNIST original')
data, target = mnist.data, mnist.target

# make sure everything was correctly imported
data.shape, target.shape
Out[1]:
((70000, 784), (70000,))


构建数据集


我们通过制作不同的数据集来构建 K-NN 模型。我们将创建一个可以获取特定大小数据集、返回数据集大小的函数。


In [:
"""makes a dataset of size "size", and returns that datasets images and targets
This is used to make the dataset that will be stored by a model and used in
experimenting with different stored dataset sizes
"""

train_img = [data[i] for i in indx[:size]]
train_img = np.array(train_img)
train_target = [target[i] for i in indx[:size]]
train_target = np.array(train_target)

不错。现在我们将使用这个函数来构建两个不同大小的数据集,来看看模型在不同数据量上的分类性能怎么样。


提示:制作较小的数据集时,你仍然可以进行分类,但模型毕竟少了一些数据,这可能会导致分类错误。

标签:一二博,一二博官网,一二博娱乐

本文链接:http://www.weiqi.cc/developer/130316.html 转载请注明出处