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 ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
Jun 10 Python
python通过get,post方式发送http请求和接收http响应的方法
May 26 Python
详解Python中dict与set的使用
Aug 10 Python
Python基础教程之tcp socket编程详解及简单实例
Feb 23 Python
python利用不到一百行代码实现一个小siri
Mar 02 Python
python实现远程通过网络邮件控制计算机重启或关机
Feb 22 Python
从DataFrame中提取出Series或DataFrame对象的方法
Nov 10 Python
python运行时强制刷新缓冲区的方法
Jan 14 Python
Python django框架应用中实现获取访问者ip地址示例
May 17 Python
Python如何在DataFrame增加数值
Feb 14 Python
python求前n个阶乘的和实例
Apr 02 Python
Python局部变量与全局变量区别原理解析
Jul 14 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加密解密类代码
2011/11/27 PHP
PHP的Socket网络编程入门指引
2015/08/11 PHP
thinkPHP下ueditor的使用方法详解
2015/12/26 PHP
关于PHP通用返回值设置方法
2017/03/31 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
javascript一点特殊用法
2008/05/28 Javascript
jQuery 事件队列调整方法
2009/09/18 Javascript
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
可兼容IE的获取及设置cookie的jquery.cookie函数方法
2013/09/02 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
2016/02/01 Javascript
ajax在兼容模式下失效的快速解决方法
2016/03/22 Javascript
ES6所改良的javascript“缺陷”问题
2016/08/23 Javascript
简单谈谈JS数组中的indexOf方法
2016/10/13 Javascript
Javascript实现倒计时(防页面刷新)实例
2016/12/13 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
利用Javascript裁剪图片并存储的简单实现
2017/03/13 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
nodejs的路径问题的解决
2018/06/30 NodeJs
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
Vue vm.$attrs使用场景详解
2020/03/08 Javascript
原生JS实现弹幕效果的简单操作指南
2020/11/10 Javascript
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
同时安装Python2 &amp; Python3 cmd下版本自由选择的方法
2017/12/09 Python
python如何将图片转换为字符图片
2020/08/19 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
2019/06/17 Python
python IP地址转整数
2020/11/20 Python
关于HTML5+ API plusready的兼容问题
2020/11/20 HTML / CSS
一篇.NET面试题
2014/09/29 面试题
安全生产检查通报
2014/01/29 职场文书
保护环境演讲稿
2014/05/10 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang
Python爬虫:从m3u8文件里提取小视频的正确操作
2021/05/14 Python