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 相关文章推荐
python33 urllib2使用方法细节讲解
Dec 03 Python
跟老齐学Python之用while来循环
Oct 02 Python
使用Python的Flask框架实现视频的流媒体传输
Mar 31 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
Jul 11 Python
详解python读取和输出到txt
Mar 29 Python
Django 查询数据库并返回页面的例子
Aug 12 Python
python 公共方法汇总解析
Sep 16 Python
python+Django实现防止SQL注入的办法
Oct 31 Python
如何使用python进行pdf文件分割
Nov 11 Python
Python字典生成式、集合生成式、生成器用法实例分析
Jan 07 Python
深入浅析python变量加逗号,的含义
Feb 22 Python
Python: glob匹配文件的操作
Dec 11 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
在字符串中把网址改成超级链接
2006/10/09 PHP
mysql 全文搜索 技巧
2007/04/27 PHP
php中判断文件存在是用file_exists还是is_file的整理
2012/09/12 PHP
php缓冲 output_buffering的使用详解
2013/06/13 PHP
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
PHP实现的限制IP投票程序IP来源分析
2016/05/04 PHP
php处理带有中文URL的方法
2016/07/11 PHP
PHP实现小程序批量通知推送
2018/11/27 PHP
用js一次改变多个input的readonly属性值的方法
2014/06/11 Javascript
JS+CSS实现带关闭按钮DIV弹出窗口的方法
2015/02/27 Javascript
javascript 应用小技巧方法汇总
2015/07/05 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
基于MVC方式实现三级联动(JavaScript)
2017/01/23 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
react-router实现按需加载
2017/05/09 Javascript
angularJS 发起$http.post和$http.get请求的实现方法
2017/05/18 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
使用layui 的layedit定义自己的toolbar方法
2019/09/18 Javascript
[46:27]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第一局
2016/03/02 DOTA
Python 正则表达式(转义问题)
2014/12/15 Python
Python应用03 使用PyQT制作视频播放器实例
2016/12/07 Python
详解常用查找数据结构及算法(Python实现)
2016/12/09 Python
python学习教程之使用py2exe打包
2017/09/24 Python
基于Python实现的微信好友数据分析
2018/02/26 Python
python之线程通过信号pyqtSignal刷新ui的方法
2019/01/11 Python
对Python3 goto 语句的使用方法详解
2019/02/16 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
Python爬虫设置ip代理过程解析
2020/07/20 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
自荐信包含哪些内容
2013/10/30 职场文书
奥巴马演讲稿
2014/01/08 职场文书
美术课外活动总结
2014/07/08 职场文书
营销总经理岗位职责范本
2014/09/02 职场文书
催款函范文
2015/06/24 职场文书
源码安装apache脚本部署过程详解
2022/09/23 Servers