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多线程编程(八):使用Event实现线程间通信
Apr 05 Python
详解Python中的循环语句的用法
Apr 09 Python
Python实现LRU算法的2种方法
Jun 24 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
Jun 04 Python
Python中安装easy_install的方法
Nov 18 Python
用xpath获取指定标签下的所有text的实例
Jan 02 Python
在Python 中同一个类两个函数间变量的调用方法
Jan 31 Python
python下载微信公众号相关文章
Feb 26 Python
python中字典按键或键值排序的实现代码
Aug 27 Python
基于python生成英文版词云图代码实例
May 16 Python
python使用XPath解析数据爬取起点小说网数据
Apr 22 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根据日期判断星座的函数分享
2014/02/13 PHP
destoon整合UCenter图文教程
2014/06/21 PHP
PHP整合PayPal支付
2015/06/11 PHP
php的debug相关函数用法示例
2016/07/11 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
Javascript - HTML的request类
2006/07/15 Javascript
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
JavaScript全局函数使用简单说明
2011/03/11 Javascript
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
jQuery ajax serialize() 方法使用示例
2014/11/02 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
JavaScript事件学习小结(一)事件流
2016/06/09 Javascript
微信小程序-详解数据缓存
2016/11/24 Javascript
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
Vue页面骨架屏的实现方法
2018/05/22 Javascript
js调用设备摄像头的方法
2018/07/19 Javascript
mpvue小程序循环动画开启暂停的实现方法
2019/05/15 Javascript
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
利用pyinstaller将py文件打包为exe的方法
2018/05/14 Python
python基础梳理(一)(推荐)
2019/04/06 Python
基于python的ini配置文件操作工具类
2019/04/24 Python
调用其他python脚本文件里面的类和方法过程解析
2019/11/15 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
2021/02/22 Python
详解html5页面 rem 布局适配方法
2018/01/12 HTML / CSS
StubHub新加坡:购买和出售全球活动门票
2017/03/10 全球购物
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
使用C#编写创建一个线程的代码
2013/01/22 面试题
写得不错的求职信范文
2014/07/11 职场文书
安全先进个人材料
2014/12/29 职场文书
周一问候语大全
2015/11/10 职场文书
golang在GRPC中设置client的超时时间
2021/04/27 Golang
MySQL中存储时间的最佳实践指南
2021/07/01 MySQL