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不带重复的全排列代码
Aug 13 Python
Python探索之ModelForm代码详解
Oct 26 Python
对Python中for复合语句的使用示例讲解
Nov 01 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
Nov 06 Python
浅谈python之高阶函数和匿名函数
Mar 21 Python
python 寻找离散序列极值点的方法
Jul 10 Python
关于pytorch中网络loss传播和参数更新的理解
Aug 20 Python
python 发送json数据操作实例分析
Oct 15 Python
python删除某个目录文件夹的方法
May 26 Python
PyCharm 解决找不到新打开项目的窗口问题
Jan 15 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
Feb 25 Python
python编程简单几行代码实现视频转换Gif示例
Oct 05 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
php中计算时间差的几种方法
2009/12/31 PHP
php中array_multisort对多维数组排序的方法
2020/06/21 PHP
PHP递归创建多级目录
2015/11/05 PHP
PHP生成和获取XML格式数据的方法
2016/03/04 PHP
Symfony2创建页面实例详解
2016/03/18 PHP
Yii2增加验证码步骤详解
2016/04/25 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
修改发贴的编辑功能
2007/03/07 Javascript
分享一个asp.net pager分页控件
2012/01/04 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
2014/03/18 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
window.print打印指定div指定网页指定区域的方法
2014/08/04 Javascript
JavaScript运算符小结
2015/06/03 Javascript
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
JS实现的透明度渐变动画效果示例
2018/04/28 Javascript
react项目实践之webpack-dev-serve
2018/09/14 Javascript
layui动态加载多表头的实例
2019/09/05 Javascript
vue改变循环遍历后的数据实例
2019/11/07 Javascript
JS数组的高级使用方法示例小结
2020/03/14 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
2020/11/19 Vue.js
[46:20]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
python读写ini配置文件方法实例分析
2015/06/30 Python
分享6个隐藏的python功能
2017/12/07 Python
python numpy格式化打印的实例
2018/05/14 Python
浅谈Python类中的self到底是干啥的
2019/11/11 Python
Python ATM功能实现代码实例
2020/03/19 Python
使用canvas压缩图片大小的方法示例
2019/08/02 HTML / CSS
CHRONEXT英国:您的首选奢华腕表目的地
2020/03/30 全球购物
自荐书范文
2013/12/08 职场文书
赞美老师的演讲稿
2014/05/22 职场文书
工作所在部门证明
2014/09/21 职场文书
社区活动总结范文
2015/05/07 职场文书
教师调动申请报告
2015/05/18 职场文书
《总之就是很可爱》新作短篇动画《总之就是很可爱~制服~》将于2022年夏天播出
2022/04/07 日漫