Python代码实现KNN算法


Posted in Python onDecember 20, 2017

kNN算法是k-近邻算法的简称,主要用来进行分类实践,主要思路如下:

1.存在一个训练数据集,每个数据都有对应的标签,也就是说,我们知道样本集中每一数据和他对应的类别。
2.当输入一个新数据进行类别或标签判定时,将新数据的每个特征值与训练数据集中的每个数据进行比较,计算其到训练数据集中每个点的距离(下列代码实现使用的是欧式距离)。
3.然后提取k个与新数据最接近的训练数据点所对应的标签或类别。
4.出现次数最多的标签或类别,记为当前预测新数据的标签或类别。

欧式距离公式为:

distance= sqrt((xA0-XB0)^2+(xA1-XB1)^2+...+(xAn-XBn)^2)(若数据有n个特征项)

以下为代码实现:

#! /usr/bin/python 
#coding=utf-8 
from numpy import * 
import operator 
def createDataSet(): 
  group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])#训练数据样本集合 
  labels = ['A','A','B','B']#训练数据对应的类别 
  return group,labels 
''''' 
inX:用于分类的输入向量 
dataSet:训练样本集合 
labels:标签向量 
k:k-近邻算法中的k 
''' 
def classify0(inX,dataSet,labels,k): 
  dataSetSize = dataSet.shape[0] #获取数组的维度,也就是获取训练样本的行数(样本数),若获取列数,则为shape[1] 
  diffMat = tile(inX,(dataSetSize,1)) - dataSet # tile 表示inX在重复dataSetSize行,重复1列。为输入向量与各个样本求取欧式距离做准备。 
  sqDiddMat = diffMat**2 #diffMat是输入向量与我们训练样本每个点相减得到的,**2表示值的结果取平方。 
  sqDistances = sqDiddMat.sum(axis=1)#默认为axis=0,axis=1以后就是将一个矩阵的每一行向量相加 
  distances = sqDistances**0.5 #对结果进行开平方,得到输入向量与每个训练样本中点的欧式距离 
  sorteDistIndicies = distances.argsort()#将距离结果按照从小到大排序获得索引值 
  classcount={} #这是一个字典,key为类别,value为距离最小的前k个样本点里面为该类别的个数。 
  for i in range(k): 
    voteIlabel = labels[sorteDistIndicies[i]]#获取距离最小的前k个样本点对应的label值 
    classcount[voteIlabel] = classcount.get(voteIlabel,0)+1 #如果之前的样本点label值与与现在的相同,则累计加1,否则,此次加1 
  sorteClassCount = sorted(classcount.iteritems(),key=operator.itemgetter(1),reverse=True) #针对calsscount获取对象的第1个域的值进行降序排序。也就是说根据类别的个数从大到小排序。 
  return sorteClassCount[0][0] #返回排序的字典的第一个元素的key,即分类后的类别 
 
createDataSet() 
print classify0([0.9,0.9],group,labels,3)

结果为:A 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
写了个监控nginx进程的Python脚本
May 10 Python
基于python的Tkinter编写登陆注册界面
Jun 30 Python
python脚本生成caffe train_list.txt的方法
Apr 27 Python
对python中array.sum(axis=?)的用法介绍
Jun 28 Python
python requests 库请求带有文件参数的接口实例
Jan 03 Python
python实现电子产品商店
Feb 26 Python
Pandas读写CSV文件的方法示例
Mar 27 Python
元组列表字典(莫烦python基础)
Apr 03 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
Sep 25 Python
Python多进程编程multiprocessing代码实例
Mar 12 Python
Python新手如何理解循环加载模块
May 29 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
Feb 26 Python
详解appium+python 启动一个app步骤
Dec 20 #Python
浅谈Django自定义模板标签template_tags的用处
Dec 20 #Python
Python实现感知机(PLA)算法
Dec 20 #Python
详解Python nose单元测试框架的安装与使用
Dec 20 #Python
使用python实现knn算法
Dec 20 #Python
python实现kNN算法
Dec 20 #Python
解析Python中的eval()、exec()及其相关函数
Dec 20 #Python
You might like
php 用sock技术发送邮件的函数
2007/07/21 PHP
PHP5+UTF8多文件上传类
2008/10/17 PHP
初学PHP的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
PHP代码重构方法漫谈
2018/04/17 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
2019/10/17 PHP
js对数字的格式化使用说明
2011/01/12 Javascript
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
2012/10/11 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
javascript常用函数(1)
2015/11/04 Javascript
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
jQuery插件制作的实例教程
2016/05/16 Javascript
原生js实现class的添加和删除简单代码
2016/07/12 Javascript
基于JavaScript实现点击页面任何位置返回
2016/08/31 Javascript
js读取本地文件的实例
2017/12/22 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
关于vue面试题汇总
2018/03/20 Javascript
jQuery实现获取form表单内容及绑定数据到form表单操作分析
2018/07/03 jQuery
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
Array.filter中如何正确使用Async
2020/11/04 Javascript
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
2021/01/25 Javascript
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
Python中的文件和目录操作实现代码
2011/03/13 Python
python通过shutil实现快速文件复制的方法
2015/03/14 Python
在python的类中动态添加属性与生成对象
2016/09/17 Python
通过Pandas读取大文件的实例
2018/06/07 Python
使用python语言,比较两个字符串是否相同的实例
2018/06/29 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
使用Keras训练好的.h5模型来测试一个实例
2020/07/06 Python
Python 解析xml文件的示例
2020/09/29 Python
销售所有的狗狗产品:Dog.com
2016/10/13 全球购物
黄金搭档广告词
2014/03/21 职场文书
公司委托书范本5篇
2014/09/20 职场文书
办理收楼委托书范本
2014/10/09 职场文书
大学生党性分析材料
2014/12/19 职场文书
mysql数据库入门第一步之创建表
2021/05/14 MySQL