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里将list中元素依次向前移动一位
Sep 12 Python
以Flask为例讲解Python的框架的使用方法
Apr 29 Python
python利用正则表达式提取字符串
Dec 08 Python
python爬虫框架talonspider简单介绍
Jun 09 Python
Django REST framework 如何实现内置访问频率控制
Jul 23 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
Pytest参数化parametrize使用代码实例
Feb 22 Python
python实现俄罗斯方块游戏(改进版)
Mar 13 Python
Python基于smtplib模块发送邮件代码实例
May 29 Python
pytorch 常用函数 max ,eq说明
Jun 28 Python
Python绘图之二维图与三维图详解
Aug 04 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
Jan 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
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
thinkphp获取栏目和文章当前位置的方法
2014/10/29 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
PHP常用字符串函数用法实例总结
2020/06/04 PHP
把textarea中字符串里含有的回车换行替换成<br>的javascript代码
2007/04/20 Javascript
jQuery实现数字加减效果汇总
2014/12/16 Javascript
jquery小火箭返回顶部代码分享
2015/08/19 Javascript
JS递归遍历对象获得Value值方法技巧
2016/06/14 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
JS正则表达式验证密码格式的集中情况总结
2017/02/23 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
vue生命周期实例小结
2018/08/15 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
2018/12/24 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
Javascript Dom元素获取和添加详解
2019/09/24 Javascript
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
使用Python压缩和解压缩zip文件的教程
2015/05/06 Python
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
Python函数参数匹配模型通用规则keyword-only参数详解
2019/06/10 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
将pycharm配置为matlab或者spyder的用法说明
2020/06/08 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
CSS3 clip-path 用法介绍详解
2018/03/01 HTML / CSS
美国最大的高尔夫发球时间预订网站:TeeOff.com
2018/03/28 全球购物
旅游管理专业学生求职信
2013/09/28 职场文书
电视购物广告词
2014/03/19 职场文书
工伤赔偿协议书范本
2014/04/15 职场文书
大专学生求职自荐信
2014/07/06 职场文书
环境科学专业求职信
2014/08/04 职场文书
小学工作总结2015
2015/05/04 职场文书
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers