基于python实现KNN分类算法


Posted in Python onApril 23, 2020

kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。

通俗简单的说,就是将这个样本进行分类,怎么分类,就是用该样本的特征与空间中其他样本做计算距离,当出现大多数距离偏向于某个样本类时,我们认为该样本属于这个类别。

举例说明:淘宝商品是按类进行售卖的,对于零食类商品a,b,c,价格与销量分别对应(19,1000),(89,500),(9.9,3000)对与电器类商品d,e,f,价格与销量分别为(1000,10),(499,30),(999,100),对于一个未知的产品(300,80),我们使用kNN算法进行求解,我们假设k=3(k的值要时情况而定,没有确定的),分别求出未知产品到这六个点的欧式距离,即:sqrt((x1-y1)**2+(x2-y2)**2)计算出结果进行倒序排序,我们得出前三的点分别为:e,b,f。所以我们认为未知产品是电器类产品,当然实际生活中不能仅仅有价格,销量这两个二维数据,可能是n维数据,欧式距离的公式也是一样的,现实中也不仅仅有这两个分类,kNN提供了一种简单的解决思路。其中a,b,c,d,e,f称为训练数据,未知数据称为测试数据。

还有在进行计算时有时需要格式化一下数据,例如对于c产品与未知产品,明显计算销量所产生的数据要远大于价格,为了减小这个带来的误差,可以使用以下:

def normData(dataSet):
 maxVals = dataSet.max(axis=0)#按列获取最大值,并返回数组
 minVals = dataSet.min(axis=0)
 ranges = maxVals - minVals
 retData = (dataSet - minVals) / ranges
 return retData, ranges, minVals

代码

#!/user/bin/env python
#-*- coding:utf-8 -*-
import numpy as np
import operator as opt

def normData(dataSet):#标准化训练集数据
 maxVals = dataSet.max(axis=0)
 minVals = dataSet.min(axis=0)
 ranges = maxVals - minVals
 retData = (dataSet - minVals) / ranges
 return retData, ranges, minVals

def kNN(dataSet, labels, testData, k):
 distSquareMat = (dataSet - testData) ** 2 # 计算差值的平方
 distSquareSums = distSquareMat.sum(axis=1) # 求每一行的差值平方和,axis=0则按列计算
 distances = distSquareSums ** 0.5 # 开根号,得出每个样本到测试点的距离
 sortedIndices = distances.argsort() # 排序,得到排序后的下标
 indices = sortedIndices[:k] # 取最小的k个
 labelCount = {} # 存储每个label的出现次数,出现次数最多的就是我们要选择的类别
 for i in indices:
 label = labels[i]
 labelCount[label] = labelCount.get(label, 0) + 1 # 次数加一,使用字典的get方法,第一次出现时默认值是0
 sortedCount = sorted(labelCount.items(), key=opt.itemgetter(1), reverse=True) # 对label出现的次数从大到小进行排序
 return sortedCount[0][0] # 返回出现次数最大的label

if __name__ == "__main__":#测试程序
 dataSet = np.array([[2, 3], [6, 8]])#训练集
 normDataSet, ranges, minVals = normData(dataSet)
 labels = ['a', 'b']#训练集分别为a和b类
 testData = np.array([3.9, 5.5])#测试数据
 normTestData = (testData - minVals) / ranges#同样需要将测试数据标准化
 result = kNN(normDataSet, labels, normTestData, 1)#k=1
 print(result)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python的gevent框架下执行异步的Solr查询的教程
Apr 16 Python
Python中异常重试的解决方案详解
May 05 Python
通过字符串导入 Python 模块的方法详解
Oct 27 Python
YUV转为jpg图像的实现
Dec 09 Python
python判断链表是否有环的实例代码
Jan 31 Python
Python文本文件的合并操作方法代码实例
Mar 31 Python
如何基于Python代码实现高精度免费OCR工具
Jun 18 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
Jul 01 Python
Python中的With语句的使用及原理
Jul 29 Python
Python logging自定义字段输出及打印颜色
Nov 30 Python
Python OpenCV实现传统图片格式与base64转换
Jun 13 Python
Pandas自定义选项option设置
Jul 25 Python
python实现定时发送qq消息
Jan 18 #Python
如何在Django中设置定时任务的方法示例
Jan 18 #Python
Python设计模式之工厂方法模式实例详解
Jan 18 #Python
Python设计模式之原型模式实例详解
Jan 18 #Python
基于Python实现迪杰斯特拉和弗洛伊德算法
May 27 #Python
Python中logging实例讲解
Jan 17 #Python
python矩阵/字典实现最短路径算法
Jan 17 #Python
You might like
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
2015/05/11 PHP
Symfony实现行为和模板中取得request参数的方法
2016/03/17 PHP
利用php输出不同的心形图案
2016/04/22 PHP
php解析xml 的四种简单方法(附实例)
2016/07/11 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2019/07/03 PHP
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
Js控制弹窗实现在任意分辨率下居中显示
2013/08/01 Javascript
jQuery控制TR显示隐藏的几种方法
2014/06/18 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
深入理解JavaScript中的浮点数
2016/05/18 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
JavaScript面向对象精要(下部)
2017/09/12 Javascript
JS实现点击复选框变更DIV显示状态的示例代码
2017/12/18 Javascript
JavaScript使用math.js进行精确计算操作示例
2018/06/19 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
详解如何使用node.js的开发框架express创建一个web应用
2018/12/20 Javascript
微信小程序使用canvas自适应屏幕画海报并保存图片功能
2019/07/25 Javascript
tweenjs缓动算法的使用实例分析
2019/08/26 Javascript
jquery实现拖拽小方块效果
2020/12/10 jQuery
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
Python 编码处理-str与Unicode的区别
2016/09/06 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
Python3 实现爬取网站下所有URL方式
2020/01/16 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
日本网路线上商品代购服务:转送JAPAN
2016/08/05 全球购物
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
美国家居装饰店:Pier 1
2019/09/04 全球购物
澳大利亚网上书店:QBD
2021/01/09 全球购物
会计自我鉴定
2014/02/04 职场文书
《陈涉世家》教学反思
2014/04/12 职场文书
神龙架导游词
2015/02/11 职场文书
员工升职自荐信
2015/03/27 职场文书