zoukankan      html  css  js  c++  java
  • 机器学习--DIY笔记与感悟--①K-临近算法(2)

    上一篇博客我手动写了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文件:

    print(__doc__)
    
    # Author: Nelle Varoquaux <nelle.varoquaux@gmail.com>
    #         Alexandre Gramfort <alexandre.gramfort@inria.fr>
    # Licence: BSD
    
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.collections import LineCollection
    
    from sklearn.linear_model import LinearRegression
    from sklearn.isotonic import IsotonicRegression
    from sklearn.utils import check_random_state
    
    n = 100
    x = np.arange(n)
    rs = check_random_state(0)
    y = rs.randint(-50, 50, size=(n,)) + 50. * np.log(1 + np.arange(n))
    
    ###############################################################################
    # Fit IsotonicRegression and LinearRegression models
    
    ir = IsotonicRegression()
    
    y_ = ir.fit_transform(x, y)
    
    lr = LinearRegression()
    lr.fit(x[:, np.newaxis], y)  # x needs to be 2d for LinearRegression
    
    ###############################################################################
    # plot result
    
    segments = [[[i, y[i]], [i, y_[i]]] for i in range(n)]
    lc = LineCollection(segments, zorder=0)
    lc.set_array(np.ones(len(y)))
    lc.set_linewidths(0.5 * np.ones(n))
    
    fig = plt.figure()
    plt.plot(x, y, 'r.', markersize=12)
    plt.plot(x, y_, 'g.-', markersize=12)
    plt.plot(x, lr.predict(x[:, np.newaxis]), 'b-')
    plt.gca().add_collection(lc)
    plt.legend(('Data', 'Isotonic Fit', 'Linear Fit'), loc='lower right')
    plt.title('Isotonic regression')
    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矩阵进行处理,将其放入一个一维矩阵中。

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

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

    def KNN_Process():
        trainNameClass = []
        trainingFileList = listdir('trainingDigits')
        fileCount = len(trainingFileList)
    #返回目录下的训练文件个数
        trainMat = np.zeros((fileCount,1024),int)
    #创建fileCount行,1024列的二维矩阵(用来保存所有训练集)
        for i in range(fileCount):
            currentFileName = trainingFileList[i]     
    #当前文件的文件名称
            trainNameNumber = int(trainingFileList[i].split('_')[0])
    #取名称的'-'前面的内容
            trainNameClass.append(trainNameNumber) 
    #将数字append到数组中
            url = 'trainingDigits/' + currentFileName 
            #print url
            trainMat[i,:] = image_vector(url)
    #将每个图片的1024个数据均存在trainMat中,构成一个大小为fileCount*1024的矩阵
        KnnContain = KNN(n_neighbors = 3, algorithm = 'auto')
    #创建knn模型容器
    
        KnnContain.fit(trainMat,trainNameClass)
    #用fit函数将train的矩阵与label对应起来
        
        testFileList = listdir('testDigits')
    #返回testDigits目录下的文件
        errorCount = 0.0
    #错误量
        testCount = len(testFileList)
    #test数据的个数
        for i in range(testCount):
            currentTestName = testFileList[i]
    #当前第i个test文件的名字
            testClassNumber = int(currentTestName.split('_')[0])
    #获取当前文件的对应数字
            testVector = image_vector('testDigits/%s' %(currentTestName))
    #将当前test的1024个数据存入testVector中
            KnnResult = KnnContain.predict(testVector)
            print "分类结果为:%d	真实结果为:%d	" % (KnnResult,testClassNumber)
            if KnnResult != testClassNumber:
                errorCount += 1.0
        print "本次model的成功率为: %",(float(testCount) - errorCount)/float(testCount)*100

    这里是利用了

    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

    之后附上全部代码:

    #coding:utf-8
    import numpy as np
    import operator
    from os import listdir
    from sklearn.neighbors import KNeighborsClassifier as KNN
    
    def image_vector(filename):
        zeroVector = np.zeros((1,1024))
        f = open(filename)
        for i in range(32):
            listRead = f.readline()
            for j in range(32):
                zeroVector[0,32*i+j] = int(listRead[j])
    #zeroVector里面的[0,n]:0代表第0行,n代表第n列个数字(因为zeros可以有m行n列)
        return zeroVector
    #将32*32的矩阵转移到一个一维矩阵中
    
    def KNN_Process():
        trainNameClass = []
        trainingFileList = listdir('trainingDigits')
        fileCount = len(trainingFileList)
    #返回目录下的训练文件个数
        trainMat = np.zeros((fileCount,1024),int)
    #创建fileCount行,1024列的二维矩阵(用来保存所有训练集)
        for i in range(fileCount):
            currentFileName = trainingFileList[i]     
    #当前文件的文件名称
            trainNameNumber = int(trainingFileList[i].split('_')[0])
    #取名称的'-'前面的内容
            trainNameClass.append(trainNameNumber) 
    #将数字append到数组中
            url = 'trainingDigits/' + currentFileName 
            #print url
            trainMat[i,:] = image_vector(url)
    #将每个图片的1024个数据均存在trainMat中,构成一个大小为fileCount*1024的矩阵
        KnnContain = KNN(n_neighbors = 3, algorithm = 'auto')
    #创建knn模型容器
    
        KnnContain.fit(trainMat,trainNameClass)
    #用fit函数将train的矩阵与label对应起来
        
        testFileList = listdir('testDigits')
    #返回testDigits目录下的文件
        errorCount = 0.0
    #错误量
        testCount = len(testFileList)
    #test数据的个数
        for i in range(testCount):
            currentTestName = testFileList[i]
    #当前第i个test文件的名字
            testClassNumber = int(currentTestName.split('_')[0])
    #获取当前文件的对应数字
            testVector = image_vector('testDigits/%s' %(currentTestName))
    #将当前test的1024个数据存入testVector中
            KnnResult = KnnContain.predict(testVector)
            print "分类结果为:%d	真实结果为:%d	" % (KnnResult,testClassNumber)
            if KnnResult != testClassNumber:
                errorCount += 1.0
        print "本次model的成功率为: %",(float(testCount) - errorCount)/float(testCount)*100
    
    if __name__ == '__main__':
        
        KNN_Process()

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

    得到结果为

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

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

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

  • 相关阅读:
    一文搞懂Raft算法
    设计数据密集型应用第三部分:派生数据
    对一次架构设计的总结和反思
    One take,可望而不可即
    设计数据密集型应用第二部分:分布式系统的机遇与挑战
    [代码重构]简化函数调用
    [代码重构]简化函数调用
    [Vue专题] 对比vue-cli2.x和vue-cli3.x的搭建
    npm ERR! code ENOLOCAL
    Jenkins配置基于角色的项目权限管理
  • 原文地址:https://www.cnblogs.com/Pinging/p/8496926.html
Copyright © 2011-2022 走看看