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在linux中输出带颜色的文字的方法
Jun 19 Python
跟老齐学Python之数据类型总结
Sep 24 Python
python的re模块应用实例
Sep 26 Python
python基于pyDes库实现des加密的方法
Apr 29 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
Apr 25 Python
浅谈pycharm使用及设置方法
Sep 09 Python
python中栈的原理及实现方法示例
Nov 27 Python
Python使用ElementTree美化XML格式的操作
Mar 06 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
Jun 23 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
Oct 15 Python
Window10上Tensorflow的安装(CPU和GPU版本)
Dec 15 Python
python日志通过不同的等级打印不同的颜色(示例代码)
Jan 13 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
海贼王:最美的悬赏令!
2020/03/02 日漫
php输入流php://input使用浅析
2014/09/02 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
2014/01/26 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
node.js中的fs.lchmod方法使用说明
2014/12/16 Javascript
Jquery动态添加输入框的方法
2015/05/29 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
2016/08/01 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
2016/08/26 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
2017/02/21 Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
2017/07/20 Javascript
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
原生js代码能实现call和bind吗
2019/07/31 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
2019/09/30 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
JavaScript实现多个物体同时运动
2020/03/12 Javascript
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
解决removeEventListener 无法清除监听的问题
2020/10/30 Javascript
python多进程操作实例
2014/11/21 Python
Numpy将二维数组添加到空数组的实现
2019/12/05 Python
Python模块_PyLibTiff读取tif文件的实例
2020/01/13 Python
Django 自定义404 500等错误页面的实现
2020/03/08 Python
VSCODE配置Markdown及Markdown基础语法详解
2021/01/19 Python
HTML5在线预览PDF的示例代码
2017/09/14 HTML / CSS
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
营业员实习自我鉴定
2013/12/07 职场文书
父亲的菜园教学反思
2014/02/13 职场文书
平安建设工作方案
2014/06/02 职场文书
超市收银员岗位职责
2015/04/07 职场文书
消防安全主题班会
2015/08/12 职场文书
教你使用VS Code的MySQL扩展管理数据库的方法
2022/01/22 MySQL
python数字图像处理:图像简单滤波
2022/06/28 Python