上一篇博客我手动写了KNN算法,并且之后用手写的算法预测了约会的成功率。

而今天,我在大神博客的指导下调用sklearn这个库来预测图片的内容。

一、前期准备

由于我这里使用的是mac版本,而sklearn这个库很迷,装的时候老是给我报错,,所以我们装的时候不能单独的使用pip,要在后面加一行命令:

  

sudo pip install -U numpy scipy scikit-learn  --ignore-installed six

要用我上面的写法,具体原因是因为系统保护,(吧啦吧啦)所以跟mac的版本有关。不仅是这个sklearn,装tensorflow的时候也可以在后面添加  --ignore-installed six   来达到直接pip的目的。

具体的blog参照: http://blog.csdn.net/id314846818/article/details/58624393

而当我们成功安装sklearn库后,我们可以在任意目录下编辑.py文件:

  1. print(__doc__)
  2.  
  3. # Author: Nelle Varoquaux <nelle.varoquaux@gmail.com>
  4. # Alexandre Gramfort <alexandre.gramfort@inria.fr>
  5. # Licence: BSD
  6.  
  7. import numpy as np
  8. import matplotlib.pyplot as plt
  9. from matplotlib.collections import LineCollection
  10.  
  11. from sklearn.linear_model import LinearRegression
  12. from sklearn.isotonic import IsotonicRegression
  13. from sklearn.utils import check_random_state
  14.  
  15. n = 100
  16. x = np.arange(n)
  17. rs = check_random_state(0)
  18. y = rs.randint(-50, 50, size=(n,)) + 50. * np.log(1 + np.arange(n))
  19.  
  20. ###############################################################################
  21. # Fit IsotonicRegression and LinearRegression models
  22.  
  23. ir = IsotonicRegression()
  24.  
  25. y_ = ir.fit_transform(x, y)
  26.  
  27. lr = LinearRegression()
  28. lr.fit(x[:, np.newaxis], y) # x needs to be 2d for LinearRegression
  29.  
  30. ###############################################################################
  31. # plot result
  32.  
  33. segments = [[[i, y[i]], [i, y_[i]]] for i in range(n)]
  34. lc = LineCollection(segments, zorder=0)
  35. lc.set_array(np.ones(len(y)))
  36. lc.set_linewidths(0.5 * np.ones(n))
  37.  
  38. fig = plt.figure()
  39. plt.plot(x, y, 'r.', markersize=12)
  40. plt.plot(x, y_, 'g.-', markersize=12)
  41. plt.plot(x, lr.predict(x[:, np.newaxis]), 'b-')
  42. plt.gca().add_collection(lc)
  43. plt.legend(('Data', 'Isotonic Fit', 'Linear Fit'), loc='lower right')
  44. plt.title('Isotonic regression')
  45. plt.show()

然后python 这个文件,如果看到结果:

说明安装成功。

二、任务详情

之后我们就需要用这个库来写点真正的东西了。

这里我们要预测的内容为数字。

我们开始的时候会给出一堆文件:

文件下载地址为:https://github.com/Jack-Cherish/Machine-Learning/tree/master/kNN/3.%E6%95%B0%E5%AD%97%E8%AF%86%E5%88%AB

例如我打开其中的0_0.txt,得到

而1_40.txt对应 :

也就是说文件的名字0_0的‘_’前的那个数字对应了我们文本里的结果,而后面的那个数字是结果为0的文件的编号。

之后我们可以利用KNN进行预测。

三、代码详情

开始的时候我们要对这个32*32的01矩阵进行处理,将其放入一个一维矩阵中。

  1. #coding:utf-8
  2. import numpy as np
  3. import operator
  4. from os import listdir
  5. from sklearn.neighbors import KNeighborsClassifier as KNN
  6.  
  7. def image_vector(filename):
  8. zeroVector = np.zeros((1,1024))
  9. f = open(filename)
  10. for i in range(32):
  11. listRead = f.readline()
  12. for j in range(32):
  13. zeroVector[0,32*i+j] = int(listRead[j])
  14. #zeroVector里面的[0,n]:0代表第0行,n代表第n列个数字(因为zeros可以有m行n列)
  15. return zeroVector
  16. #将32*32的矩阵转移到一个一维矩阵中

之后调用函数进行预测,这里重点要关注fit函数、predict函数,

  1. def KNN_Process():
  2. trainNameClass = []
  3. trainingFileList = listdir('trainingDigits')
  4. fileCount = len(trainingFileList)
  5. #返回目录下的训练文件个数
  6. trainMat = np.zeros((fileCount,1024),int)
  7. #创建fileCount行,1024列的二维矩阵(用来保存所有训练集)
  8. for i in range(fileCount):
  9. currentFileName = trainingFileList[i]
  10. #当前文件的文件名称
  11. trainNameNumber = int(trainingFileList[i].split('_')[0])
  12. #取名称的'-'前面的内容
  13. trainNameClass.append(trainNameNumber)
  14. #将数字append到数组中
  15. url = 'trainingDigits/' + currentFileName
  16. #print url
  17. trainMat[i,:] = image_vector(url)
  18. #将每个图片的1024个数据均存在trainMat中,构成一个大小为fileCount*1024的矩阵
  19. KnnContain = KNN(n_neighbors = 3, algorithm = 'auto')
  20. #创建knn模型容器
  21.  
  22. KnnContain.fit(trainMat,trainNameClass)
  23. #用fit函数将train的矩阵与label对应起来
  24.  
  25. testFileList = listdir('testDigits')
  26. #返回testDigits目录下的文件
  27. errorCount = 0.0
  28. #错误量
  29. testCount = len(testFileList)
  30. #test数据的个数
  31. for i in range(testCount):
  32. currentTestName = testFileList[i]
  33. #当前第i个test文件的名字
  34. testClassNumber = int(currentTestName.split('_')[0])
  35. #获取当前文件的对应数字
  36. testVector = image_vector('testDigits/%s' %(currentTestName))
  37. #将当前test的1024个数据存入testVector中
  38. KnnResult = KnnContain.predict(testVector)
  39. print "分类结果为:%d\t真实结果为:%d\t" % (KnnResult,testClassNumber)
  40. if KnnResult != testClassNumber:
  41. errorCount += 1.0
  42. print "本次model的成功率为: %",(float(testCount) - errorCount)/float(testCount)*100

这里是利用了

  1. KnnContain = KNN(n_neighbors = 3, algorithm = 'auto')

将model抽象到KnnContain中,然后调用fit将training data的内容和value对应起来。而这个n_neighbors为knn中的k值。

详细的官方解释见:http://scikit-learn.org/stable/auto_examples/neighbors/plot_classification.html#sphx-glr-auto-examples-neighbors-plot-classification-py

源代码见:https://github.com/scikit-learn/scikit-learn/blob/a24c8b46/sklearn/neighbors/base.py#L751

之后附上全部代码:

  1. #coding:utf-8
  2. import numpy as np
  3. import operator
  4. from os import listdir
  5. from sklearn.neighbors import KNeighborsClassifier as KNN
  6.  
  7. def image_vector(filename):
  8. zeroVector = np.zeros((1,1024))
  9. f = open(filename)
  10. for i in range(32):
  11. listRead = f.readline()
  12. for j in range(32):
  13. zeroVector[0,32*i+j] = int(listRead[j])
  14. #zeroVector里面的[0,n]:0代表第0行,n代表第n列个数字(因为zeros可以有m行n列)
  15. return zeroVector
  16. #将32*32的矩阵转移到一个一维矩阵中
  17.  
  18. def KNN_Process():
  19. trainNameClass = []
  20. trainingFileList = listdir('trainingDigits')
  21. fileCount = len(trainingFileList)
  22. #返回目录下的训练文件个数
  23. trainMat = np.zeros((fileCount,1024),int)
  24. #创建fileCount行,1024列的二维矩阵(用来保存所有训练集)
  25. for i in range(fileCount):
  26. currentFileName = trainingFileList[i]
  27. #当前文件的文件名称
  28. trainNameNumber = int(trainingFileList[i].split('_')[0])
  29. #取名称的'-'前面的内容
  30. trainNameClass.append(trainNameNumber)
  31. #将数字append到数组中
  32. url = 'trainingDigits/' + currentFileName
  33. #print url
  34. trainMat[i,:] = image_vector(url)
  35. #将每个图片的1024个数据均存在trainMat中,构成一个大小为fileCount*1024的矩阵
  36. KnnContain = KNN(n_neighbors = 3, algorithm = 'auto')
  37. #创建knn模型容器
  38.  
  39. KnnContain.fit(trainMat,trainNameClass)
  40. #用fit函数将train的矩阵与label对应起来
  41.  
  42. testFileList = listdir('testDigits')
  43. #返回testDigits目录下的文件
  44. errorCount = 0.0
  45. #错误量
  46. testCount = len(testFileList)
  47. #test数据的个数
  48. for i in range(testCount):
  49. currentTestName = testFileList[i]
  50. #当前第i个test文件的名字
  51. testClassNumber = int(currentTestName.split('_')[0])
  52. #获取当前文件的对应数字
  53. testVector = image_vector('testDigits/%s' %(currentTestName))
  54. #将当前test的1024个数据存入testVector中
  55. KnnResult = KnnContain.predict(testVector)
  56. print "分类结果为:%d\t真实结果为:%d\t" % (KnnResult,testClassNumber)
  57. if KnnResult != testClassNumber:
  58. errorCount += 1.0
  59. print "本次model的成功率为: %",(float(testCount) - errorCount)/float(testCount)*100
  60.  
  61. if __name__ == '__main__':
  62.  
  63. KNN_Process()

还是老样子,我这里使用了python2.7.10的版本。

得到结果为

可以看到预测的成功率达到了98.7,说明效果还是很好的。

而这个sklearn里面的内容还是博大精深的,等我更深入学习后再把体会更新到这里。

在此感谢大神的blog,参考自http://blog.csdn.net/c406495762/article/details/75172850

机器学习--DIY笔记与感悟--①K-临近算法(2)的更多相关文章

  1. 机器学习--DIY笔记与感悟--①K-临近算法

    ##“计算机出身要紧跟潮流” 机器学习作为如今发展的趋势需要被我们所掌握.而今我也需要开始learn机器学习,并将之后的所作所想记录在此. 今天我开始第一课--K临近算法. 一.k-临近的基础概念理解 ...

  2. 机器学习--DIY笔记与感悟--②决策树(1)

    在完成了K临近之后,今天我们开始下一个算法--->决策树算法. 一.决策树基础知识 如果突然问你"有一个陌生人叫X,Ta今天需要带伞吗?", 你一定会觉得这个问题就像告诉你& ...

  3. 机器学习学习笔记之一:K最近邻算法(KNN)

    算法 假定数据有M个特征,则这些数据相当于在M维空间内的点 \[X = \begin{pmatrix} x_{11} & x_{12} & ... & x_{1M} \\ x_ ...

  4. 秒懂机器学习---k临近算法(KNN)

    秒懂机器学习---k临近算法(KNN) 一.总结 一句话总结: 弄懂原理,然后要运行实例,然后多解决问题,然后想出优化,分析优缺点,才算真的懂 1.KNN(K-Nearest Neighbor)算法的 ...

  5. 机器学习(Machine Learning)算法总结-K临近算法

    一.算法详解 1.什么是K临近算法 Cover 和 Hart在1968年提出了最初的临近算法 属于分类(classification)算法 邻近算法,或者说K最近邻(kNN,k-NearestNeig ...

  6. [Machine-Learning] K临近算法-简单例子

    k-临近算法 算法步骤 k 临近算法的伪代码,对位置类别属性的数据集中的每个点依次执行以下操作: 计算已知类别数据集中的每个点与当前点之间的距离: 按照距离递增次序排序: 选取与当前点距离最小的k个点 ...

  7. K临近算法

    K临近算法原理 K临近算法(K-Nearest Neighbor, KNN)是最简单的监督学习分类算法之一.(有之一吗?) 对于一个应用样本点,K临近算法寻找距它最近的k个训练样本点即K个Neares ...

  8. 机器学习实战笔记(Python实现)-01-K近邻算法(KNN)

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

  9. 机器学习简要笔记(三)-KNN算法

    #coding:utf-8 import numpy as np import operator def classify(intX,dataSet,labels,k): ''' KNN算法 ''' ...

随机推荐

  1. Intel Edision —— 上电、基本设置与系统初探

    前言 原创文章,转载引用务必注明链接.如有疏漏,欢迎斧正. Intel的文档其实挺清楚了,坛子上很多人把文档又详细复述一边,私以为一篇就够了其他的跟着文档走一遍也挺好的...俗一把使用过程顺手记录下来 ...

  2. react 创建组件 (一)createClass

    如果你还没有使用ES6语法,那么定义组件,只能使用React.createClass这个helper来创建组件,下面是一段示例: var React = require("react&quo ...

  3. 使用maven创建项目和cannot change version web module 3.0

    近期下载了最新的Eclipse mars.2, 这个eclipse自带了maven插件,于是就用maven尝试创建一个java web项目. 第一步,例如以下图所看到的选择 Maven Project ...

  4. 把握linux内核设计思想(五):下半部机制之工作队列及几种机制的选择

    [版权声明:尊重原创.转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途]         工作队列是下半部的第二种将工作推后运行形式.和软中断.task ...

  5. GTK入门学习:布局容器之水平布局

    假设我们希望窗体里多放加入几个控件,直接加入是不成功的.由于窗体仅仅能容纳一个控件的容器. 这时候.我们须要借助布局容器,我们先把布局容器加入到窗体里.然后再把所须要加入的控件放在布局容器里. 布局容 ...

  6. u-boot简单学习笔记(二)——AR9331 uboot.lds分析

    最开始系统上电后 从uboot.lds开始引导 OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", ...

  7. java线程阻塞(sleep,suspend,resume,yield,wait,notify)

    为了解决对共享存储区的访问冲突,Java 引入了同步机制,现在让我们来考察多个线程对共享资源的访问,显然同步机制已经不够了,因为在任意时刻所要求的资源不一定已经准备好了被访问,反过来,同一时刻准备好了 ...

  8. Scaling with Microservices and Vertical Decomposition

    Scaling with Microservices and Vertical Decomposition – dev.otto.de https://dev.otto.de/2014/07/29/s ...

  9. C# List Find方法

    https://blog.csdn.net/knqiufan/article/details/77847143

  10. RabbitMQ使用简述

    RabbitMQ基于AMQP协议. AMQP:是一个高级抽象层消息通信协议,RabbitMQ是AMQP协议的实现 RabbitMQ使用:Exchange(交换机)根据routing-key(路由选择键 ...