python实现kNN算法


Posted in Python onDecember 20, 2017

kNN(k-nearest neighbor)是一种基本的分类与回归的算法。这里我们先只讨论分类中的kNN算法。

k邻近算法的输入为实例的特征向量,对对应于特征空间中的点;输出为实例的类别,可以取多类,k近邻法是建设给定一个训练数据集,其中的实例类别已定,分类时,对于新的实例,根据其k个最邻近的训练实例的类别,通过多数表决等方式进行预测。所以可以说,k近邻法不具有显示的学习过程。k临近算法实际上是利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”

k值的选择,距离的度量和分类决策规则是k近邻算法的三个基本要素。

这里需要说明的是,对于距离的度量,我们有很多种度量方法可以选择,如欧氏距离(2-范数),曼哈顿距离(1-范数),无穷范数等,根据不同的实例,我们可以选择不同的距离度量方法。

下面给出了利用python和sklearn库实现的kNN算法的过程及部分注释:

# coding=utf-8 
 
# 首先利用sklearn的库进行knn算法的建立与预测 
# from sklearn import neighbors 
# from sklearn import datasets 
# 
# knn = neighbors.KNeighborsClassifier()   # 调用分类器赋在变量knn上 
# 
# iris = datasets.load_iris()   # 返回一个数据库,赋值在iris上 
# 
# print iris   # 显示这个数据集 
# 
# knn.fit(iris.data, iris.target) # fit的第一个参数 是特征值矩阵,第二个参数是一维的向量 
# 
# predictedLabel = knn.predict([[0.1,0.2,0.3,0.4]]) 
# 
# print predictedLabel 
 
# 下面自己写一个程序实现knn算法 
 
import csv 
import random 
import math 
import operator 
 
# filename是指文件名,split是某一个数字,数字前的数据当做训练集,数字后的数据当做测试集 
# trainingSet是训练集,testSet是测试集 
# 函数作用,加载文件,并将文件通过随机数的方法分为训练集和测试集 
def loadDataset(filename, split, trainingSet=[], testSet=[]): 
  with open(filename, 'rb') as csvfile:  # 导入文件为csvfile格式 
    lines = csv.reader(csvfile)   # 读取所有的行 reader函数的作用 
    dataset = list(lines)    # 将所有的行转换为list的数据节后 
    for x in range(len(dataset)-1):   # x在总共的行数中遍历 
      for y in range(4): 
        dataset[x][y] = float(dataset[x][y]) 
      if random.random() < split: 
        trainingSet.append(dataset[x]) 
      else: 
        testSet.append(dataset[x]) 
 
 
# 函数作用:计算欧氏距离 
# 函数的输入是两个实例和他们的维度 
def euclideanDistance(instance1, instance2, length): 
  distance = 0 
  for x in range(length):   # 对于每一个维度内进行一个差的计算,计算出所有维度的平方和 
    distance += pow((instance1[x] - instance2[x]),2) 
  return math.sqrt(distance) 
 
# 函数作用:返回最近的k的neightbor 
# 也就是返回在trainingSet中距离testInstance最近的k个邻居 
def getNeigthbors(trainingSet, testInstance, k): 
  distances =[] # 距离的容器,用来存放所有的距离值 
  length = len(testInstance) - 1 # 用来存放testInstance的维度 
  for x in range(len(trainingSet)): 
    # 对于每一个x 计算训练集中的数据与实例的距离 
    dist = euclideanDistance(testInstance,trainingSet[x],length) 
    distances.append((trainingSet[x],dist)) 
  # 把这些距离从小到大排起来 
  distances.sort(key=operator.itemgetter(1)) 
  neighbors = [] 
  for x in range(k): 
    neighbors.append(distances[x][0]) 
  return neighbors    # 返回最近的邻居 
 
def getResponse(neighbors): 
  classVotes = {} 
  for x in range(len(neighbors)): 
    response = neighbors[x][-1] 
    if response in classVotes: 
      classVotes[response] += 1 
    else: 
      classVotes[response] = 1 
  sortedVotes = sorted(classVotes.iteritems(),key=operator.itemgetter(1),reverse=True) 
  return sortedVotes[0][0] 
 
# 用来检验预测结果的正确率 
def getAccuracy(testSet,predictions): 
  correct = 0 
  for x in range(len(testSet)): 
    if testSet[x][-1] == predictions[x]:    # [-1]值的是最后一个值,也就是每行的最后的值,即为花的分类 
      correct += 1 
  return (correct/float(len(testSet))) * 100.00 
 
 
def main(): 
  # prepare data 
  trainingSet = [] 
  testSet = [] 
  split = 0.67 
  loadDataset('irisdata.txt',split,trainingSet,testSet) # r的作用是防止错误字符串意思 
  print 'Train Set' + repr(len(trainingSet)) 
  print 'Test Set' + repr(len(testSet)) 
 
  # generate predicitions 
  predicitions = [] 
  k = 3 
  for x in range(len(testSet)): 
    neighbors = getNeigthbors(trainingSet,testSet[x],k) 
    result = getResponse(neighbors) 
    predicitions.append(result) 
    print('> predicition = ' + repr(result) + ', actual = ' +repr(testSet[x][-1])) 
  accuracy = getAccuracy(testSet,predicitions) 
  print('Accuracy:' + repr(accuracy) + '%') 
 
main()

程序执行后,相应的输出如下:

python实现kNN算法

Python 相关文章推荐
python实现去除下载电影和电视剧文件名中的多余字符的方法
Sep 23 Python
Python之PyUnit单元测试实例
Oct 11 Python
使用IPython下的Net-SNMP来管理类UNIX系统的教程
Apr 15 Python
Python编程中用close()方法关闭文件的教程
May 24 Python
python如何修改装饰器中参数
Mar 20 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
Aug 05 Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 Python
Python OpenCV之图片缩放的实现(cv2.resize)
Jun 28 Python
tensorflow 保存模型和取出中间权重例子
Jan 24 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
使用Pytorch训练two-head网络的操作
May 28 Python
Django rest framework如何自定义用户表
Jun 09 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
PyCharm 常用快捷键和设置方法
Dec 20 #Python
You might like
php5.3 废弃函数小结
2010/05/16 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
2014/06/21 PHP
分享PHP函数实现数字与文字分页代码
2015/07/28 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
javascript 不间断的图片滚动并可点击
2010/01/15 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
js图片延迟加载的实现方法及思路
2013/07/22 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
javascript实现框架高度随内容改变的方法
2015/07/23 Javascript
JavaScript中文件上传API详解
2016/04/01 Javascript
JS跨域解决方案之使用CORS实现跨域
2016/04/14 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
2016/06/08 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
2017/02/13 Javascript
bootstrapvalidator之API学习教程
2017/06/29 Javascript
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
2017/08/18 jQuery
ligerUI---ListBox(列表框可移动的实例)
2017/11/28 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
浅析vue-router实现原理及两种模式
2020/02/11 Javascript
[58:54]EG vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python 错误和异常小结
2013/10/09 Python
python处理文本文件并生成指定格式的文件
2014/07/31 Python
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
python处理按钮消息的实例详解
2017/07/11 Python
Python延时操作实现方法示例
2018/08/14 Python
python日志logging模块使用方法分析
2019/05/23 Python
Python3.5以上版本lxml导入etree报错的解决方案
2019/06/26 Python
python实现最小二乘法线性拟合
2019/07/19 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
台湾最大网路书店:博客来
2018/03/18 全球购物
银行会计财务工作个人的自我评价
2013/10/29 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书
党员干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
新手开公司创业注意事项有哪些?
2019/07/29 职场文书