KNN算法的简单实现

时间:2022-09-25 13:29:13

一  算法原理:已知一个训练样本集,其中每个训练样本都有自己的标记(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-近邻&lpar;KNN&rpar;算法

    一.概述 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. WordPress

    WordPress: 1.一种使用PHP语言开发的博客平台 2.用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站 3.也可以把 WordPress当作一个内容管理系统(CMS)来使用 ...

  2. react-redux&lpar;1&rpar;

    基础 Array.prototype.reduce //类似的核心思想 const initState = ''; const actions = ['a', 'b', 'c']; const new ...

  3. 使用openssl库实现RSA、AES数据加密

         openssl是可以很方便加密解密的库,可以使用它来对需要在网络中传输的数据加密.可以使用非对称加密:公钥加密,私钥解密.openssl提供了对RSA的支持,但RSA存在计算效率低的问题,所 ...

  4. C&num; 的时间戳转换

    /// <summary> /// 时间戳转为C#格式时间 /// </summary> /// <param name="timeStamp"&gt ...

  5. Runtime 在IOS中的详细使用

    因为之前写东西的时候,都在未知笔记中,所有大家没有看到过我的文章,今天就开始使用博客园来进行和大家沟通.好了,废话不那么多了,转入正题.下面我把runtime 给大家介绍一下. ### 一.runti ...

  6. &lbrack;辅助类&rsqb;NHibernateHelper

    对于学习ORM的人来说,NHibernate简直就是福音啊,而且此中技术是相当成熟,在这里分享一个小东西 public class NHibernateHelper { //数据库连接字符串 publ ...

  7. 解决pip安装时 UnicodeDecodeError 问题

    在装django的时候用pip安装就出现了问题,一大堆的红字,然后联想到很多次用pip安装都以失败告终,于是今天抽空看了看出现问题的原因. 情况如下图:

  8. Inno Setup入门(六)&mdash&semi;&mdash&semi;在程序目录下创建文件

    创建文件夹可以使用[dirs]段实现,代码如下: [setup] ;全局设置,本段必须 AppName=Test AppVerName=TEST DefaultDirName="E:\TES ...

  9. php处理表单中的复选框问题以及js实现全选

    做的一个项目中遇到了全选和取消全选的问题,这是一个很普遍的功能,,虽然我们经常用到,但是真正做起来却发现行不通,在网上找了些,大部分都是ie,但是谷歌内核浏览器不能正常实现,所以经过小小的调整,今天就 ...

  10. 第1章 HTTP协议基本介绍了解

    一.常见接口协议: HTTP     超文本传输协议 HTTPS   安全超文本传输协议 FTP       文件传输协议 TCP       网络控制协议 IP          互联网协议 UDP ...