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 相关文章推荐
python数据处理实战(必看篇)
Jun 11 Python
python针对excel的操作技巧
Mar 13 Python
对Python3中的input函数详解
Apr 22 Python
PyQt5 pyqt多线程操作入门
May 05 Python
Django migrations 默认目录修改的方法教程
Sep 28 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
使用python Telnet远程登录执行程序的方法
Jan 26 Python
numpy基础教程之np.linalg
Feb 12 Python
使用python实现男神女神颜值打分系统(推荐)
Oct 31 Python
详解有关PyCharm安装库失败的问题的解决方法
Feb 02 Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 Python
python 多线程死锁问题的解决方案
Aug 25 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游戏编程25个脚本代码
2011/02/08 PHP
获取PHP警告错误信息的解决方法
2013/06/03 PHP
$_GET['goods_id']+0 的使用详解
2013/06/06 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
2014/07/01 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
理解JavaScript中的事件
2006/09/23 Javascript
ExtJS中文乱码之GBK格式编码解决方案及代码
2013/01/20 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
JSON格式化输出
2014/11/10 Javascript
jquery 插件实现多行文本框[textarea]自动高度
2015/03/04 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
全面理解JavaScript中的闭包
2016/05/12 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
JavaScript实现复制文章自动添加版权
2016/08/02 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
详解React中的组件通信问题
2017/07/31 Javascript
6行代码实现微信小程序页面返回顶部效果
2018/12/28 Javascript
vue render函数动态加载img的src路径操作
2020/10/26 Javascript
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
关于Numpy数据类型对象(dtype)使用详解
2019/11/27 Python
django框架auth模块用法实例详解
2019/12/10 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
小学教师学期末自我评价
2013/09/25 职场文书
工业自动化专业毕业生推荐信
2013/11/18 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
2014第二批党员干部对照“四风”找差距检查材料思想汇报
2014/09/18 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书
会计工作态度自我评价
2015/03/06 职场文书
在校生证明
2015/06/17 职场文书
军训心得体会范文(2016最新篇)
2016/01/11 职场文书
win11无法添加打印机怎么办? 提示windows无法打开添加打印机的解决办法
2022/04/05 数码科技
win10电脑右下角输入法图标不见了?Win10右下角不显示输入法的解决方法
2022/07/23 数码科技