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模块restful使用方法实例
Dec 10 Python
Python中optparse模块使用浅析
Jan 01 Python
在Python的struct模块中进行数据格式转换的方法
Jun 17 Python
Python数据库的连接实现方法与注意事项
Feb 27 Python
Windows上使用virtualenv搭建Python+Flask开发环境
Jun 07 Python
python调用系统ffmpeg实现视频截图、http发送
Mar 06 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
Apr 05 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 Python
pytorch方法测试——激活函数(ReLU)详解
Jan 15 Python
python相对企业语言优势在哪
Jun 12 Python
使用keras时input_shape的维度表示问题说明
Jun 29 Python
Python修改DBF文件指定列
Dec 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初学入门
2006/11/19 PHP
php 删除一个数组中的某个值.兼容多维数组!
2012/02/18 PHP
PHP中STDCLASS用法实例分析
2016/11/11 PHP
根据分辨率不同,调用不同的css文件
2006/08/25 Javascript
document.onreadystatechange事件的用法分析
2009/10/17 Javascript
JS左右无缝滚动(一般方法+面向对象方法)
2012/08/17 Javascript
js中的关联数组与普通数组详解
2016/07/27 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
微信小程序 出现错误:{"baseresponse":{"errcode":-80002,"errmsg":""}}解决办法
2017/02/23 Javascript
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
常用的几个JQuery代码片段
2017/03/13 Javascript
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
jQuery使用unlock.js插件实现滑动解锁
2017/04/04 jQuery
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
原JS实现banner图的常用功能
2017/06/12 Javascript
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
2017/12/12 Javascript
python每次处理固定个数的字符的方法总结
2013/01/29 Python
Python格式化css文件的方法
2015/03/10 Python
Python3 socket同步通信简单示例
2017/06/07 Python
Python爬取当当、京东、亚马逊图书信息代码实例
2017/12/09 Python
python使用tensorflow保存、加载和使用模型的方法
2018/01/31 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
Python 修改列表中的元素方法
2018/06/26 Python
python读取和保存图片5种方法对比
2018/09/12 Python
pytorch 固定部分参数训练的方法
2019/08/17 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
python网络编程之五子棋游戏
2020/05/14 Python
Python常用数字处理基本操作汇总
2020/09/10 Python
Python爬虫回测股票的实例讲解
2021/01/22 Python
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
大学生十八大感想
2015/08/11 职场文书
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
2021/04/22 PostgreSQL
Python中的np.argmin()和np.argmax()函数用法
2021/06/02 Python