Python实现KNN算法
Python实现Knn算法
关键词:KNN、K-近邻(KNN)算法、欧氏距离、曼哈顿距离
KNN是通过测量不同特征值之间的距离进行分类。它的的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
在KNN中,通过计算对象间距离来作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里距离一般使用欧氏距离或曼哈顿距离:同时,KNN通过依据k个对象中占优的类别进行决策,而不是单一的对象类别决策。这两点就是KNN算法的优势。
KNN算法的思想总结:就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。
#coding:utf-8
import requests, json, time, re, os, sys, time
import urllib2
import random
import numpy as np #设置为utf-8模式
reload(sys)
sys.setdefaultencoding( "utf-8" ) #读取文本文件,构建二维数组
def readDataFile(filename,format):
if format:
pass
else:
format = ','
list = []
#去除首位空格
filename = filename.strip()
#判断数据文件是否存在
if os.path.isfile(filename):
pass
file_object = open(filename,'rb')
lines = file_object.readlines()
for line in lines:
tmp = []
line = line.strip()
for value in line.split(format)[:-1]:
tmp.append(float(value))
tmp.append(line.split(format)[-1])
list.append(tmp)
else:
print "%s is not exists " % (filename)
return list #读取文本数据,拆分原始数据为特征和标签,返回特征值和标签值
def createData(filename,format=','):
data_label = readDataFile(filename,format)
if len(data_label) > 0:
label = []
data = []
#data_label = [[1,100,123,'A'],[2,99,123,'A'],[100,1,12,'B'],[99,2,23,'B']]
for each in data_label:
label.append(each[-1])
data.append(each[:-1])
return data,label #根据输入数据和测试数据,进行分类
def calculateDistance(input,data,label,k):
classes = 'Error' if len(data[0])==0 or len(label) == 0:
print 'data or label is null'
pass
elif k > len(data) :
print "k : %s is out of bounds" % (k)
pass
elif len(input) <> len(data[0]):
print "特征变量值不够,输入变量特征个数为:%s,训练特征变量个数为:%s" % (len(input),len(data[0]))
pass
else:
result = []
length = len(input)
for i in range(len(data)):
sum = 0
for j in range(length):
#pow(5,2) 标识5的平方为25,取两点之间的距离的平方并累加
sum = sum + pow(input[j] - data[i][j],2)
#取平方根
sum = pow(sum,0.5)
result.append(sum)
#print result
result = np.array(result) #argsort()根据元素的值从小到大对元素进行排序,返回下标
sortedDistIndex = np.argsort(result) #统计前k个数中各个标签的个数
classCount={}
for i in range(k):
voteLabel = label[sortedDistIndex[i]]
###对选取的K个样本所属的类别个数进行统计
#dict.get(key, default=None) 返回指定键的值,如果值不在字典中返回默认值None。
classCount[voteLabel] = classCount.get(voteLabel,0) + 1
###选取出现的类别次数最多的类别
maxCount = 0
for key,value in classCount.items():
if value > maxCount:
maxCount = value
classes = key
return classes filename = '/home/shutong/jim/crawl/data.csv'
data,label = createData(filename)
input = [1,20]
k = 4
result = calculateDistance(input,data,label,k)
print input,result
其中测试数据如图:

输入数据为:input = [1,20],预测它的标签为A还是B?

最终预测结果为:A
Python实现KNN算法的更多相关文章
- Python实现KNN算法及手写程序识别
1.Python实现KNN算法 输入:inX:与现有数据集(1xN)进行比较的向量 dataSet:已知向量的大小m数据集(NxM) 个标签:数据集标签(1xM矢量) k:用于比较的邻居数 ...
- [Python] 应用kNN算法预测豆瓣电影用户的性别
应用kNN算法预测豆瓣电影用户的性别 摘要 本文认为不同性别的人偏好的电影类型会有所不同,因此进行了此实验.利用较为活跃的274位豆瓣用户最近观看的100部电影,对其类型进行统计,以得到的37种电影类 ...
- ML一:python的KNN算法
(1):list的排序算法: 参考链接:http://blog.csdn.net/horin153/article/details/7076321 示例: DisListSorted = sorted ...
- 利用Python实现kNN算法
邻近算法(k-NearestNeighbor) 是机器学习中的一种分类(classification)算法,也是机器学习中最简单的算法之一了.虽然很简单,但在解决特定问题时却能发挥很好的效果.因此,学 ...
- 基于python 实现KNN 算法
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/11/7 14:50 # @Author : gylhaut # @Site ...
- 吴裕雄 python 机器学习-KNN算法(1)
import numpy as np import operator as op from os import listdir def classify0(inX, dataSet, labels, ...
- knn算法详解
邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代 ...
- 机器学习回顾篇(6):KNN算法
1 引言 本文将从算法原理出发,展开介绍KNN算法,并结合机器学习中常用的Iris数据集通过代码实例演示KNN算法用法和实现. 2 算法原理 KNN(kNN,k-NearestNeighbor)算法, ...
- Python实现kNN(k邻近算法)
Python实现kNN(k邻近算法) 运行环境 Pyhton3 numpy科学计算模块 计算过程 st=>start: 开始 op1=>operation: 读入数据 op2=>op ...
随机推荐
- ubuntu12上部署Django1.8.4+uwsgi+nginx超级详细流程配置到云服务器
环境: 系统:ubuntu12,系统自带默认有python2.7 框架:Django1.8.4,需要python2.7以上才能支持 前言: 用户浏览器发送http请求->nginx(静态文件 ...
- List扩展方法汇总(仅备注)
不管在c/s还是b/s的c#语言开发程序中,经常会用到List的扩展方法,尤其在json格式的数据和服务端交互越来越流行,很多时候总是在开发使用到的时候才去搜索有些扩展方法或者linq的用法,在这里, ...
- 英语单词state和status的区别
state:比较常用,各种状态都可以用它,但是它更着重于一种心理状态或者物理状态. Status:用在人的身上一般是其身份和地位,作"状态,情形"讲时,多指政治和商业. state ...
- Spring Cloud Config 1 (分布式配置中心)
spring cloud config是spring cloud团队创建的一个全新的项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端和客户端两部分. 服务端也被称为 ...
- 02-nginx信号量
刚才完了nginx的编译,nginx的编译还是挺简单的.控制nginx:重启.关闭.只有孤零零的一个二进制文件nginx 通过信号来控制它,Linux操作系统进程与进程之间通过信号来通信.荷兰的一位计 ...
- 【FZU2280】Magic
题意 给出n个字符串,每个字符串有一个权值wi 有q个操作,操作有两种 1 x y 将字符串x的权值变为y 2 x 查询操作,输出以字符串x为后缀,且权值小于等于wx的字符串个数.其中n<=10 ...
- 浅析junit4及扩展实践
junit框架相关源代码分析,网上已经有很多了,本篇不做过多相关解说,主要还是要自己多读相关源代码.本篇主要对自动化测试过程相关的测试用例,测试数据,测试结果结合junit做相关扩展说明. 如果要解读 ...
- Hyperledger Fabric Ordering Service过程
排序服务在超级账本 Fabric 网络中起到十分核心的作用.所有交易在发送给 Committer 进行验证接受之前,需要先经过排序服务进行全局排序. 在目前架构中,排序服务的功能被抽取出来,作为单独的 ...
- 使用 tpl 标签和 for 读取对象属性值中的数组
来源于<sencha touch 权威指南> ----------------------------- 只摘抄app.js代码: Ext.require(['Ext.form.Panel ...
- 第十九课 pluginlib&Nodelet
把rgb摄像头的数据转换为laser的时候使用了Nodelet. pluginlib(插件库) 在ros中有一个plugin的包,下面是一个ROS Plugin Registration的例子 上面包 ...