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基于Tkinter的HelloWorld入门实例
Jun 17 Python
日常整理python执行系统命令的常见方法(全)
Oct 22 Python
Python使用Mechanize模块编写爬虫的要点解析
Mar 31 Python
python实现八大排序算法(1)
Sep 14 Python
python编程线性回归代码示例
Dec 07 Python
python pyheatmap包绘制热力图
Nov 09 Python
pycharm创建一个python包方法图解
Apr 10 Python
Python3网络爬虫中的requests高级用法详解
Jun 18 Python
梅尔频率倒谱系数(mfcc)及Python实现
Jun 18 Python
python进程间通信Queue工作过程详解
Nov 01 Python
Python模块_PyLibTiff读取tif文件的实例
Jan 13 Python
Python代码实现双链表
May 25 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使用glob函数遍历文件和目录详解
2016/09/23 PHP
常用简易JavaScript函数
2009/04/09 Javascript
jQuery 处理网页内容的实现代码
2010/02/15 Javascript
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
Javascript 实现复制(Copy)动作方法大全
2014/06/20 Javascript
JavaScript更改字符串的大小写
2015/05/07 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
微信小程序WebSocket实现聊天对话功能
2018/07/06 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
Antd-vue Table组件添加Click事件,实现点击某行数据教程
2020/11/17 Javascript
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
Python 详解基本语法_函数_返回值
2017/01/22 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
简单了解python变量的作用域
2019/07/30 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
Python列表如何更新值
2020/05/27 Python
Python绘制动态水球图过程详解
2020/06/03 Python
html5基础教程常用技巧整理
2013/08/20 HTML / CSS
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
西班牙在线宠物食品和配件商店:bitiba
2019/10/11 全球购物
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
个人找工作的自我评价
2013/10/17 职场文书
生日派对邀请函
2014/01/13 职场文书
清洁工岗位职责
2014/01/29 职场文书
市场部经理岗位职责
2015/02/02 职场文书
金陵十三钗观后感
2015/06/04 职场文书
十七岁的单车观后感
2015/06/12 职场文书
教师外出学习心得体会
2016/01/18 职场文书
幼儿园教师教学反思
2016/03/02 职场文书
会计专业自荐信范文
2019/05/22 职场文书
创业计划书之酒店
2019/08/30 职场文书