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 相关文章推荐
Python实现的Excel文件读写类
Jul 30 Python
利用Python开发实现简单的记事本
Nov 15 Python
Django 生成登陆验证码代码分享
Dec 12 Python
python中(str,list,tuple)基础知识汇总
Feb 20 Python
Python实现的网页截图功能【PyQt4与selenium组件】
Jul 12 Python
python爬取哈尔滨天气信息
Jul 14 Python
Python中文件的写入读取以及附加文字方法
Jan 23 Python
Django ORM 自定义 char 类型字段解析
Aug 09 Python
Pytorch 实现冻结指定卷积层的参数
Jan 06 Python
详解python常用命令行选项与环境变量
Feb 20 Python
使用PyCharm安装pytest及requests的问题
Jul 31 Python
python用tkinter实现一个简易能进行随机点名的界面
Sep 27 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
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
修改WordPress中文章编辑器的样式的方法详解
2015/12/15 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
JavaScript的Cookies
2008/01/16 Javascript
日期处理的js库(迷你版)--自建js库总结
2011/11/21 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
jquery中EasyUI实现同步树
2015/03/01 Javascript
javascript生成随机数方法汇总
2015/11/12 Javascript
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
从parcel.js打包出错到选择nvm的全部过程
2018/01/23 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
vue如何进行动画的封装
2018/09/26 Javascript
qrcode生成二维码微信长按无法识别问题的解决
2019/04/04 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
react组件基本用法示例小结
2020/04/27 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
JS创建自定义对象的六种方法总结
2020/12/15 Javascript
python基础教程之基本内置数据类型介绍
2014/02/20 Python
Python的垃圾回收机制深入分析
2014/07/16 Python
在Python中封装GObject模块进行图形化程序编程的教程
2015/04/14 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
详解Python开发中如何使用Hook技巧
2017/11/01 Python
pandas DataFrame实现几列数据合并成为新的一列方法
2018/06/08 Python
Python利用socket模块开发简单的端口扫描工具的实现
2021/01/27 Python
Nanushka官网:匈牙利服装品牌
2019/08/14 全球购物
好矿嫂事迹材料
2014/01/21 职场文书
个人批评与自我批评总结
2014/10/17 职场文书
挂职锻炼工作总结2015
2015/05/28 职场文书
红色影片观后感
2015/06/18 职场文书
行政处罚告知书
2015/07/01 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书
Java实现学生管理系统(IO版)
2022/02/24 Java/Android