KNN算法思想与实现
第二章 k近邻
2.1 算法描述
(1)采用测量不同特征值之间的距离进行分类
优点:对异常点不敏感,精度高,无数据输入设定
缺点:空间,计算复杂度高
适合数据:标称与数值
(2)算法的工作原理:
基于已有的带有标签的训练数据,计算出需要预测的数据与每个训练数据之间的距离,找到其中距离最近的k个数据,根据这k数据中数量最多的类来决定测试数据的类别
(3)算法的类别
该算法属于有监督学习,用于分类,因此它的目标变量是离散的
(4)算法的一般流程:
1.收集数据
2.准备数据
3.分析数据
4.测试算法
5.使用算法
2.2算法实现过程
(1)获取数据

(2)KNN算法
from numpy import *
import operator # this KNN matrix col is 3
# in order to create data
def createDataSet():
group = array([[1.0, 1.1], [1.0, 1.0], [0.0, 0.0], [0.0, 0.1]])
lables = ['A', 'A', 'B', 'B']
return group, lables # main algorithm
def classify0(inx, dataSet, lables, k):
datasetSize = dataSet.shape[0]
diffmat = tile(inx, (datasetSize, 1)) - dataSet
sqdiffmat = diffmat**2
sqDistance = sqdiffmat.sum(axis=1)
distance = sqDistance**0.5
sortedDistance = distance.argsort()
classcount = {}
for i in range(k):
votelabel = lables[sortedDistance[i]]
classcount[votelabel] = classcount.get(votelabel, 0) + 1
sortedclasscount = sorted(classcount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedclasscount[0][0] # read the txt data file
def file2matrix(filename):
fr = open(filename)
arraylines = fr.readlines()
numberoflines = len(arraylines)
returnmatrix = zeros((numberoflines, 3)) # you can change the col
clasavector = []
index = 0
for line in arraylines:
line = line.strip()
listformline = line.split('\t')
returnmatrix[index, :] = listformline[0:3] # you should change the col
clasavector.append(int(listformline[-1]))
index += 1
return returnmatrix, clasavector # normalize the data
def autonorm(dataset):
minval = dataset.min(0)
maxval = dataset.max(0)
ranges = maxval - minval
datasetsize = dataset.shape[0]
normdataset = dataset - tile(minval, (datasetsize, 1))
normdataset = normdataset/tile(ranges, (datasetsize, 1))
return normdataset, ranges, minval def datingclasstest(filename):
horatio = 0.1
dataset, lableset = file2matrix(filename)
noramdataset, ranges, minval = autonorm(dataset)
col = dataset.shape[0]
test = int(col*horatio)
errorcount = 0.0
for i in range(col):
classlable = classify0(noramdataset[i, :], noramdataset[test:col, :], lableset[test:col], 3)
if classlable != lableset[i]:
errorcount += 1
error = errorcount / float(col)
print error
(3)dating应用程序
import KNN
from numpy import * def classifyperson():
returnlist = ['not at all', 'in small doses', 'in large doses']
game = float(raw_input("the percentage of playing video game"))
fly = float(raw_input("the num of the flier mail"))
icecream = float(raw_input("the num of icecream every weak"))
person = array([game, fly, icecream])
dataset,datalable = KNN.file2matrix("F:data/machinelearninginaction/Ch02/datingTestSet2.txt")
normdataset, ranges, minval=KNN.autonorm(dataset)
classifierresult =KNN.classify0((person - minval)/ranges, normdataset, datalable, 3)
print "you will like him %s" % returnlist[classifierresult-1]
(4)手写识别程序
import KNN
from os import listdir
from numpy import * # change the 32*32 to vector
def image2vertor(filename):
fr = open(filename)
imagevertor = zeros((1, 1024))
for i in range(32):
line = fr.readline()
for j in range(32):
imagevertor[0, i*32+j] = int(line[j])
return imagevertor
testvector = image2vertor("F:data/machinelearninginaction/Ch02/digits/testDigits/0_13.txt") def handwritingtest():
hwlables = [] # record the lable
filename = listdir("F:data/machinelearninginaction/Ch02/digits/trainingDigits/")
filenum = len(filename)
dataset = zeros((filenum, 1024))
for i in range(filenum):
filenamestr = filename[i].split(".")[0]
filelable = int(filenamestr.split('_')[0])
hwlables.append(filelable)
filepath = "F:data/machinelearninginaction/Ch02/digits/trainingDigits/" + filename[i]
data = image2vertor(filepath)
dataset[i, :] = data
testfile = listdir("F:data/machinelearninginaction/Ch02/digits/testDigits/")
testfilenum = len(testfile)
for j in range(testfilenum):
testfilestr = testfile[j].split('.')[0]
testfilelable =int(testfilestr.split('_')[0])
testdilepath = "F:data/machinelearninginaction/Ch02/digits/testDigits/" + testfile[j]
testdata = image2vertor(testdilepath)
classname = KNN.classify0(testdata, dataset, hwlables, 3)
error = 0.0
if classname == testfilelable:
error += 1
print "we think it is %d, the real is %d" % (classname, testfilelable)
print "the num of error is %d " % error
print "the error rate is %f" % (error/float(testfilenum)) handwritingtest()
KNN算法思想与实现的更多相关文章
- 机器学习之KNN算法思想及其实现
从一个例子来直观感受KNN思想 如下图 , 绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形 ...
- Python 手写数字识别-knn算法应用
在上一篇博文中,我们对KNN算法思想及流程有了初步的了解,KNN是采用测量不同特征值之间的距离方法进行分类,也就是说对于每个样本数据,需要和训练集中的所有数据进行欧氏距离计算.这里简述KNN算法的特点 ...
- 机器学习【三】k-近邻(kNN)算法
一.kNN算法概述 kNN算法是用来分类的,其依据测量不同特征值之间的距离,其核心思想在于用距离目标最近的k个样本数据的分类来代表目标的分类(这k个样本数据和目标数据最为相似).其精度高,对异常值不敏 ...
- KNN算法原理(python代码实现)
kNN(k-nearest neighbor algorithm)算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性 ...
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考 ...
- kNN算法python实现和简单数字识别
kNN算法 算法优缺点: 优点:精度高.对异常值不敏感.无输入数据假定 缺点:时间复杂度和空间复杂度都很高 适用数据范围:数值型和标称型 算法的思路: KNN算法(全称K最近邻算法),算法的思想很简单 ...
- 数据挖掘之KNN算法(C#实现)
在十大经典数据挖掘算法中,KNN算法算得上是最为简单的一种.该算法是一种惰性学习法(lazy learner),与决策树.朴素贝叶斯这些急切学习法(eager learner)有所区别.惰性学习法仅仅 ...
- KNN算法与Kd树
最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知 ...
随机推荐
- HTML5 Web Storage 特性
原文地址: Using HTML5 Web Storage 原文日期: 2010年06月28日 翻译日期: 2013年08月12日 当下Web开发领域最火爆的词语当属 HTML5.HTML5标准的新特 ...
- 青年菜君与小农女送菜商业模式PK
青年菜君与小农女送菜商业模式PK 对比项 青年菜君 小农女送菜 优势 劣势 开业 2014年3月3日 2013年9月 渠道 地铁捕获用户 写字楼配送 送货 来店面自取 送货到写字楼 菜君 1.减少 ...
- 一键安装LAMP
一键安装LAMP LAMP是Linux,Apache,MySQL和PHP合起来的简称,用于开发网站.对于初学者而言,没有什么比一键部署一个LAMP开发环境更省心的了,到下面的网址下载BitNami: ...
- [MSSQL]SQL Server里面导出SQL脚本(表数据的insert语句)(转)
最近需要导出一个表的数据并生成insert语句,发现SQL Server的自带工具并米有此功能.BAIDU一下得到如下方法(亲测OK) 用这个存储过程可以实现:CREATE PROCEDURE dbo ...
- mysql进阶(二十一)删除表数据
MySQL删除表数据 在MySQL中有两种方法可以删除数据,一种是DELETE语句,另一种是TRUNCATE TABLE语句.DELETE语句可以通过WHERE对要删除的记录进行选择.而使用TRUNC ...
- 【Coding算法导论】第4章:最大子数组问题
Coding算法导论 本系列文章主要针对算法导论一书上的算法,将书中的伪代码用C++实现 代码未经过大量数据测试,如有问题,希望能在回复中指出! (一)问题描述 给定一个数组,求数组中连续的子数组的和 ...
- 【Qt编程】基于Qt的词典开发系列<十>--国际音标的显示
在年前的一篇文章中,我提到要学习Qt.于是在这学期看了一个月的qt.现在大致对qt有了一些了解.但是现在导师又把我调到了android应用开发平台,所以说qt的学习要搁置了.本打算这学期做一个单词查询 ...
- android ListView加载不同布局
今天来跟大家讨论下同一个ListView如何加载不同的布局. 老规矩,先来看效果图. 主要步骤如下 1.增加Type. 2.重写getViewTypeCount方法. 3.重写getItemViewT ...
- centos 下安装mysql-5.6.11
这次是在centos6.4下安装mysql,在安装之前,你要先确定你的linux已经安装了这些包: wget, gcc-c++, ncurses-devel ,cmake, make ,perl 如果 ...
- 用LED灯和按键来模拟工业自动化设备的运动控制
开场白: 前面三节讲了独立按键控制跑马灯的各种状态,这一节我们要做一个机械手控制程序,这个机械手可以左右移动,最左边有一个开关感应器,最右边也有一个开关感应器.它也可以上下移动,最下面有一个开关感应器 ...