KNN算法的简单实现

一  算法原理:已知一个训练样本集,其中每个训练样本都有自己的标记(label),即我们知道样本集中每一个样本数据与所属分类的对应关系。输入没有标记的新数据后,将新数据的每个特征与样本集中的数据对应的特征进行比较,然后提取样本集中特征最相似数据的分类标记。一般的,我们选择样本集中前k个最相似的数据分类标签,其中出现次数最多的分类作为我们新数据的分类标记。简单的说,k_近邻算法采用测量不同特征值之间的距离方法进行分类。

算法优点: 精度高、对异常值不敏感,无数据输入假设。

算法缺点: 由于要将每个待分类的数据特征与样本集中的每个样例进行对应特征距离的计算,所以计算的时间空间复杂度高。

二  算法的实现(手写体识别)

1.数据准备:采用的是32*32像素的黑白图像(0-9,每个数字大约200个样本,trainingDigits用于数据分类器训练,testDigits用于测试),这里为了方便理解,将图片转换成了文本格式。

2.代码实现:

将图片转化为一个向量,我们把一个32*32的二进制图像矩阵转化为一个1*1024的向量,编写一个函数vector2d,如下代码

  1 def vector2d(filename):
  2     rows = 32
  3     cols = 32
  4     imgVector = zeros((1,rows * cols))
  5     fileIn = open(filename)
  6     for row in xrange(rows):
  7         lineStr = fileIn.readline()
  8         for col in xrange(cols):
  9             imgVector[0,row *32 + col] = int(lineStr[col])
 10     return imgVector
 11 

trainingData set 和testData set 的载入

  1 ‘‘‘load dataSet ‘‘‘
  2 def loadDataSet():
  3     print ‘....Getting training data‘
  4     dataSetDir =  ‘D:/pythonCode/MLCode/KNN/‘
  5     trainingFileList = os.listdir(dataSetDir + ‘trainingDigits‘)
  6     numSamples = len(trainingFileList)
  7
  8     train_x = zeros((numSamples,1024))
  9     train_y = []
 10     for i  in xrange(numSamples):
 11         filename = trainingFileList[i]
 12         train_x[i,:] = vector2d(dataSetDir + ‘trainingDigits/%s‘%filename)
 13         label = int(filename.split(‘_‘)[0])
 14         train_y.append(label)
 15     ‘‘‘ ....Getting testing data...‘‘‘
 16     print ‘....Getting testing data...‘
 17     testFileList = os .listdir(dataSetDir + ‘testDigits‘)
 18     numSamples = len(testFileList)
 19     test_x = zeros((numSamples,1024))
 20     test_y = []
 21     for i in xrange(numSamples):
 22         filename = testFileList[i]
 23         test_x[i,:] = vector2d(dataSetDir + ‘testDigits/%s‘%filename)
 24         label = int(filename.split(‘_‘)[0])
 25         test_y.append(label)
 26
 27     return train_x,train_y,test_x,test_y

分类器的构造

  1 from numpy import *
  2
  3 import os
  4
  5 def kNNClassify(newInput,dataSet,labels,k):
  6     numSamples = dataSet.shape[0]
  7
  8     diff = tile(newInput,(numSamples,1)) - dataSet
  9     squaredDiff = diff ** 2
 10     squaredDist = sum(squaredDiff,axis = 1)
 11     distance = squaredDist ** 0.5
 12
 13     sortedDistIndex = argsort(distance)
 14
 15     classCount =  {}
 16     for i in xrange(k):
 17         votedLabel = labels[sortedDistIndex[i]]
 18         classCount[votedLabel] = classCount.get(votedLabel,0) + 1
 19
 20     maxValue = 0
 21     for key,value in classCount.items():
 22         if maxValue < value:
 23             maxValue = value
 24             maxIndex = key

分类测试

  1 def testHandWritingClass():
  2     print ‘load data....‘
  3     train_x,train_y,test_x,test_y = loadDataSet()
  4     print‘training....‘
  5
  6     print‘testing‘
  7     numTestSamples = test_x.shape[0]
  8     matchCount = 0.0
  9     for i in xrange(numTestSamples):
 10         predict = kNNClassify(test_x[i],train_x,train_y,3)
 11         if predict != test_y[i]:
 12
 13             print ‘the predict is ‘,predict,‘the target value is‘,test_y[i]
 14
 15         if predict == test_y[i]:
 16             matchCount += 1
 17     accuracy = float(matchCount)/numTestSamples
 18
 19     print‘The accuracy is :%.2f%%‘%(accuracy * 100)

测试结果

  1 testHandWritingClass()
  2 load data....
  3 ....Getting training data
  4 ....Getting testing data...
  5 training....
  6 testing
  7 the predict is  7 the target value is 1
  8 the predict is  9 the target value is 3
  9 the predict is  9 the target value is 3
 10 the predict is  3 the target value is 5
 11 the predict is  6 the target value is 5
 12 the predict is  6 the target value is 8
 13 the predict is  3 the target value is 8
 14 the predict is  1 the target value is 8
 15 the predict is  1 the target value is 8
 16 the predict is  1 the target value is 9
 17 the predict is  7 the target value is 9
 18 The accuracy is :98.84%

注:以上代码运行环境为Python2.7.11

从上面结果可以看出knn 分类效果还不错,在我看来,knn就是简单粗暴,就是把未知分类的数据特征与我们分类好的数据特征进行比对,选择最相似的标记作为自己的分类,辣么问题来了,如果我们的新数据的特征在样本集中比较少见,这时候就会出现问题,分类错误的可能性非常大,反之,如果样例集中某一类的样例比较多,那么新数据被分成该类的可能性就会大,如何保证分类的公平性,我们就需要进行加权了。

数据来源:http://download.csdn.net/download/qq_17046229/7625323

时间: 2024-10-22 14:53:50

KNN算法的简单实现的相关文章

机器学习之二:K-近邻(KNN)算法

一.概述 K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.KNN算法中,所选择的邻居都是已经正确分类的对象.该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别. KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关.由于KNN方法主要靠周

机器学习实战ByMatlab(一)KNN算法

KNN 算法其实简单的说就是"物以类聚",也就是将新的没有被分类的点分类为周围的点中大多数属于的类.它采用测量不同特征值之间的距离方法进行分类,思想很简单:如果一个样本的特征空间中最为临近(欧式距离进行判断)的K个点大都属于某一个类,那么该样本就属于这个类.这就是物以类聚的思想. 当然,实际中,不同的K取值会影响到分类效果,并且在K个临近点的选择中,都不加意外的认为这K个点都是已经分类好的了,否则该算法也就失去了物以类聚的意义了. KNN算法的不足点: 1.当样本不平衡时,比如一个类的

深入浅出KNN算法(一) 介绍篇

一.KNN算法概述 KNN可以说是最简单的分类算法之一,同时,它也是最常用的分类算法之一,注意KNN算法是有监督学习中的分类算法,它看起来和另一个机器学习算法Kmeans有点像(Kmeans是无监督学习算法),但却是有本质区别的.那么什么是KNN算法呢,接下来我们就来介绍介绍吧. 二.KNN算法介绍 KNN的全称是K Nearest Neighbors,意思是K个最近的邻居,从这个名字我们就能看出一些KNN算法的蛛丝马迹了.K个最近邻居,毫无疑问,K的取值肯定是至关重要的.那么最近的邻居又是怎么

kNN算法python实现和简单数字识别

kNN算法 算法优缺点: 优点:精度高.对异常值不敏感.无输入数据假定 缺点:时间复杂度和空间复杂度都很高 适用数据范围:数值型和标称型 算法的思路: KNN算法(全称K最近邻算法),算法的思想很简单,简单的说就是物以类聚,也就是说我们从一堆已知的训练集中找出k个与目标最靠近的,然后看他们中最多的分类是哪个,就以这个为依据分类. 函数解析: 库函数 tile() 如tile(A,n)就是将A重复n次 a = np.array([0, 1, 2]) np.tile(a, 2) array([0,

KNN 算法,以及与Kmeans的简单对比

KNN与Kmeans感觉没啥联系,但是名字挺像的,就拿来一起总结一下吧. 初学者的总结. KNN是监督学习,Kmeans是无监督学习. KNN用于分类,Kmeans用于聚类. 先说KNN: 对于KNN,有一批已经标注好label的训练样本,将这批样本的数据转换为向量表示,然后选择度量向量距离的方式.例如 欧式距离,曼哈顿距离,夹脚余弦等.对于这批样本记为W. 然后来一个待分类的样本S,选取W中距离样本S距离最近的K个样本.这K个样本中哪种类别的样本多,则该样本S的分类就是哪种. KNN的优缺点:

Machine Learning In Action 第二章学习笔记: kNN算法

本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数字识别 通过“约会对象”功能,基本能够了解到kNN算法的工作原理.“手写数字识别”与“约会对象预测”使用完全一样的算法代码,仅仅是数据集有变化. 约会对象预测 1 约会对象预测功能需求 主人公“张三”喜欢结交新朋友.“系统A”上面注册了很多类似于“张三”的用户,大家都想结交心朋友.“张三”最开始通过自己筛选的

KNN算法--物以类聚,人以群分

KNN(K Nearest Neighbors,K近邻 )算法是机器学习所有算法中理论最简单,最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值之间的距离,然后选取K(K>=1)个距离最近的邻居进行分类判断(投票法)或者回归.如果K=1,那么新数据被简单分配给其近邻的类.KNN算法算是监督学习还是无监督学习呢?首先来看一下监督学习和无监督学习的定义.对于监督学习,数据都有明确的label(分类针对离散分布,回归针对连续分布),根据机器学习产生的模型可以将新数据分到一个明确的类

Python KNN算法

机器学习新手,接触的是<机器学习实战>这本书,感觉书中描述简单易懂,但对于python语言不熟悉的我,也有很大的空间.今天学习的是k-近邻算法. 1. 简述机器学习 在日常生活中,人们很难直接从原始数据本身获得所需信息.而机器学习就是把生活中无序的数据转换成有用的信息.例如,对于垃圾邮件的检测,侦测一个单词是否存在并没有多大的作用,然而当某几个特定单词同时出现时,再辅以考虑邮件的长度及其他因素,人们就可以更准确地判定该邮件是否为垃圾邮件. 机器学习分为监督学习和无监督学习,其中: (1)监督学

Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资料都可以查到,简单来说,就是将图像分成一个cell,通过对每个cell的像素进行梯度处理,进而根据梯度方向和梯度幅度来得到cell的图像特征.随后,将每个cell的图像特征连接起来,得到一个BLock的特征,进而得到一张图片的特征.Opencv当中自带HOG算法,可以直接调用,进行图像的特征提取.但