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 相关文章推荐
Tornado协程在python2.7如何返回值(实现方法)
Jun 22 Python
pytorch 数据集图片显示方法
Jul 26 Python
Python中xml和json格式相互转换操作示例
Dec 05 Python
DES加密解密算法之python实现版(图文并茂)
Dec 06 Python
python合并已经存在的sheet数据到新sheet的方法
Dec 11 Python
python中使用 xlwt 操作excel的常见方法与问题
Jan 13 Python
python sort、sort_index方法代码实例
Mar 28 Python
Python3基础教程之递归函数简单示例
Jun 07 Python
Python如何获取Win7,Win10系统缩放大小
Jan 10 Python
Python可以实现栈的结构吗
May 27 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
Jun 04 Python
如何在mac下配置python虚拟环境
Jul 06 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使用json_encode函数时不转义中文的解决方法
2014/11/12 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
PHP简单创建压缩图的方法
2016/08/24 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
2016/12/23 PHP
PHP基于curl模拟post提交json数据示例
2018/06/22 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
PHP7 参数处理机制修改
2021/03/09 PHP
javascript模拟枚举的简单实例
2014/03/06 Javascript
jQuery遍历Table应用示例
2014/04/09 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
2016/01/26 Javascript
ES6学习教程之对象字面量详解
2017/10/09 Javascript
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
javascript 内存模型实例详解
2020/04/18 Javascript
VueQuillEditor富文本上传图片(非base64)
2020/06/03 Javascript
pip安装Python库时遇到的问题及解决方法
2017/11/23 Python
轻松实现TensorFlow微信跳一跳的AI
2018/01/05 Python
python自动截取需要区域,进行图像识别的方法
2018/05/17 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
Python3中_(下划线)和__(双下划线)的用途和区别
2019/04/26 Python
Python 合并多个TXT文件并统计词频的实现
2019/08/23 Python
linux 下selenium chrome使用详解
2020/04/02 Python
django queryset相加和筛选教程
2020/05/18 Python
Python selenium爬取微信公众号文章代码详解
2020/08/12 Python
简述python&pytorch 随机种子的实现
2020/10/07 Python
配置H5的滚动条样式的示例代码
2018/03/09 HTML / CSS
香港最新科技与优质家居产品购物网站:J SELECT
2018/08/21 全球购物
美国健康和保健平台:healtop
2020/07/02 全球购物
30年同学聚会邀请函
2014/01/25 职场文书
致百米运动员广播稿
2014/01/29 职场文书
葬礼司仪主持词
2014/03/31 职场文书
公积金具结保证书
2015/05/11 职场文书
中小学教师继续教育心得体会
2016/01/19 职场文书
java实现对Hadoop的操作
2021/07/01 Java/Android