基于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选择排序算法的实现代码
Nov 21 Python
Python实现的几个常用排序算法实例
Jun 16 Python
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
Jul 18 Python
Python多线程经典问题之乘客做公交车算法实例
Mar 22 Python
浅谈python装饰器探究与参数的领取
Dec 01 Python
Python OpenCV获取视频的方法
Feb 28 Python
Python中的Numpy矩阵操作
Aug 12 Python
python redis连接 有序集合去重的代码
Aug 04 Python
python数字类型math库原理解析
Mar 02 Python
Python基于wordcloud及jieba实现中国地图词云图
Jun 09 Python
解决python3.x安装numpy成功但import出错的问题
Nov 17 Python
python实现剪贴板的操作
Jul 01 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
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
2010/05/10 PHP
php中导出数据到excel时数字变为科学计数的解决方法
2013/02/03 PHP
PHP 异步执行方法,模拟多线程的应用分析
2013/06/03 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
2014/01/22 PHP
php递归删除指定文件夹的方法小结
2015/04/20 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
jQuery 解析xml文件
2009/08/09 Javascript
jquery 使用简明教程
2014/03/05 Javascript
用jquery实现的一个超级简单的下拉菜单
2014/05/18 Javascript
javascript实现阻止iOS APP中的链接打开Safari浏览器
2014/06/12 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
js设置document.domain实现跨域的注意点分析
2015/05/21 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
vuex入门最详细整理
2020/03/04 Javascript
详解JavaScript 异步编程
2020/07/13 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
python使用sqlite3时游标使用方法
2018/03/13 Python
Python实现的基于优先等级分配糖果问题算法示例
2018/04/25 Python
解决pandas .to_excel不覆盖已有sheet的问题
2018/12/10 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
2019/04/12 Python
浅谈django channels 路由误导
2020/05/28 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
2020/07/20 Python
阿迪达斯印尼官方网站:adidas印尼
2020/02/10 全球购物
科室工作个人总结的自我评价
2013/10/29 职场文书
数据员岗位职责
2013/11/19 职场文书
四年级数学教学反思
2014/02/02 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
考研英语复习计划
2015/01/19 职场文书
英文版辞职信
2015/02/28 职场文书
中学生打架检讨书之500字
2019/08/06 职场文书
使用 Docker Compose 构建复杂的多容器App
2022/04/30 Servers