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

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

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

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

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

2.代码实现:

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

 def vector2d(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

trainingData set 和testData set 的载入

 '''load dataSet '''
def loadDataSet():
print '....Getting training data'
dataSetDir = 'D:/pythonCode/MLCode/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,:] = vector2d(dataSetDir + 'trainingDigits/%s'%filename)
label = int(filename.split('_')[0])
train_y.append(label)
''' ....Getting testing data...'''
print '....Getting testing data...'
testFileList = os .listdir(dataSetDir + 'testDigits')
numSamples = len(testFileList)
test_x = zeros((numSamples,1024))
test_y = []
for i in xrange(numSamples):
filename = testFileList[i]
test_x[i,:] = vector2d(dataSetDir + 'testDigits/%s'%filename)
label = int(filename.split('_')[0])
test_y.append(label) return train_x,train_y,test_x,test_y

分类器的构造

 from numpy import *

 import os

 def kNNClassify(newInput,dataSet,labels,k):
numSamples = dataSet.shape[0] diff = tile(newInput,(numSamples,1)) - dataSet
squaredDiff = diff ** 2
squaredDist = sum(squaredDiff,axis = 1)
distance = squaredDist ** 0.5 sortedDistIndex = argsort(distance) classCount = {}
for i in xrange(k):
votedLabel = labels[sortedDistIndex[i]]
classCount[votedLabel] = classCount.get(votedLabel,0) + 1 maxValue = 0
for key,value in classCount.items():
if maxValue < value:
maxValue = value
maxIndex = key

分类测试

 def testHandWritingClass():
print 'load data....'
train_x,train_y,test_x,test_y = loadDataSet()
print'training....' print'testing'
numTestSamples = test_x.shape[0]
matchCount = 0.0
for i in xrange(numTestSamples):
predict = kNNClassify(test_x[i],train_x,train_y,3)
if predict != test_y[i]: print 'the predict is ',predict,'the target value is',test_y[i] if predict == test_y[i]:
matchCount += 1
accuracy = float(matchCount)/numTestSamples print'The accuracy is :%.2f%%'%(accuracy * 100)

测试结果

 testHandWritingClass()
load data....
....Getting training data
....Getting testing data...
training....
testing
the predict is 7 the target value is 1
the predict is 9 the target value is 3
the predict is 9 the target value is 3
the predict is 3 the target value is 5
the predict is 6 the target value is 5
the predict is 6 the target value is 8
the predict is 3 the target value is 8
the predict is 1 the target value is 8
the predict is 1 the target value is 8
the predict is 1 the target value is 9
the predict is 7 the target value is 9
The accuracy is :98.84%

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

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

补充:关于K值的选取,当k越小时,分类结果对原数据的敏感性越强,易受到异常数据的影响,即模型越复杂。

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

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

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

    一.概述 K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中 ...

  2. 深入浅出KNN算法(一) KNN算法原理

    一.KNN算法概述 KNN可以说是最简单的分类算法之一,同时,它也是最常用的分类算法之一,注意KNN算法是有监督学习中的分类算法,它看起来和另一个机器学习算法Kmeans有点像(Kmeans是无监督学 ...

  3. JavaScript机器学习之KNN算法

    译者按: 机器学习原来很简单啊,不妨动手试试! 原文: Machine Learning with JavaScript : Part 2 译者: Fundebug 为了保证可读性,本文采用意译而非直 ...

  4. 【笔记】初探KNN算法(1)

    KNN算法(1) 全称是K Nearest Neighbors k近邻算法: 思想简单 需要的数学知识很少 效果不错 可以解释机器学习算法使用过程中的很多细节问题 更加完整的刻画机器学习应用的流程 其 ...

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

    kNN算法 算法优缺点: 优点:精度高.对异常值不敏感.无输入数据假定 缺点:时间复杂度和空间复杂度都很高 适用数据范围:数值型和标称型 算法的思路: KNN算法(全称K最近邻算法),算法的思想很简单 ...

  6. KNN算法简单应用

    这里是写给小白看的,大牛路过勿喷. 1 KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集 ...

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

    KNN与Kmeans感觉没啥联系,但是名字挺像的,就拿来一起总结一下吧. 初学者的总结. KNN是监督学习,Kmeans是无监督学习. KNN用于分类,Kmeans用于聚类. 先说KNN: 对于KNN ...

  8. Python简单实现KNN算法

    __author__ = '糖衣豆豆' from numpy import * from os import listdir import operator #从列方向扩展 #tile(a,(size ...

  9. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

随机推荐

  1. &amp; replace &

    var decoded = encoded.replace(/&/g,'&'); http://stackoverflow.com/questions/3700326/decode-a ...

  2. std::string::npos mean

    std::string::npos 表示 no position, 没位置, 没找到

  3. TCP和HTTP的关系

    TCP和HTTP的关系 首先简单地看看tcp,TCP连接是通过4个值来识别的: <源IP地址 源端口号 目的IP地址 目的端口号> 这四个值定义了一个TCP连接,两条不同的TCP连接中这四 ...

  4. JDK源码分析之集合02ArrayList

    一.前言 有了前一篇对集合类的概述,我们知道ArrayList是属于Collection类系中的一个具体实现类,其特点是长度可以动态改变,集合内部使用数组保存元素.下面我们对源码进行分析. 二.Arr ...

  5. 检测zookeeper和kafka是否正常

    cd $(dirname $) source ~/.bash_profile count_zoo=`ps -ef | grep "config/zookeeper.properties&qu ...

  6. java基础回顾(四)——锁机制

    关键字Synchronized 1.对于同步的方法或者代码块来说,必须获得对象锁才能够进入同步方法或者代码块进行操作: 2.如果采用method级别的同步,则对象锁即为method所在的实例对象,如果 ...

  7. Duilib扩展《01》— 双击、右键消息扩展

    用过duilib的可能会发现,duilib中有些控件没能很好的区分左键.右键等消息.所以根据实际需要,我们需要进行相关区分处理,或者自行扩展. 一. 左键.右键消息区分 我们以CListUI控件来分析 ...

  8. openldap安装配置

    http://www.jslink.org/linux/openldap-ssl-sssd.html http://www.unix-power.net/centos7/openldap.html h ...

  9. WWF3的持续化<第五篇>

    WWF提供的持续化功能会自动记录工作流实例以及它包含的所有活动的执行状态,这些状态并不是指工作流上流转的表单所呈现的业务逻辑状态.WWF持续化功能就是将未执行完成的工作流实例以及该实例中各种活动的状态 ...

  10. curl返回常见错误码

    转自:http://blog.csdn.net/cwj649956781/article/details/8086337 CURLE_OK() 所有罚款.继续像往常一样. CURLE_UNSUPPOR ...