Python实现KNN邻近算法


Posted in Python onJanuary 28, 2021

简介

邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。

kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。

本文将采用Python和numpy库实现KNN的核心算法,并使用一个简单的例子进行验证。

KNN核心算法的实现

对于KNN算法实现,首先我们计算欧式空间距离,然后根据距离排序,找到k个紧邻,找出最相近的分类。

from numpy import tile 
import operator 
 
def do_knn_classifier(in_array, data_set, labels, k): 
 ''''' 
 classify the in_array according the data set and labels 
 ''' 
 
 #计算距离适量 
 data_set_size = data_set.shape[0] 
 diff_matrix = tile(in_array, (data_set_size, 1)) - data_set 
 sq_diff_matrix = diff_matrix ** 2 
 sq_distance = sq_diff_matrix.sum(axis=1) 
 distances = sq_distance ** 0.5 
 
 #argsort函数返回的是数组值从小到大的索引值, 距离排序 
 sorted_dist_indicies = distances.argsort() 
 
 # 选择K个紧邻 
 class_count = {} 
 for i in range(k): 
 vote_label = labels[sorted_dist_indicies[i]] 
 class_count[vote_label] = class_count.get(vote_label, 0) + 1 
 
 #排序,并返回最相邻的分类 
 sorted_class_count = sorted(class_count.iteritems(), key=operator.itemgetter(1), reverse=True) 
 
 return sorted_class_count[0][0]

数值的归一化

多数情况下,由于选择的特征值取值范围比较大。在处理这种不同取值范围的特征值时,通常需要采用的方法就是将数值归一化,如将取值范围处理到0到1或-1到1之间。下面的公式可以将任意取值范围的特征值转化为0到1的区间内的值:
newValue = (oldValue - min) / (max - min)
其中min和max分别是数据集中的最小特征值和最大特征值。

from numpy import tile 
import operator 
 
def auto_normalize_data(data_set): 
 ''''' 
 对数据集进行归一化操作 
 ''' 
 # 参数0使函数可以从列中选取最小值,而不是当前行的最小值 
 min_vals = data_set.min(0) 
 max_vals = data_set.max(0) 
 ranges = max_vals - min_vals 
 
 
 # 归一化处理 
 m = data_set.shape[0] 
 norm_data_set = data_set - tile(min_vals, (m, 1)) 
 norm_data_set = norm_data_set / tile(ranges, (m, 1)) 
 
 return norm_data_set, ranges, min_vals

实例

以一个简单的例子来结束本文的介绍。在这里并不需要实现数据的归一化处理。

from numpy import array 
from knn.knn_classifier import do_knn_classifier 
 
def get_data_set(): 
 ''''' 
 Get data set and labels 
 ''' 
 group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]]) 
 labels = ['A', 'A', 'B', 'B'] 
 
 return group, labels 
 
if __name__ == '__main__': 
 data_set, labels = get_data_set() 
 
 t = do_knn_classifier(array([0.2, 0.1]), data_set, labels, 3) 
 print t

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

Python 相关文章推荐
使用PDB简单调试Python程序简明指南
Apr 25 Python
python实现同时给多个变量赋值的方法
Apr 30 Python
Python内置函数OCT详解
Nov 09 Python
python中matplotlib实现最小二乘法拟合的过程详解
Jul 11 Python
Python格式化输出%s和%d
May 07 Python
python实现括号匹配的思路详解
Aug 23 Python
python 判断文件还是文件夹的简单实例
Jun 10 Python
Tensorflow实现酸奶销量预测分析
Jul 19 Python
Python如何实现邮件功能
May 27 Python
python一些性能分析的技巧
Aug 30 Python
Pycharm学生免费专业版安装教程的方法步骤
Sep 24 Python
python中最小二乘法详细讲解
Feb 19 Python
Python+matplotlib+numpy绘制精美的条形统计图
Jan 02 #Python
基于Python实现的ID3决策树功能示例
Jan 02 #Python
python实现基于SVM手写数字识别功能
May 27 #Python
Python中字典的浅拷贝与深拷贝用法实例分析
Jan 02 #Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
Jan 02 #Python
Python实现进程同步和通信的方法
Jan 02 #Python
mac系统安装Python3初体验
Jan 02 #Python
You might like
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
javascript document.referrer 用法
2009/04/30 Javascript
ExtJs事件机制基本代码模型和流程解析
2010/10/24 Javascript
iframe 上下滚动条如何默认在下方实现原理
2012/12/10 Javascript
Extjs4中Form的使用之本地hiddenfield
2013/11/26 Javascript
angularjs的一些优化小技巧
2014/12/06 Javascript
node.js中的fs.futimes方法使用说明
2014/12/17 Javascript
JavaScript模拟实现继承的方法
2015/03/30 Javascript
深入浅析react native es6语法
2015/12/09 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
2016/12/20 Javascript
javascript实现简单的ajax封装示例
2016/12/28 Javascript
Angularjs 双向绑定时字符串的转换成数字类型的问题
2017/06/12 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
关于JavaScript的单双引号嵌套问题
2017/08/20 Javascript
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
ES6使用export和import实现模块化的方法
2018/09/10 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
2019/03/14 Javascript
Vue组件模板的几种书写形式(3种)
2020/02/19 Javascript
微信小程序实现签到弹窗动画
2020/09/21 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
Python json模块使用实例
2015/04/11 Python
Python爬取网易云音乐热门评论
2017/03/31 Python
python使用Plotly绘图工具绘制气泡图
2019/04/01 Python
html5 Canvas实现图片旋转的示例
2018/01/15 HTML / CSS
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
清洁工表扬信
2014/01/08 职场文书
保密工作实施方案
2014/02/24 职场文书
党员群众路线整改措施及今后努力方向
2014/10/28 职场文书
2015年大学班级工作总结
2015/04/28 职场文书
MySQL 慢查询日志深入理解
2021/04/22 MySQL
Django如何创作一个简单的最小程序
2021/05/12 Python