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基础教程之获取本机ip数据包示例
Feb 10 Python
python读取html中指定元素生成excle文件示例
Apr 03 Python
详解python string类型 bytes类型 bytearray类型
Dec 16 Python
浅析Python3爬虫登录模拟
Feb 07 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
Jun 14 Python
python进程和线程用法知识点总结
May 28 Python
Python使用pyserial进行串口通信的实例
Jul 02 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
Jul 04 Python
python关于矩阵重复赋值覆盖问题的解决方法
Jul 19 Python
Python openpyxl读取单元格字体颜色过程解析
Sep 03 Python
Python面向对象封装操作案例详解
Dec 31 Python
基于python实现删除指定文件类型
Jul 21 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
火车头采集器3.0采集图文教程
2007/03/17 PHP
Mysql中limit的用法方法详解与注意事项
2008/04/19 PHP
php中DOMElement操作xml文档实例演示
2013/03/26 PHP
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
2017/08/09 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
2019/05/01 PHP
基于PHP实现用户登录注册功能的详细教程
2020/08/04 PHP
javascript Select标记中options操作方法集合
2008/10/22 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
js 判断计算字符串长度/判断空的简单方法
2013/08/05 Javascript
jQuery无刷新分页完整实例代码
2015/10/27 Javascript
JavaScript作用域示例详解
2016/07/07 Javascript
JS HTML5实现拖拽移动列表效果
2020/08/27 Javascript
详解vuejs几种不同组件(页面)间传值的方式
2017/06/01 Javascript
js推箱子小游戏步骤代码解析
2018/01/10 Javascript
layui获取多选框中的值方法
2018/08/15 Javascript
对angularJs中ng-style动态改变样式的实例讲解
2018/09/30 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
2019/09/06 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
微信小程序获取地理位置及经纬度授权代码实例
2019/09/18 Javascript
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
Python走楼梯问题解决方法示例
2018/07/25 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
python中的&amp;&amp;及||的实现示例
2019/08/07 Python
html5中canvas图表实现柱状图的示例
2017/11/13 HTML / CSS
鲜花方阵解说词
2014/02/13 职场文书
小区物业门卫岗位职责
2014/04/10 职场文书
2014年百日安全生产活动总结
2014/05/04 职场文书
党支部换届选举方案
2014/05/08 职场文书
房产公证委托书范本
2014/09/20 职场文书
2014年党建工作汇报材料
2014/10/27 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
JavaScript函数柯里化
2021/11/07 Javascript
Docker下安装Oracle19c
2022/04/13 Servers
Golang连接并操作MySQL
2022/04/14 MySQL