基于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实现全角半角转换的方法
Aug 18 Python
在Django中创建动态视图的教程
Jul 15 Python
Python实现从log日志中提取ip的方法【正则提取】
Mar 31 Python
python将txt文档每行内容循环插入数据库的方法
Dec 28 Python
python如何获取当前文件夹下所有文件名详解
Jan 25 Python
python 计算平均平方误差(MSE)的实例
Jun 29 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
Sep 18 Python
python调用c++返回带成员指针的类指针实例
Dec 12 Python
PyQT5 emit 和 connect的用法详解
Dec 13 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
Apr 20 Python
Selenium关闭INFO:CONSOLE提示的解决
Dec 07 Python
Python中字符串对象语法分享
Feb 24 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
松下Panasonic RF-B65电路分析
2021/03/02 无线电
PHP使用socket发送HTTP请求的方法
2016/02/14 PHP
Yii操作数据库实现动态获取表名的方法
2016/03/29 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
PHP递归删除多维数组中的某个值
2017/04/17 PHP
用js实现计算加载页面所用的时间
2010/04/02 Javascript
node.js中的fs.existsSync方法使用说明
2014/12/17 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
js图片跟随鼠标移动代码
2015/11/26 Javascript
JavaScript必知必会(三) String .的方法来自何方
2016/06/08 Javascript
微信小程序 开发指南详解
2016/09/27 Javascript
seajs学习之模块的依赖加载及模块API的导出
2016/10/20 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
2016/12/03 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
Node调用Java的示例代码
2017/09/20 Javascript
对Vue table 动态表格td可编辑的方法详解
2018/08/28 Javascript
Django+vue跨域问题解决的详细步骤
2019/01/20 Javascript
微信小程序websocket聊天室的实现示例代码
2019/02/12 Javascript
js常见遍历操作小结
2019/06/06 Javascript
vue移动端模态框(可传参)的实现
2019/11/20 Javascript
vue-router 按需加载 component: () => import() 报错的解决
2020/09/22 Javascript
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
用Python编写web API的教程
2015/04/30 Python
Python决策树分类算法学习
2017/12/22 Python
python+matplotlib演示电偶极子实例代码
2018/01/12 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
2018/09/17 Python
python2和python3在处理字符串上的区别详解
2019/05/29 Python
python+selenium 点击单选框-radio的实现方法
2019/09/03 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
俄语地区最大的中国商品在线购物网站之一:Umka Mall
2019/11/03 全球购物
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
教育专业个人求职信
2013/12/02 职场文书
语文教师求职信范文
2015/03/20 职场文书
市场督导岗位职责
2015/04/10 职场文书
不同意离婚答辩状
2015/05/22 职场文书
Mysql表数据比较大情况下修改添加字段的方法实例
2022/06/28 MySQL