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 相关文章推荐
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
Jan 19 Python
以Flask为例讲解Python的框架的使用方法
Apr 29 Python
python发送邮件实例分享
Jul 28 Python
tensorflow实现简单逻辑回归
Sep 07 Python
python批量爬取下载抖音视频
Jun 17 Python
Python 实现还原已撤回的微信消息
Jun 18 Python
python 动态迁移solr数据过程解析
Sep 04 Python
python内打印变量之%和f的实例
Feb 19 Python
Python opencv相机标定实现原理及步骤详解
Apr 09 Python
Python drop方法删除列之inplace参数实例
Jun 27 Python
Django前后端分离csrf token获取方式
Dec 25 Python
Python socket如何解析HTTP请求内容
Feb 12 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
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
php实现无限级分类
2014/12/24 PHP
php定义参数数量可变的函数用法实例
2015/03/16 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
yii2中使用Active Record模式的方法
2016/01/09 PHP
PHP访问数据库集群的方法小结
2016/03/14 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
2016/07/09 PHP
JS实现浏览器状态栏文字闪烁效果的方法
2015/10/27 Javascript
JS实现设置ff与ie元素绝对位置的方法
2016/03/08 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
JQuery在循环中绑定事件的问题详解
2016/06/02 Javascript
js变量提升深入理解
2016/09/16 Javascript
JS不完全国际化&本地化手册 之 理论篇
2016/09/27 Javascript
使用JSON作为函数的参数的优缺点
2016/10/27 Javascript
JS实现隔行换色的表格排序
2017/03/27 Javascript
浅谈 vue 中的 watcher
2017/12/04 Javascript
9种使用Chrome Firefox 自带调试工具调试javascript技巧
2017/12/22 Javascript
微信小程序实现左右联动的实战记录
2018/07/05 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
2018/12/11 Javascript
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
Python中sort和sorted函数代码解析
2018/01/25 Python
Python3实现腾讯云OCR识别
2018/11/27 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
利用python对mysql表做全局模糊搜索并分页实例
2020/07/12 Python
共产党员公开承诺书
2014/03/25 职场文书
中学生教师节演讲稿
2014/09/03 职场文书
2015中秋节慰问信范文
2015/03/23 职场文书