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 11View Code
trainingData set 和testData set 的载入
![](/assets/blank.gif)
![](/assets/blank.gif)
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
View Code
分类器的构造
![](/assets/blank.gif)
![](/assets/blank.gif)
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
View Code
分类测试
![](/assets/blank.gif)
![](/assets/blank.gif)
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)
View Code
测试结果
![](/assets/blank.gif)
![](/assets/blank.gif)
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%
View Code
注:以上代码运行环境为Python2.7.11
从上面结果可以看出knn 分类效果还不错,在我看来,knn就是简单粗暴,就是把未知分类的数据特征与我们分类好的数据特征进行比对,选择最相似的标记作为自己的分类,辣么问题来了,如果我们的新数据的特征在样本集中比较少见,这时候就会出现问题,分类错误的可能性非常大,反之,如果样例集中某一类的样例比较多,那么新数据被分成该类的可能性就会大,如何保证分类的公平性,我们就需要进行加权了。
补充:关于K值的选取,当k越小时,分类结果对原数据的敏感性越强,易受到异常数据的影响,即模型越复杂。
数据来源:http://download.csdn.net/download/qq_17046229/7625323
转载于:https://www.cnblogs.com/lpworkstudyspace1992/p/5470621.html
KNN算法的简单实现相关推荐
- 使用kNN算法实现简单的手写文字识别
0. 介绍 kNN,即k-Nearest Neighbor(k近邻算法), 简介可参考KNN的一些总结. 本文是<机器学习实战>一书第二章的例子, 主要利用kNN实现简单的手写文字识别. ...
- 浅谈KNN算法原理及python程序简单实现、KD树、球树
最近比较空闲,打算利用这一段时间理一下机器学习的一些常见的算法.第一个是KNN算法: KNN 1.原理: KNN,K-NearestNeighbor---K最近邻 K最近邻,就是K个最近的邻居的意思, ...
- KNN算法简单?我竟用3万字没写清楚······
大家好,我是小伍哥,本文非常长,建议先收藏,有空再看 谈起KNN,很多人都会觉得非常简单,甚至会露出不屑+鄙视,包括我自己,当初也是如此,当我进行深入的研究,发现真是大意了. 大家都知道KNN可以用于 ...
- KNN算法原理与简单实现
KNN算法原理与简单实现 K最近邻(k-Nearest Neighbor,KNN)分类算法,是最简单的机器学习算法之一,涉及高等数学知识近乎为0,虽然它简单,但效果很好,是入门机器学习的首选算法.但很 ...
- knn聚类还是分类_数据分析基本算法模型之KNN算法
最近失业了...sad 休息了一个月,然后就想着找工作的事情.浏览了一些职位的JD,发现上面都会写了解机器学习算法模型,掌握回归.分类.聚类balabala.这就让我有点蛋疼了,这些在之前工作上都没怎 ...
- JavaScript机器学习之KNN算法
2019独角兽企业重金招聘Python工程师标准>>> 译者按: 机器学习原来很简单啊,不妨动手试试! 原文: Machine Learning with JavaScript : ...
- Python 基于SVM和KNN算法的红酒分类
Python 机器学习之红酒分类问题 文章目录 Python 机器学习之红酒分类问题 前言 一.问题和目标是什么 1.原题 2.题目分析 二.算法简介 三.代码实现 1.算法流程框架 2.第三方库调用 ...
- KNN算法(一) KNN算法原理
一.KNN算法概述 KNN可以说是最简单的分类算法之一,同时,它也是最常用的分类算法之一,注意KNN算法是有监督学习中的分类算法,它看起来和另一个机器学习算法Kmeans有点像(Kmeans是无监督学 ...
- Python实现KNN算法(鸢尾花集)
不同颜色的鸢尾花花语不尽相同,蓝色鸢尾花语是精致的美丽,红色鸢尾花的花语代表着热情.适应力强.紫蓝色鸢尾花花语代表着好消息.想念你.黄色鸢尾花的花语代表着友谊永固.热情开朗,白色鸢尾花花语代表着纯真. ...
最新文章
- C# 对字符进行UrlEncode/UrlDecode
- 2018年,JavaScript都经历了什么?
- Android动画之Property属性动画
- jqurey datatables属性
- Jerry本地安装SAP Kyma的一些失败尝试
- photoshop cc_如何使用Photoshop CC将图片变成卡通
- dubbo源码解析(二)
- java 方法 示例_Java集合的lastlastIndexOfSubList()方法和示例
- centos7下创建mysql5.6多实例
- 创建可扩展性系统-13-2
- Java多线程和并发(一),进程与线程的区别
- 科研不是比赛,而是一种对未知和完美的自我追求——跟邢波(Eric Xing)面对面聊科研...
- C#与.NET Framework c#编程语言,和java是一样的。(c#,java) --javaweb,asp.net
- java提现功能开发_利用java实现提现金额到支付宝账户的功能
- 关于严蔚敏老师《数据结构(C语言版)》书中代码的误解
- Failed to decode response: zlib_decode(): data error Retrying with degraded;
- linux – signal 信号列表
- 2019年内大892数据结构部分参考答案
- 【开餐馆】 动态规划
- 生活是否永远如此艰辛,还是仅仅童年才如此