人工智能00009 深度学习与图像识别书评09 图像分类识别预备知识02

KNN算法将会比较测试图片与训练集中每一张图片,然后将它认为最相似的那个训练集图片的标签赋给这张测试图片。

那么,具体应该如何比较这两张图片呢?在本例中,比较图片就是比较28×28的像素块。最简单的方法就是逐个像素进行比较,最后将差异值全部加起来。


使用L1距离来进行比较。逐个像素求差值,然后将所有差值加起来得到一个数值。如果两张图片一模一样,那么L1距离为0,但是如果两张图片差别很大,那么,L1的值将会非常大。

3.验证KNN在MNIST上的效果 在实现算法之后,

我们需要验证MNIST数据集在KNN算法下的分类准确度,在“if__name__=='__main__'”下添加如下代码(不要忘记缩进):

X_train = train_loader.dataset.train_data.numpy() #需要转为numpy矩阵

X_train = X_train.reshape(X_train.shape[0],28*28)#需要reshape之后才能放入knn分类器

y_train = train_loader.dataset.train_labels.numpy()

X_test = test_loader.dataset.test_data[:1000].numpy()

X_test = X_test.reshape(X_test.shape[0],28*28)

y_test = test_loader.dataset.test_labels[:1000].numpy()

num_test = y_test.shape[0]

y_test_pred = kNN_classify(5, 'M', X_train, y_train, X_test)

num_correct = np.sum(y_test_pred == y_test)

accuracy = float(num_correct) / num_test

print('Got %d / %d correct => accuracy: %f' % (num_correct, num_test, accuracy))  

最后,我们运行代码,由运行结果可以看到准确率只有 Got 368/1000 correct=>accuracy:0.368000!这说明1000张图片中只有大约37张图片预测类别的结果是准确的。

先别气馁,我们之前不是刚说过可以使用数据预处理的技术吗?下面我们试一下如果在进行数据加载的时候尝试使用归一化,那么分类准确度是否会提高呢?

我们稍微修改下代码,主要是在将X_train和X_test放入KNN分类器之前先调用centralized,进行归一化处理,示例代码如下:

X_train = train_loader.dataset.train_data.numpy()

mean_image = getXmean(X_train)

X_train = centralized(X_train,mean_image)

y_train = train_loader.dataset.train_labels.numpy()

X_test = test_loader.dataset.test_data[:1000].numpy()

X_test = centralized(X_test,mean_image)

y_test = test_loader.dataset.test

_labels[:1000].numpy()

num_test = y_test.shape[0]

y_test_pred = kNN_classify(5, 'M', X_train, y_train, X_test)

num_correct = np.sum(y_test_pred == y_test)

accuracy = float(num_correct) / num_test

print('Got %d / %d correct => accuracy: %f' % (num_correct, num_test, accuracy))

下面再来看下输出结果的准确率:Got 951/1000 correct=>accuracy:0.951000, 95%算是不错的结果。

现在我们来看一看归一化后的图像是什么样子的,

代码如下:  import matplotlib.pyplot as plt

mean_image = getXmean(X_train)

cdata = centralized(test_loader.dataset.test_data.numpy(),mean_image)

cdata = cdata.reshape(cdata.shape[0],28,28)

plt.imshow(cdata[0],cmap=plt.cm.binary)

plt.show()

print(test_loader.dataset.test_labels[0]) #输出的label为7

 4.KNN代码整合

现在,我们再来回顾下KNN的算法实现,对于KNN算法来说,之前的实现代码虽然可用,但并不是按照面向对象的思路来编写的,在本例中,我们将之前的代码做一下改进。

代码的实现思路是:我  

们可以创建一个fit方法来存储所有的图片以及与它们对应的标签。

伪代码如下:  def fit(self,X_train,y_train):

   return model  再创建一个predict方法,以预测输入图片最有可能匹配的标签:

def predict(self,k, dis, X_test):

#其中,k的选择范围为1~20,dis代表选择的是欧拉还是曼哈顿公式,X_test表示训练数据,函数返回的是预测的类别 return test_labels  下面我们来完善下KNN算法的封装(基于面向对象的思想来实现)。

我们将这个类命名为Knn(注意:这个类名的n是小写的)。

第一步,完善fit方法,fit方法主要是通过训练数据集来训练模型,在Knn类中,我们的实现思路是将训练集的数据与其对应的标签存储于内存中。

代码如下:  def fit(self,X_train,y_train): #我 们统一下命名规范,X_train代表的是训练数据集,而y_train代表的是对应训练集数据的标签

   self.Xtr = X_train

   self.ytr = y_train  

第二步,完善predict方法,predict方法可用于预测测试集的标签。具体的实现代码与之前的代码类似,只不过输入的参数只有k(代表的是k的选值),dis代表使用的是欧拉公式还是曼哈顿公式,X_test代表的是测试数据集; predict方法返回的是预测的标签集合。

代码如下(只包含了欧氏距离的实现):  def predict(self,k, dis, X_test):

   assert dis == 'E' or dis == 'M', 'dis must E or M'

   num_test = X_test.shape[0]  #测试样本的数量

   labellist = []

   #使用欧拉公式作为距离度量

   if (dis == 'E'):

       for i in range(num_test):

           distances = np.sqrt(np.sum(((self.Xtr - np.tile(X_test[i], (self.Xtr.shape[0], 1))) ** 2), axis=1))

           nearest_k = np.argsort(distances)

           topK = nearest_k[:k]

           classCount = {}

           for i in topK:

               classCount[self.ytr[i]] = classCount.get(self.ytr[i], 0) + 1

           sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)

           labellist.append(sortedClassCount[0][0])

       return np.array(labellist)  

最后,我们引入from ml.knn.demo.KnnClassify import Knn,使用MNIST数据集查看效果。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容