使用python实现knn算法


Posted in Python onDecember 20, 2017

本文实例为大家分享了python实现knn算法的具体代码,供大家参考,具体内容如下

knn算法描述

对需要分类的点依次执行以下操作:
1.计算已知类别数据集中每个点与该点之间的距离
2.按照距离递增顺序排序
3.选取与该点距离最近的k个点
4.确定前k个点所在类别出现的频率
5.返回前k个点出现频率最高的类别作为该点的预测分类

knn算法实现

数据处理

#从文件中读取数据,返回的数据和分类均为二维数组
def loadDataSet(filename):
  dataSet = []
  labels = []
  fr = open(filename)
  for line in fr.readlines():
    lineArr = line.strip().split(",")
    dataSet.append([float(lineArr[0]),float(lineArr[1])])
    labels.append([float(lineArr[2])])
  return dataSet , labels

knn算法

#计算两个向量之间的欧氏距离
def calDist(X1 , X2):
  sum = 0
  for x1 , x2 in zip(X1 , X2):
    sum += (x1 - x2) ** 2
  return sum ** 0.5

def knn(data , dataSet , labels , k):
  n = shape(dataSet)[0]
  for i in range(n):
    dist = calDist(data , dataSet[i])
    #只记录两点之间的距离和已知点的类别
    labels[i].append(dist)
  #按照距离递增排序
  labels.sort(key=lambda x:x[1])
  count = {}
  #统计每个类别出现的频率
  for i in range(k):
    key = labels[i][0]
    if count.has_key(key):
      count[key] += 1
    else : count[key] = 1
  #按频率递减排序
  sortCount = sorted(count.items(),key=lambda item:item[1],reverse=True)
  return sortCount[0][0]#返回频率最高的key,即label

结果测试

已知类别数据(来源于西瓜书+虚构)

0.697,0.460,1
0.774,0.376,1
0.720,0.330,1
0.634,0.264,1
0.608,0.318,1
0.556,0.215,1
0.403,0.237,1
0.481,0.149,1
0.437,0.211,1
0.525,0.186,1
0.666,0.091,0
0.639,0.161,0
0.657,0.198,0
0.593,0.042,0
0.719,0.103,0
0.671,0.196,0
0.703,0.121,0
0.614,0.116,0

绘图方法

def drawPoints(data , dataSet, labels):
  xcord1 = [];
  ycord1 = [];
  xcord2 = [];
  ycord2 = [];
  for i in range(shape(dataSet)[0]):
    if labels[i][0] == 0:
      xcord1.append(dataSet[i][0])
      ycord1.append(dataSet[i][1])
    if labels[i][0] == 1:
      xcord2.append(dataSet[i][0])
      ycord2.append(dataSet[i][1])
  fig = plt.figure()
  ax = fig.add_subplot(111)
  ax.scatter(xcord1, ycord1, s=30, c='blue', marker='s',label=0)
  ax.scatter(xcord2, ycord2, s=30, c='green',label=1)
  ax.scatter(data[0], data[1], s=30, c='red',label="testdata")
  plt.legend(loc='upper right')
  plt.show()

测试代码

dataSet , labels = loadDataSet('dataSet.txt')
data = [0.6767,0.2122]
drawPoints(data , dataSet, labels)
newlabels = knn(data, dataSet , labels , 5)
print newlabels

运行结果

使用python实现knn算法

使用python实现knn算法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
wxpython 学习笔记 第一天
Mar 16 Python
easy_install python包安装管理工具介绍
Feb 10 Python
python读文件逐行处理的示例代码分享
Dec 27 Python
在树莓派2或树莓派B+上安装Python和OpenCV的教程
Mar 30 Python
Python可变参数*args和**kwargs用法实例小结
Apr 27 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
Dec 12 Python
如何在Django中设置定时任务的方法示例
Jan 18 Python
python防止随意修改类属性的实现方法
Aug 21 Python
Python 实现的 Google 批量翻译功能
Aug 26 Python
python函数map()和partial()的知识点总结
May 26 Python
K近邻法(KNN)相关知识总结以及如何用python实现
Jan 28 Python
Python time库的时间时钟处理
May 02 Python
python实现kNN算法
Dec 20 #Python
解析Python中的eval()、exec()及其相关函数
Dec 20 #Python
详解Python中 sys.argv[]的用法简明解释
Dec 20 #Python
简单了解Django模板的使用
Dec 20 #Python
python机器学习之决策树分类详解
Dec 20 #Python
python机器学习之神经网络(三)
Dec 20 #Python
python机器学习之神经网络(二)
Dec 20 #Python
You might like
把PHP安装为Apache DSO
2006/10/09 PHP
PHP无敌近乎加密方式!
2010/07/17 PHP
php流量统计功能的实现代码
2012/09/29 PHP
php中过滤非法字符的具体实现
2013/10/29 PHP
JQuery动画animate的stop方法使用详解
2014/05/09 Javascript
JavaScript在IE和FF下的兼容性问题
2014/05/19 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
2015/06/18 Javascript
javascript:void(0)是什么意思及href=#与href=javascriptvoid(0)的区别
2015/11/13 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
canvas实现环形进度条效果
2017/03/23 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
浅谈关于axios和session的一些事
2017/07/13 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
Vue.js 图标选择组件实践详解
2018/12/03 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
微信公众号H5之微信分享常见错误和问题(小结)
2019/11/14 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
JS中的继承操作实例总结
2020/06/06 Javascript
解决vue打包报错Unexpected token: punc的问题
2020/10/24 Javascript
python list 合并连接字符串的方法
2013/03/09 Python
使用Python3编写抓取网页和只抓网页图片的脚本
2015/08/20 Python
Python实现Mysql数据统计及numpy统计函数
2019/07/15 Python
编写python代码实现简单抽奖器
2020/10/20 Python
详解HTML5中rel属性的prefetch预加载功能使用
2016/05/06 HTML / CSS
美国美发品牌:Bumble and Bumble
2016/10/08 全球购物
Waterford英国官方网站:世界上最受欢迎的优质水晶品牌
2019/08/17 全球购物
90后毕业生的求职信范文
2013/09/21 职场文书
商务英语毕业生自荐信范文
2013/11/08 职场文书
如何写求职信
2014/05/24 职场文书
2014年纪检部工作总结
2014/11/12 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
中学图书馆工作总结
2015/08/11 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL
oracle覆盖导入dmp文件的2种方法
2021/05/21 Oracle