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 21 Python
详细介绍Python的鸭子类型
Sep 12 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
May 08 Python
Python列表和元组的定义与使用操作示例
Jul 26 Python
python中实现指定时间调用函数示例代码
Sep 08 Python
TensorFlow 滑动平均的示例代码
Jun 19 Python
python一行sql太长折成多行并且有多个参数的方法
Jul 19 Python
Django Form 实时从数据库中获取数据的操作方法
Jul 25 Python
利用python计算时间差(返回天数)
Sep 07 Python
Anaconda的安装与虚拟环境建立
Nov 18 Python
Django展示可视化图表的多种方式
Apr 08 Python
pandas中关于apply+lambda的应用
Feb 28 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/10/23 PHP
php输出表格的实现代码(修正版)
2010/12/29 PHP
需要注意的几个PHP漏洞小结
2012/02/05 PHP
php 使用array函数实现分页
2015/02/13 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
2016/05/20 PHP
jquery不支持toggle()高(新)版本的问题解决
2016/09/24 PHP
JS小功能(offsetLeft实现图片滚动效果)实例代码
2013/11/28 Javascript
js获取当前页面路径示例讲解
2014/01/08 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
seaJs的模块定义和模块加载浅析
2014/06/06 Javascript
jQuery中nextUntil()方法用法实例
2015/01/07 Javascript
JavaScript实现在标题栏上显示当前日期的方法
2015/03/19 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
2015/10/29 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
JavaScript禁止复制与粘贴的实现代码
2016/05/16 Javascript
bootstrap日期控件问题(双日期、清空等问题解决)
2017/04/19 Javascript
ajax +NodeJS 实现图片上传实例
2017/06/06 NodeJs
手把手搭建安装基于windows的Vue.js运行环境
2017/06/12 Javascript
canvas基础绘制-绚丽倒计时的实例
2017/09/17 Javascript
浅谈Vue.nextTick 的实现方法
2017/10/25 Javascript
iview中Select 选择器多选校验方法
2018/03/15 Javascript
vue中element-ui表格缩略图悬浮放大功能的实例代码
2018/06/26 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
linux服务器快速卸载安装node环境(简单上手)
2021/02/22 Javascript
Python OOP类中的几种函数或方法总结
2019/02/22 Python
Selenium之模拟登录铁路12306的示例代码
2020/07/31 Python
瑞典快乐袜子:Happy Socks
2018/02/16 全球购物
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
介绍一下Java的事务处理
2012/12/07 面试题
《雪地里的小画家》教学反思
2014/02/22 职场文书
读书月活动方案
2014/05/22 职场文书
python pyhs2 的安装操作
2021/04/07 Python
MySQL事务的隔离级别详情
2022/07/15 MySQL