使用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 相关文章推荐
跟老齐学Python之不要红头文件(1)
Sep 28 Python
利用信号如何监控Django模型对象字段值的变化详解
Nov 27 Python
python链接oracle数据库以及数据库的增删改查实例
Jan 30 Python
浅谈Python中的作用域规则和闭包
Mar 20 Python
python中scikit-learn机器代码实例
Aug 05 Python
在Python中字典根据多项规则排序的方法
Jan 21 Python
python钉钉机器人运维脚本监控实例
Feb 20 Python
Python3.5内置模块之time与datetime模块用法实例分析
Apr 27 Python
Django集成搜索引擎Elasticserach的方法示例
Jun 04 Python
Python中zip()函数的简单用法举例
Sep 02 Python
如何基于python实现不邻接植花
May 01 Python
Python实现京东抢秒杀功能
Jan 25 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
example1.php
2006/10/09 PHP
php一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
php支付宝接口用法分析
2015/01/04 PHP
PHP中的命名空间详细介绍
2015/07/02 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
jQuery 1.0.2
2006/10/11 Javascript
巧用replace将文字表情替换为图片
2014/04/17 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
javascript笛卡尔积算法实现方法
2015/04/08 Javascript
深入浅析AngularJS中的module(模块)
2016/01/04 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
Vuex提升学习篇
2018/01/11 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
2018/02/10 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
2018/03/06 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
移动端如何用下拉刷新的方式实现上拉加载
2018/12/10 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
ES6 Promise对象的含义和基本用法分析
2019/06/14 Javascript
[01:02:05]LGD vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python和GO语言实现的消息摘要算法示例
2015/03/10 Python
python 自动重连wifi windows的方法
2018/12/18 Python
Python中单线程、多线程和多进程的效率对比实验实例
2019/05/14 Python
解决Python3 抓取微信账单信息问题
2019/07/19 Python
浅谈matplotlib 绘制梯度下降求解过程
2020/07/12 Python
2014年圣诞节倒计时网页的制作过程
2014/12/05 HTML / CSS
HTML5新增加标签和功能概述
2016/09/05 HTML / CSS
实习生自荐信范文
2013/11/13 职场文书
婚纱摄影师求职信
2014/03/07 职场文书
计算机网络专业求职信
2014/06/05 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
2014年专项整治工作总结
2014/11/17 职场文书
任命通知范文
2015/04/21 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
golang json数组拼接的实例
2021/04/28 Golang
Android基于Fresco实现圆角和圆形图片
2022/04/01 Java/Android