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 ljust rjust center输出
Sep 06 Python
python算法学习之基数排序实例
Dec 18 Python
Python通过解析网页实现看报程序的方法
Aug 04 Python
给Python的Django框架下搭建的BLOG添加RSS功能的教程
Apr 08 Python
Python中遍历字典过程中更改元素导致异常的解决方法
May 12 Python
python通过cookie模拟已登录状态的初步研究
Nov 09 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
Apr 12 Python
python 初始化一个定长的数组实例
Dec 02 Python
Pyorch之numpy与torch之间相互转换方式
Dec 31 Python
基于python实现查询ip地址来源
Jun 02 Python
Python内存泄漏和内存溢出的解决方案
Sep 26 Python
Python爬虫之Selenium警告框(弹窗)处理
Dec 04 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数组应用之比较两个时间的相减排序
2008/08/18 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
php JWT在web端中的使用方法教程
2018/09/06 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
用脚本调用样式的几种方法
2006/12/09 Javascript
网页开发中的容易忽略的问题 javascript HTML中的table
2009/04/15 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
php结合imgareaselect实现图片裁剪
2015/07/05 Javascript
JS实现3D图片旋转展示效果代码
2015/09/22 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
javascript设计模式--策略模式之输入验证
2015/11/27 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
JS插件plupload.js实现多图上传并显示进度条
2016/11/29 Javascript
jquery dialog获取焦点的方法
2017/02/09 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
2018/12/11 Javascript
vue项目中使用vue-i18n报错的解决方法
2019/01/13 Javascript
js实现全选反选不选功能代码详解
2019/04/24 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
原生JS实现汇率转换功能代码实例
2020/05/13 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
微信小程序入门之指南针
2020/10/22 Javascript
使用graphics.py实现2048小游戏
2015/03/10 Python
详解python3中socket套接字的编码问题解决
2017/07/01 Python
简单谈谈python中的语句和语法
2017/08/10 Python
python顺序的读取文件夹下名称有序的文件方法
2018/07/11 Python
ipad上运行python的方法步骤
2019/10/12 Python
HTML5 Canvas锯齿图代码实例
2014/04/10 HTML / CSS
EntityManager都有哪些方法
2013/11/01 面试题
师范生实习的个人自我鉴定
2013/10/20 职场文书
人事行政主管岗位职责
2013/12/22 职场文书
大学社团活动策划书
2014/01/26 职场文书
元旦联欢晚会主持词
2015/07/01 职场文书