基于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 getopt详解及简单实例
Dec 30 Python
Python单体模式的几种常见实现方法详解
Jul 28 Python
Django添加favicon.ico图标的示例代码
Aug 07 Python
解决Python下imread,imwrite不支持中文的问题
Dec 05 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
Jan 29 Python
python3字符串操作总结
Jul 24 Python
Django对接支付宝实现支付宝充值金币功能示例
Dec 17 Python
python scrapy重复执行实现代码详解
Dec 28 Python
使用PyQt5实现图片查看器的示例代码
Apr 21 Python
Python3.9新特性详解
Oct 10 Python
pandas apply使用多列计算生成新的列实现示例
Feb 24 Python
tensorflow中的梯度求解及梯度裁剪操作
May 26 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
PHP笔记之:基于面向对象设计的详解
2013/05/14 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
PHP Swoole异步MySQL客户端实现方法示例
2019/10/24 PHP
php+websocket 实现的聊天室功能详解
2020/05/27 PHP
js实现广告漂浮效果的小例子
2013/07/02 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
jQuery实现文本框邮箱输入自动补全效果
2015/11/17 Javascript
Javascript基础知识盲点总结之函数
2016/05/15 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
2017/03/21 jQuery
nodejs 搭建简易服务器的图文教程(推荐)
2017/07/18 NodeJs
理解javascript async的用法
2017/08/22 Javascript
Angular4开发解决跨域问题详解
2017/08/28 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
vue中多个倒计时实现代码实例
2019/03/27 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
2020/12/08 Vue.js
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
[00:35]可解锁地面特效
2018/12/20 DOTA
在Django的session中使用User对象的方法
2015/07/23 Python
django在接受post请求时显示403forbidden实例解析
2018/01/25 Python
django 按时间范围查询数据库实例代码
2018/02/11 Python
Python 通过调用接口获取公交信息的实例
2018/12/17 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
2019/03/30 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
详解python环境安装selenium和手动下载安装selenium的方法
2020/03/17 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
详解CSS3的图层阴影和文字阴影效果使用
2016/06/09 HTML / CSS
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
在线购买澳大利亚设计师手拿包和奢华晚装手袋:Olga Berg
2019/03/20 全球购物
简单而又朴实的个人求职信分享
2013/12/12 职场文书
校园歌咏比赛主持词
2014/03/18 职场文书
解放思想大讨论活动心得体会
2014/09/11 职场文书
工作自我推荐信范文
2015/03/25 职场文书
公司前台接待岗位职责
2015/04/03 职场文书