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 相关文章推荐
tornado捕获和处理404错误的方法
Feb 26 Python
Python常用正则表达式符号浅析
Aug 13 Python
Python打印scrapy蜘蛛抓取树结构的方法
Apr 08 Python
网站渗透常用Python小脚本查询同ip网站
May 08 Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 Python
使用python实现unix2dos和dos2unix命令的例子
Aug 13 Python
Python循环实现n的全排列功能
Sep 16 Python
python图形用户接口实例详解
Dec 16 Python
Python networkx包的实现
Feb 14 Python
Java byte数组操纵方式代码实例解析
Jul 22 Python
Python爬虫之爬取二手房信息
Apr 27 Python
Python中可变和不可变对象的深入讲解
Aug 02 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编程中的异常处理详细方法介绍
2008/07/29 PHP
浅析php数据类型转换
2014/01/09 PHP
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
查看大图功能代码jquery版
2013/11/05 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
JS获得图片alt信息的方法
2015/04/01 Javascript
javascript实现的闭包简单实例
2015/07/17 Javascript
jquery插件jquery.dragscale.js实现拖拽改变元素大小的方法(附demo源码下载)
2016/02/25 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
2016/05/26 Javascript
微信小程序 登陆流程详细介绍
2017/01/17 Javascript
angular directive的简单使用总结
2017/05/24 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
BootStrap Fileinput上传插件使用实例代码
2017/07/28 Javascript
VueJs 搭建Axios接口请求工具
2017/11/20 Javascript
浅谈HTTP 缓存的那些事儿
2018/10/17 Javascript
原生js实现贪吃蛇游戏
2020/10/26 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
[45:18]完美世界DOTA2联赛循环赛 PXG vs IO 第二场 11.06
2020/11/09 DOTA
Python+Socket实现基于UDP协议的局域网广播功能示例
2017/08/31 Python
Python基于分水岭算法解决走迷宫游戏示例
2017/09/26 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
机械系大学毕业生推荐信
2013/11/27 职场文书
出国导师推荐信
2014/01/16 职场文书
学校联谊活动方案
2014/02/15 职场文书
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书
庆祝教师节标语
2014/10/09 职场文书
护士长2014年终工作总结
2014/11/11 职场文书
2014年度培训工作总结
2014/11/27 职场文书
2015年医院护理部工作总结
2015/04/23 职场文书
国庆节新闻稿
2015/07/17 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
深入浅析React中diff算法
2021/05/19 Javascript