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中逗号的三种作用实例分析
Jun 08 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
Jun 29 Python
Python3处理HTTP请求的实例
May 10 Python
Python3随机漫步生成数据并绘制
Aug 27 Python
对pandas写入读取h5文件的方法详解
Dec 28 Python
对Python3 解析html的几种操作方式小结
Feb 16 Python
Python使用MyQR制作专属动态彩色二维码功能
Jun 04 Python
Python turtle绘画象棋棋盘
Aug 21 Python
Python迭代器协议及for循环工作机制详解
Jul 14 Python
python读取excel数据绘制简单曲线图的完整步骤记录
Oct 30 Python
Python超简单容易上手的画图工具库推荐
May 10 Python
pytorch 预训练模型读取修改相关参数的填坑问题
Jun 05 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
基于文本的留言簿
2006/10/09 PHP
浅析php header 跳转
2013/06/17 PHP
图片完美缩放
2006/09/07 Javascript
FCK调用方法..
2006/12/21 Javascript
利用javascript的面向对象的特性实现限制试用期
2011/08/04 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
2012/12/11 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
2015/11/17 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
2016/06/20 Javascript
Bootstrap的Refresh Icon也spin起来
2016/07/13 Javascript
D3.js实现雷达图的方法详解
2016/09/22 Javascript
Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
2017/06/29 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
JS实现的按钮点击颜色切换功能示例
2017/10/19 Javascript
详解webpack之scss和postcss-loader的配置
2018/01/09 Javascript
js实现单元格拖拽效果
2020/02/10 Javascript
python字符串替换示例
2014/04/24 Python
为Python的web框架编写MVC配置来使其运行的教程
2015/04/30 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
2015/06/26 Python
python中文乱码不着急,先看懂字节和字符
2017/12/20 Python
浅谈Tensorflow模型的保存与恢复加载
2018/04/26 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
Python实现DDos攻击实例详解
2019/02/02 Python
500行Python代码打造刷脸考勤系统
2019/06/03 Python
Numpy中ndim、shape、dtype、astype的用法详解
2020/06/14 Python
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
NFL墨西哥官方商店:Tienda NFL
2017/11/28 全球购物
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
工厂保洁员岗位职责
2013/12/04 职场文书
人事专员工作职责
2014/02/22 职场文书
秸秆管理实施方案
2014/03/15 职场文书
法定代表人身份证明书(含说明)
2014/10/02 职场文书
旷课检讨书
2015/01/26 职场文书
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android
Python何绘制带有背景色块的折线图
2022/04/23 Python