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 24 Python
Python设置Socket代理及实现远程摄像头控制的例子
Nov 13 Python
详解python单例模式与metaclass
Jan 15 Python
使用anaconda的pip安装第三方python包的操作步骤
Jun 11 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
Jul 07 Python
对python中GUI,Label和Button的实例详解
Jun 27 Python
关于PyTorch源码解读之torchvision.models
Aug 17 Python
Python一行代码解决矩阵旋转的问题
Nov 30 Python
Windows下实现将Pascal VOC转化为TFRecords
Feb 17 Python
python自动脚本的pyautogui入门学习
Apr 01 Python
Python 开发工具通过 agent 代理使用的方法
Sep 27 Python
python如何提升爬虫效率
Sep 27 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
虫族 ZERG 概述
2020/03/14 星际争霸
php smarty 二级分类代码和模版循环例子
2011/06/01 PHP
PHP查询MySQL大量数据的时候内存占用分析
2011/07/22 PHP
PHP中PDO基础教程 入门级
2011/09/04 PHP
PHP仿盗链代码
2012/06/03 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
详谈phpAdmin修改密码后拒绝访问的问题
2017/04/03 PHP
解放web程序员的输入验证
2006/10/06 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
JS动态改变表格边框宽度的方法
2015/03/31 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
2015/06/01 Javascript
详解jquery事件delegate()的使用方法
2016/01/25 Javascript
js导出excel文件的简洁方法(推荐)
2016/11/02 Javascript
BootStrap Tooltip插件源码解析
2016/12/27 Javascript
使用vue.js写一个tab选项卡效果
2017/03/25 Javascript
Javascript实现时间倒计时效果
2017/07/15 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
jQuery实现点击旋转,再点击恢复初始状态动画效果示例
2018/12/11 jQuery
uni-app微信小程序登录授权的实现
2020/05/22 Javascript
html-webpack-plugin修改页面的title的方法
2020/06/18 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
KMP算法精解及其Python版的代码示例
2016/06/01 Python
python自动化之Ansible的安装教程
2019/06/13 Python
python实现udp传输图片功能
2020/03/20 Python
Pytest框架之fixture的详细使用教程
2020/04/07 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
2020/04/22 Python
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
幼儿教师思想汇报
2014/01/10 职场文书
嘉宾邀请函
2015/01/31 职场文书
钱学森电影观后感
2015/06/04 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书
用Python实现Newton插值法
2021/04/17 Python
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL
详细了解java监听器和过滤器
2021/07/09 Java/Android