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 threading多线程编程实例
Sep 18 Python
从头学Python之编写可执行的.py文件
Nov 28 Python
python使用os.listdir和os.walk获得文件的路径的方法
Dec 16 Python
Python中pillow知识点学习
Apr 30 Python
Python基于SMTP协议实现发送邮件功能详解
Aug 14 Python
python利用Opencv实现人脸识别功能
Apr 25 Python
Python Excel处理库openpyxl使用详解
May 09 Python
python3.6编写的单元测试示例
Aug 17 Python
使用PyTorch实现MNIST手写体识别代码
Jan 18 Python
Django 允许局域网中的机器访问你的主机操作
May 13 Python
通俗易懂了解Python装饰器原理
Sep 17 Python
如何用python 操作zookeeper
Dec 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中的正规表达式(二)
2006/10/09 PHP
php中使用Akismet防止垃圾评论的代码
2011/06/10 PHP
php把session写入数据库示例
2014/02/26 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
2019/04/09 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
语义化 H1 标签
2008/01/14 Javascript
JavaScript动态创建div属性和样式示例代码
2013/10/09 Javascript
jquery简单实现图片切换效果的方法
2015/05/12 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
2015/11/20 Javascript
理解javascript模块化
2016/03/28 Javascript
jQuery获取父元素节点、子元素节点及兄弟元素节点的方法
2016/04/14 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
vue 获取视频时长的实例代码
2019/08/20 Javascript
解决vue props传Array/Object类型值,子组件报错的情况
2020/11/07 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
利用python将json数据转换为csv格式的方法
2018/03/22 Python
DES加密解密算法之python实现版(图文并茂)
2018/12/06 Python
利用nohup来开启python文件的方法
2019/01/14 Python
python utc datetime转换为时间戳的方法
2019/01/15 Python
python 获取微信好友列表的方法(微信web)
2019/02/21 Python
利用Python脚本实现自动刷网课
2020/02/03 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
python如何操作mysql
2020/08/17 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
Speedo速比涛中国官方网站:全球领先泳装运动品牌
2018/04/24 全球购物
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
static全局变量与普通的全局变量有什么区别
2014/05/27 面试题
企业给企业的表扬信
2014/01/13 职场文书
五年级音乐教学反思
2014/02/06 职场文书
公司周年庆典标语
2014/10/07 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
工程技术负责人岗位职责
2015/04/13 职场文书
JS实现简单的九宫格抽奖
2022/06/28 Javascript