KNN算法的简单实现
一 算法原理:已知一个训练样本集,其中每个训练样本都有自己的标记(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算法的简单实现的更多相关文章
- 机器学习之二:K-近邻(KNN)算法
一.概述 K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中 ...
- 深入浅出KNN算法(一) KNN算法原理
一.KNN算法概述 KNN可以说是最简单的分类算法之一,同时,它也是最常用的分类算法之一,注意KNN算法是有监督学习中的分类算法,它看起来和另一个机器学习算法Kmeans有点像(Kmeans是无监督学 ...
- JavaScript机器学习之KNN算法
译者按: 机器学习原来很简单啊,不妨动手试试! 原文: Machine Learning with JavaScript : Part 2 译者: Fundebug 为了保证可读性,本文采用意译而非直 ...
- 【笔记】初探KNN算法(1)
KNN算法(1) 全称是K Nearest Neighbors k近邻算法: 思想简单 需要的数学知识很少 效果不错 可以解释机器学习算法使用过程中的很多细节问题 更加完整的刻画机器学习应用的流程 其 ...
- kNN算法python实现和简单数字识别
kNN算法 算法优缺点: 优点:精度高.对异常值不敏感.无输入数据假定 缺点:时间复杂度和空间复杂度都很高 适用数据范围:数值型和标称型 算法的思路: KNN算法(全称K最近邻算法),算法的思想很简单 ...
- KNN算法简单应用
这里是写给小白看的,大牛路过勿喷. 1 KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集 ...
- KNN 算法,以及与Kmeans的简单对比
KNN与Kmeans感觉没啥联系,但是名字挺像的,就拿来一起总结一下吧. 初学者的总结. KNN是监督学习,Kmeans是无监督学习. KNN用于分类,Kmeans用于聚类. 先说KNN: 对于KNN ...
- Python简单实现KNN算法
__author__ = '糖衣豆豆' from numpy import * from os import listdir import operator #从列方向扩展 #tile(a,(size ...
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
随机推荐
- keypress
onKeyUp="keypress2(this,140)" onblur="keypress2(this,140)"<span>你还可以输入140个 ...
- 自己的3dmax作品RX-105柯西高达
背后视角带导弹仓. 侧面. 侧后视角. 前侧视角. 斜前上视角 使用关联实现骨骼功能,头.躯干.肩.上臂.前臂.手腕.手指.腰.髋关节.踝关节.脚掌皆由骨骼(是通过多边形关联实现骨骼功能,而不是使用3 ...
- Error querying database. Cause: java.sql.SQLException: ORA-01745: 无效的主机/绑定变量名
今天调试程序是遇到了,下面的一个问题.我将对应的SQL语句拿到Toad下也能正常的执行,感觉有点莫名其妙,根据异常信息的提示查看对应的映射结果集也没发现错误,然后百度了一下,也有许多朋友也遇到过这样的 ...
- yii学习小结
对yii框架搭建的平台运维过程中,会不断地发现很多新的特性和问题,现一一记录下来,便于后续学习~ 1.日志 在/runtime目录中 参考:http://www.cnblogs.com/you ...
- 图的强连通分量-Kosaraju算法
输入一个有向图,计算每个节点所在强连通分量的编号,输出强连通分量的个数 #include<iostream> #include<cstring> #include<vec ...
- centos atomic host第一次启动
centos atomic host安装完成会,第一次启动时会调用cloud-init等服务.这是个什么东东? cloud-init用于在创建虚拟机时通过元数据服务对虚拟机基本配置,包括常见的主机名, ...
- css自定义字体完美解决方案example
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ASP.NET的SEO: 服务器控件背后——SEO友好的Html和JavaScript
本系列目录 假设你需要从一个页面转向其他页面,下面有很多种方式,你是如何选择的呢?你能清晰的说明理由么? <%--链接的表现形式--%> <asp:Hy ...
- solr5.5教程-solr.home 配置
solr/home是solr实例化core核的依据和入口,是必不可少的配置. 1.在web.xml中设置 <env-entry> <env-entry-name>solr/ho ...
- No deleted LINE chat messages recovered on iOS 9.1 after UFED extraction
The evidence is iPhone 5s with iOS 9.1 and not jail breaked. I use UFED to do advanced logical extra ...