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 相关文章推荐
python3访问sina首页中文的处理方法
Feb 24 Python
理解python正则表达式
Jan 15 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
Nov 01 Python
使用Python爬取最好大学网大学排名
Feb 24 Python
对Python使用mfcc的两种方式详解
Jan 09 Python
python pandas获取csv指定行 列的操作方法
Jul 12 Python
python多线程案例之多任务copy文件完整实例
Oct 29 Python
pytorch中的自定义数据处理详解
Jan 06 Python
python-docx文件定位读取过程(尝试替换)
Feb 13 Python
浅谈python量化 双均线策略(金叉死叉)
Jun 03 Python
解决python中0x80072ee2错误的方法
Jul 19 Python
pytorch 两个GPU同时训练的解决方案
Jun 01 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
用C/C++扩展你的PHP 为你的php增加功能
2012/09/06 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
2014/06/25 PHP
thinkPHP5.0框架URL访问方法详解
2017/03/18 PHP
PHP 实现公历日期与农历日期的互转换
2017/09/13 PHP
php 可变函数使用小结
2018/06/12 PHP
jQuery 位置插件
2008/12/25 Javascript
javascript自定义的addClass()方法
2014/05/28 Javascript
详解JavaScript语法对{}处理的坑爹之处
2014/06/05 Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
2014/07/30 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
Javascript设计模式之观察者模式(推荐)
2016/03/29 Javascript
javascript 定时器工作原理分析
2016/12/03 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
vue中v-for循环给标签属性赋值的方法
2018/10/18 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
微信小程序实现富文本图片宽度自适应的方法
2019/01/20 Javascript
vue项目出现页面空白的解决方案
2019/10/31 Javascript
jQuery HTML css()方法与css类实例详解
2020/05/20 jQuery
跟老齐学Python之正规地说一句话
2014/09/28 Python
使用Python神器对付12306变态验证码
2016/01/05 Python
浅谈Python类的__getitem__和__setitem__特殊方法
2016/12/25 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
2018/12/06 Python
Python中常用的内置方法
2019/01/28 Python
windows、linux下打包Python3程序详细方法
2020/03/17 Python
Python日志处理模块logging用法解析
2020/05/19 Python
英国独特礼物想法和个性化礼物网站:notonthehighstreet.com
2018/04/16 全球购物
类成员函数的重载、覆盖和隐藏区别
2016/01/27 面试题
测量实习生自我鉴定
2013/09/19 职场文书
会务接待方案
2014/02/27 职场文书
广告设计应届生求职信
2014/03/01 职场文书
2016年高校自主招生自荐信范文
2015/03/24 职场文书
2015年村计划生育工作总结
2015/04/28 职场文书
2016年度创先争优活动总结
2016/04/05 职场文书
MySQL sql_mode修改不生效的原因及解决
2021/05/07 MySQL
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android