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实现以时间换空间的缓存替换算法
Feb 19 Python
Python字典操作详细介绍及字典内建方法分享
Jan 04 Python
python 文件查找及内容匹配方法
Oct 25 Python
Python Excel处理库openpyxl使用详解
May 09 Python
如何更优雅地写python代码
Jul 02 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
对pytorch中的梯度更新方法详解
Aug 20 Python
详解Python3 pickle模块用法
Sep 16 Python
python socket 聊天室实例代码详解
Nov 14 Python
python中pyplot基础图标函数整理
Nov 10 Python
python源码剖析之PyObject详解
May 18 Python
python3 字符串str和bytes相互转换
Mar 23 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中include()与require()的区别说明
2010/03/10 PHP
提高PHP编程效率的53个要点(经验小结)
2010/09/04 PHP
PHP include_path设置技巧分享
2011/07/03 PHP
我的php学习笔记(毕业设计)
2012/02/21 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
ExtJS[Desktop]实现图标换行示例代码
2013/11/17 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
plupload+artdialog实现多平台上传文件
2016/07/19 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
详解Vue使用命令行搭建单页面应用
2017/05/24 Javascript
vue短信验证性能优化如何写入localstorage中
2018/04/25 Javascript
vue中$refs, $emit, $on, $once, $off的使用详解
2019/05/26 Javascript
vue项目出现页面空白的解决方案
2019/10/31 Javascript
Python实现从URL地址提取文件名的方法
2015/05/15 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
python实现抖音点赞功能
2019/04/07 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
基于Tensorflow一维卷积用法详解
2020/05/22 Python
如何实现一个python函数装饰器(Decorator)
2020/10/12 Python
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
html5的自定义data-*属性与jquery的data()方法的使用
2014/07/02 HTML / CSS
加拿大床上用品、家居装饰、厨房和浴室产品购物网站:Linen Chest
2018/06/05 全球购物
GAZMAN官网:澳大利亚领先的男装品牌
2019/12/19 全球购物
工商学院毕业生个人自我评价
2013/09/19 职场文书
自荐信的两点禁忌
2013/10/30 职场文书
装饰活动策划方案
2014/02/11 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
事业单位年度考核个人总结
2015/02/12 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
如何写通讯稿
2015/07/22 职场文书
MongoDB 常用的crud操作语句
2021/06/20 MongoDB
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python
MySQL如何使备份得数据保持一致
2022/05/02 MySQL