使用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文件比较示例分享
Jan 10 Python
python实现探测socket和web服务示例
Mar 28 Python
Python常用的文件及文件路径、目录操作方法汇总介绍
May 21 Python
python生成随机密码或随机字符串的方法
Jul 03 Python
python 读取文件并替换字段的实例
Jul 12 Python
Python实现矩阵相乘的三种方法小结
Jul 26 Python
Python干货:分享Python绘制六种可视化图表
Aug 27 Python
python根据txt文本批量创建文件夹
Dec 08 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
Apr 15 Python
在Python3 numpy中mean和average的区别详解
Aug 24 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
Jan 21 Python
浅谈Python数学建模之数据导入
Jun 23 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自定义函数实现格式化秒的方法
2016/09/14 PHP
php输出形式实例整理
2020/05/05 PHP
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
2010/03/16 Javascript
JS关键字球状旋转效果的实例代码
2013/11/29 Javascript
解决Jquery鼠标经过不停滑动的问题
2014/03/03 Javascript
js调用iframe实现打印页面内容的方法
2014/03/04 Javascript
js获取IP地址的方法小结
2014/07/01 Javascript
window.location 对象所包含的属性
2014/10/10 Javascript
js实现绿白相间竖向网页百叶窗动画切换效果
2015/03/02 Javascript
jquery合并表格中相同文本的相邻单元格
2015/07/17 Javascript
AngularJS使用指令增强标准表单元素功能
2016/07/01 Javascript
AngularJS入门教程之表格实例详解
2016/07/27 Javascript
JavaScript中双符号的运算详解
2017/03/12 Javascript
laravel5.4+vue+element简单搭建的示例代码
2017/08/29 Javascript
使用FileReader API创建Vue文件阅读器组件
2018/04/03 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
发布Angular应用至生产环境的方法
2018/12/10 Javascript
JS async 函数的含义和用法实例总结
2020/04/08 Javascript
python实现判断数组是否包含指定元素的方法
2015/07/15 Python
python Celery定时任务的示例
2018/03/13 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
Python 对输入的数字进行排序的方法
2018/06/23 Python
Django 路由控制的实现
2019/07/17 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
Python爬虫制作翻译程序的示例代码
2021/02/22 Python
【HTML5】Canvas绘制简单图片教程
2016/05/13 HTML / CSS
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
Servlet的实例是在生命周期什么时候创建的?配置servlet最重要的是什么?
2012/05/30 面试题
市场营销个人求职信范文
2014/02/02 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
农村老人去世追悼词
2015/06/23 职场文书
民主生活会主持词
2015/07/01 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书
那些美到让人窒息的诗句,值得你收藏!
2019/08/20 职场文书
vue使用v-model进行跨组件绑定的基本实现方法
2021/04/28 Vue.js