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进程管理工具supervisor使用实例
Sep 17 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
May 03 Python
python中的字典使用分享
Jul 31 Python
Django数据库操作的实例(增删改查)
Sep 04 Python
django静态文件加载的方法
May 20 Python
python之验证码生成(gvcode与captcha)
Jan 02 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
python with (as)语句实例详解
Feb 04 Python
python新式类和经典类的区别实例分析
Mar 23 Python
利用python汇总统计多张Excel
Sep 22 Python
python 读取yaml文件的两种方法(在unittest中使用)
Dec 01 Python
Python激活Anaconda环境变量的详细步骤
Jun 08 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可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
destoon二次开发入门示例
2014/06/20 PHP
索趣科技的答案
2007/02/07 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
js如何获取兄弟、父类等节点
2014/01/06 Javascript
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
开源的javascript项目Kissy介绍
2014/11/28 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
Javascript验证方法大全
2015/09/21 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
vue keep-alive请求数据的方法示例
2018/05/16 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
2018/10/31 Javascript
js module大战
2019/04/19 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
使用TS来编写express服务器的方法步骤
2020/10/29 Javascript
[01:30]我们共输赢 完美世界城市挑战赛开启全新赛季
2019/04/19 DOTA
python 参数列表中的self 显式不等于冗余
2008/12/01 Python
C#返回当前系统所有可用驱动器符号的方法
2015/04/18 Python
python实现在pandas.DataFrame添加一行
2018/04/04 Python
Python 从相对路径下import的方法
2018/12/04 Python
Python实现将多个空格换为一个空格.md的方法
2018/12/20 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
Python中常用的os操作汇总
2020/11/05 Python
英国高级健康和美容产品零售商:Life and Looks
2019/08/01 全球购物
链表面试题-一个链表的结点结构
2015/05/04 面试题
经济管理专业毕业生自荐信范文
2014/01/02 职场文书
产品质量承诺范本
2014/03/31 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
小学数学教学经验交流材料
2014/05/22 职场文书
2014幼儿园小班工作总结
2014/11/10 职场文书
社区禁毒宣传活动总结
2015/05/07 职场文书
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android