>

机器学习

- 编辑:正版管家婆马报彩图 -

机器学习

knn算法,knn

K近期邻(k-Nearest Neighbor,KNN)分类算法可以说是最简便易行的机械学习算法了。它利开销量差异特征值之间的相距方法进行分类。它的企图很简短:若是二个样书在特色空间中的k个最相似(即特征空间中最贴近)的样书中的大大多属于某多个档期的顺序,则该样本也属于那些类型。

其算法描述如下:

1)总结已知连串数据聚焦的点与当前点时期的偏离;

2)依照距离递增次序排序;

3)选用与当下点离开最小的k个点;

4)分明前k个点所在类其他现身频率;

5)重返前k个点出现频率最高的花色作为当前点的展望分类。

对于机器学习而已,Python要求十二分安装三件宝,分别是Numpy,scipy和Matplotlib。前双方用于数值计算,前面一个用于画图。安装很简短,直接到各自的官方网站下载回来安装就可以。安装程序会自行检索大家的python版本和目录,然后安装到python辅助的寻觅路线下。反正就python和这两个插件都默许安装就没难题了。

相似完结一个算法后,大家要求先用叁个异常的小的数据库来测验它的正确性,不然一下子给个大数额给它,它也很难消化吸取,并且还不便于大家深入分析代码的灵光。

      首先,我们新建三个kNN.py脚本文件,文件之中含有五个函数,二个用来生成小数据库,一个贯彻kNN分类算法。代码如下:

from numpy import *
def createDataSet():#创建一个很小的数据库
    group=array([[1.0,0.9],[1.0,1.0],[0.1,0.2],[0.0,0.1]])
    labels=['A','A','B','B']
    return group,labels
#[1.2,1.0]
def kNNClassify(newInput,dataset,labels,k):#knn算法核心
    #先求数据库中每个点到所求点之间的距离
    numSamples=dataset.shape[0] #获取数据库的行数
    diff=tile(newInput,(numSamples,1))-dataset#使用tile函数迭代创建一个numSample行1列的array与dataset做差
    squaredDiff=diff**2#diff中的每一个数都平方
    squaredDist=sum(squaredDiff,axis=1)#每一行两数求和
    distance=squaredDist**0.5#在开方
    #再对距离进行排序
    sortedDistIndices=argsort(distance)
    classCount={}
    #统计距离为k的每个点的类别
    for i in xrange(k):
        for j in xrange(4):
            if sortedDistIndices[j]==i:
                 voteLabel=labels[j]
                 classCount[voteLabel]=classCount.get(voteLabel,0)+1
    maxCount=0              
    #找出离所求点最近的k个点中最多的类别         
    for key,value in classCount.items():
        if maxCount<value:
            maxCount=value
            maxIndex=key
    #返回所求点的类型,算法到此结束
    return maxIndex

  然后大家在指令行中或在建一个python文件那样测验就能够:

import kNN
from numpy import *

dataSet,labels=kNN.createDataSet()
testX=array([0,0.05])
k=3
maxIndex=kNN.kNNClassify(testX,dataSet,labels,3)
print maxIndex

  运转程序:此时点[0,0.05]最接近B类。

 应用:

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""
from numpy import *
import os
def kNNClassify(newInput,dataset,labels,k):#knn算法核心
    #先求数据库中每个点到所求点之间的距离
    numSamples=dataset.shape[0] #获取数据库的行数
    diff=tile(newInput,(numSamples,1))-dataset#使用tile函数迭代创建一个numSample行1列的array与dataset做差
    squaredDiff=diff**2#diff中的每一个数都平方
    squaredDist=sum(squaredDiff,axis=1)#每一行的数求和
    distance=squaredDist**0.5#在开方
    #再对距离进行排序
    sortedDistIndices=argsort(distance)
    classCount={}
    #统计距离为k的每个点的类别
    for i in xrange(k):
        for j in xrange(numSamples):
            if sortedDistIndices[j]==i:
                 voteLabel=labels[j]
                 classCount[voteLabel]=classCount.get(voteLabel,0)+1
    maxCount=0              
    #找出离所求点最近的k个点中最多的类别         
    for key,value in classCount.items():
        if maxCount<value:
            maxCount=value
            maxIndex=key
    #返回所求点的类型,算法到此结束
    return maxIndex

def img2vector(filename):
    rows=32
    cols=32
    imgVector=zeros((1,rows*cols))
    fileIn=open(filename)
    for row in xrange(rows):
        lineStr=fileIn.readline()
        for col in xrange(cols):
            imgVector[0,row*32+col]=int(lineStr[col])
    return imgVector

def loadDataSet():
    dataSetDir='C:/knn/'
    trainingFileList=os.listdir(dataSetDir+'trainingDigits')
    numSamples=len(trainingFileList)
    train_x=zeros((numSamples,1024))
    train_y=[]
    for i in xrange(numSamples):
        filename=trainingFileList[i]
        train_x[i,:]=img2vector(dataSetDir+'trainingDigits/%s'%filename)
        label=int(filename.split('_')[0])
        train_y.append(label)
    testingFileList=os.listdir(dataSetDir+'testDigits')
    numSamples=len(testingFileList)
    test_x=zeros((numSamples,1024))
    test_y=[]
    for i in xrange(numSamples):
        filename=testingFileList[i]
        test_x[i,:]=img2vector(dataSetDir+'testDigits/%s'%filename)
        label=int(filename.split('_')[0])
        test_y.append(label)
    return train_x,train_y,test_x,test_y

def testHandWritingClass():
    print "第一步:加载数据。。。"
    train_x,train_y,test_x,test_y=loadDataSet()

    numTestSamples=test_x.shape[0]
    print "数据加载完成"
    matchCount=0
    for i in xrange(numTestSamples):
        print i
        predict=kNNClassify(test_x[i],train_x,train_y,9)
        if predict==test_y[i]:
            matchCount+=1
    accuracy=float(matchCount)/numTestSamples

    print "accuracy is:%.2f%%"%(accuracy*100)

  未完待续。。。

K近日邻(k-Nearest Neighbor,KNN)分类算法能够说是最简便易行的机器学习算法了。它应用衡量差异特征值之间的偏离方法开展分拣。...

K近来邻(k-Nearest Neighbor,KNN)分类算法能够说是最简便易行的机器学习算法了。它采用衡量分化特征值之间的偏离方法开展分类。它的思索很轻易:假设一个样书在特色空间中的k个最相似(即特征空间中最贴近)的样书中的大许多属于某三个等级次序,则该样本也属于这么些体系。

其算法描述如下:

1)计算已知连串数据汇总的点与当前点时期的离开;

2)依据距离递增次序排序;

3)选拔与当下点离开最小的k个点;

4)显著前k个点所在类其他出现频率;

5)重临前k个点出现频率最高的品种作为当下点的展望分类。

对此机械学习而已,Python要求非常安装三件宝,分别是Numpy,scipy和Matplotlib。前两个用于数值总计,后面一个用于画图。安装很轻易,直接到个别的官方网址下载回来安装就能够。安装程序会活动找寻大家的python版本和目录,然后安装到python帮助的检索路线下。反正就python和那三个插件都私下认可安装就没难题了。

诚如完毕四个算法后,大家须求先用贰个极小的数据库来测量试验它的正确,否则一下子给个大数目给它,它也很难消化吸取,并且还不方便人民群众我们深入分析代码的灵光。

 

补充用python实现的代码,要给python装numpy和matplotlib库,建议间接装anaconda,装好了anaconda暗中认可安装了spyder,里面集成了那多少个库,相比便于。

率先,大家新建一个kNN.py脚本文件,文件之中包括五个函数,三个用来生成小数据库,三个落到实处kNN分类算法。代码如下:

# -*- coding: utf-8 -*-
from numpy import *
def createDataSet():#创建一个很小的数据库
    group=array([[1.0,0.9],[1.0,1.0],[0.1,0.2],[0.0,0.1]])
    labels=['A','A','B','B']
    return group,labels
#[1.2,1.0]
def kNNClassify(newInput,dataset,labels,k):#knn算法核心
    #先求数据库中每个点到所求点之间的距离
    numSamples=dataset.shape[0] #获取数据库的行数
    diff=tile(newInput,(numSamples,1))-dataset#使用tile函数迭代创建一个numSample行1列的array与dataset做差
    squaredDiff=diff**2#diff中的每一个数都平方
    squaredDist=sum(squaredDiff,axis=1)#每一行两数求和
    distance=squaredDist**0.5#再开方
    #再对距离进行排序
    sortedDistIndices=argsort(distance)#argsort函数对distance中元素从小到大排序,返回序号
    classCount={}
    #统计距离小于等于k的每个点的类别
    for i in xrange(k):
       voteLabel=labels[sortedDistIndices[i]]
       classCount[voteLabel]=classCount.get(voteLabel,0)+1
    maxCount=0              
    #找出离所求点最近的k个点中最多的类别         
    for key,value in classCount.items():
        if maxCount<value:
            maxCount=value
            maxIndex=key
    #返回所求点的类型,算法到此结束
    return maxIndex

  然后大家在指令行中或在建二个python文件那样测量检验就可以:

import kNN
from numpy import *

dataSet,labels=kNN.createDataSet()
testX=array([0,0.05])
k=3
maxIndex=kNN.kNNClassify(testX,dataSet,labels,3)
print maxIndex

  运行程序:此时点[0,0.05]最接近B类。

 应用:这里大家用kNN来分类二个大点的数据库,包涵数据维度十分大和样本数比相当多的数据库。这里大家用到一个手写数字的数据库,能够到这里下载。这几个数据库包含数字0-9的手写体。每种数字差相当少有200个样本。种种样本保持在三个txt文件中。手写体图像自身的大大小小是32x32的二值图,转变来txt文件保留后,内容也是32x叁11个数字,0也许1.

数据库解压后有八个目录:目录trainingDigits存放的是大概贰仟个教练多少,testDigits存放大致900个测量检验数据。

编写kNN2.py:

 

# -*- coding: utf-8 -*-
from numpy import *
import os
def kNNClassify(newInput,dataset,labels,k):#knn算法核心
    #先求数据库中每个图像与所要分类图像像素值差的平方再开方,用这种计算方法表示距离(相似度)俗称欧氏距离
    numSamples=dataset.shape[0] #获取数据库的行数(即文件夹下的文件数)
    diff=tile(newInput,(numSamples,1))-dataset#使用tile函数迭代创建一个numSample行1列的array与dataset做差
    squaredDiff=diff**2#diff中的每一个数都平方
    squaredDist=sum(squaredDiff,axis=1)#每一行的数求和
    distance=squaredDist**0.5#再开方
    #再对距离进行排序
    sortedDistIndices=argsort(distance)
    classCount={}
    #统计距离为k的每个图像的类别(即统计相似度最小的k个图像所表示的数字)
    for i in xrange(k):  
        voteLabel = labels[sortedDistIndices[i]]  
        classCount[voteLabel] = classCount.get(voteLabel, 0) + 1

    maxCount=0            
    #找出离所求图像类别最近的k个图像中最多的类别       
    for key,value in classCount.items():
        if maxCount<value:
            maxCount=value
            maxIndex=key
    #返回所求图像的类型(类型即数字)
    return maxIndex

#函数img2vector把一张32*32的图像转化成一行向量imgVector
def img2vector(filename):
    rows=32
    cols=32
    imgVector=zeros((1,rows*cols))
    fileIn=open(filename)
    for row in xrange(rows):
        lineStr=fileIn.readline()
        for col in xrange(cols):
            imgVector[0,row*32+col]=int(lineStr[col])
    return imgVector

#函数loadDataSet从文件夹中加载多个文件数据,python对文件数据流加载到内存的操作很方便,这里的代码可以仔细理解加记忆一下
def loadDataSet():
    dataSetDir='/home/chao/Desktop/python_work/knn/'
    trainingFileList=os.listdir(dataSetDir+'trainingDigits')
    numSamples=len(trainingFileList)
    train_x=zeros((numSamples,1024))#使用zeros函数为train_x分配numSamples行,每行1024列,每行为一个图像转化后的数据,总共numSamples行
    train_y=[]#用来存放每个图像的真实值
    for i in xrange(numSamples):
        filename=trainingFileList[i]
        train_x[i,:]=img2vector(dataSetDir+'trainingDigits/%s'%filename)
        label=int(filename.split('_')[0])
        train_y.append(label)
    testingFileList=os.listdir(dataSetDir+'testDigits')
    numSamples=len(testingFileList)
    test_x=zeros((numSamples,1024))#同train_x,但这里表示的是测试图像文件的
    test_y=[]
    for i in xrange(numSamples):
        filename=testingFileList[i]
        test_x[i,:]=img2vector(dataSetDir+'testDigits/%s'%filename)
        label=int(filename.split('_')[0])
        test_y.append(label)
    return train_x,train_y,test_x,test_y

#测试预测准确率
def testHandWritingClass():
    print "第一步:加载数据。。。"
    train_x,train_y,test_x,test_y=loadDataSet()

    numTestSamples=test_x.shape[0]#返回待测试图像的个数
    print "数据加载完成"
    matchCount=0#用来表示预测正确的图像的个数
    #每个待测图像都要调用一次knn预测其值
    for i in xrange(numTestSamples):
        print i
        predict=kNNClassify(test_x[i],train_x,train_y,3)#这里k=3准确率达98.63%,如果改成k=1的话会达到98.97%
        if predict==test_y[i]:
            matchCount+=1
    accuracy=float(matchCount)/numTestSamples
    print matchCount#打印正确预测个数
    print "accuracy is:%.2f%%"%(accuracy*100)#打印正确预测准确率

 

测验特别轻易,编写贰个main.py:

# -*- coding: utf-8 -*-
import kNN2
kNN2.testHandWritingClass()

下一场运维main.py观看准确率:

933个预测正确
accuracy is:98.63%

 版权申明:原来的作品地址

本文由编程应用发布,转载请注明来源:机器学习