使用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使用calendar输出指定年份全年日历的方法
Apr 04 Python
Python中用startswith()函数判断字符串开头的教程
Apr 07 Python
Python使用BeautifulSoup库解析HTML基本使用教程
Mar 31 Python
详解python的数字类型变量与其方法
Nov 20 Python
Python实现随机生成有效手机号码及身份证功能示例
Jun 05 Python
Python的SimpleHTTPServer模块用处及使用方法简介
Jan 22 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
May 26 Python
Python 3.8正式发布重要新功能一览
Oct 17 Python
Python实现线性插值和三次样条插值的示例代码
Nov 13 Python
TensorFlow自定义损失函数来预测商品销售量
Feb 05 Python
完美解决Pycharm中matplotlib画图中文乱码问题
Jan 11 Python
如何获取numpy array前N个最大值
May 14 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操作MongoDB的技术总结
2013/06/02 PHP
解析CI的AJAX分页 另类实现方法
2013/06/27 PHP
PHP 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
php中memcache 基本操作实例
2015/05/17 PHP
详解如何在云服务器上部署Laravel
2017/06/30 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
Javascript 面向对象特性
2009/12/28 Javascript
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
easyui datagrid 键盘上下控制选中行示例
2014/03/31 Javascript
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
nodejs初步体验篇
2015/11/23 NodeJs
jquery插件bootstrapValidator数据验证详解
2016/11/09 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
在HTML文档中嵌入JavaScript的四种方法
2018/05/07 Javascript
vue模式history下在iis中配置流程
2019/04/17 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
详解JS预解析原理
2020/06/16 Javascript
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
python 不关闭控制台的实现方法
2011/10/23 Python
python生成指定长度的随机数密码
2014/01/23 Python
盘点提高 Python 代码效率的方法
2014/07/03 Python
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
2018/03/02 Python
使用tensorflow实现线性回归
2018/09/08 Python
python3+selenium实现126邮箱登陆并发送邮件功能
2019/01/23 Python
python+jinja2实现接口数据批量生成工具
2019/08/28 Python
redis数据库及与python交互用法简单示例
2019/11/01 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
2020/09/29 Python
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
加多宝凉茶广告词
2014/03/18 职场文书
公开服务承诺制度
2014/03/26 职场文书
致接力运动员加油稿
2015/07/21 职场文书
Java 语言中Object 类和System 类详解
2021/07/07 Java/Android