基于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的urllib库提交WEB表单
Feb 24 Python
使用PYTHON创建XML文档
Mar 01 Python
Django卸载之后重新安装的方法
Mar 15 Python
Python 实现购物商城,含有用户入口和商家入口的示例
Sep 15 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
Feb 13 Python
Python KMeans聚类问题分析
Feb 23 Python
图文详解Django使用Pycharm连接MySQL数据库
Aug 09 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
Oct 23 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
Feb 17 Python
pytorch中的weight-initilzation用法
Jun 24 Python
Python采集爬取京东商品信息和评论并存入MySQL
Apr 12 Python
Python实现仓库管理系统
May 30 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
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
2010/05/04 PHP
PHP CURL获取返回值的方法
2014/05/04 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
2016/05/09 PHP
php preg_match的匹配不同国家语言实例
2016/12/29 PHP
PHP钩子与简单分发方式实例分析
2017/09/04 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
再谈Yii Framework框架中的事件event原理与应用
2020/04/07 PHP
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
chrome浏览器不支持onmouseleave事件的解决技巧
2013/05/31 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
使用jQuery的attr方法来修改onclick值
2014/07/07 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
js创建对象几种方式的优缺点对比
2016/09/28 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
详解js几个绕不开的事件兼容写法
2017/08/30 Javascript
vue2.0实现移动端的输入框实时检索更新列表功能
2018/05/08 Javascript
python 第三方库的安装及pip的使用详解
2017/05/11 Python
Python进阶_关于命名空间与作用域(详解)
2017/05/29 Python
python实现QQ空间自动点赞功能
2019/04/09 Python
python简单鼠标自动点击某区域的实例
2019/06/25 Python
python3实现二叉树的遍历与递归算法解析(小结)
2019/07/03 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
利用Python如何画一颗心、小人发射爱心
2021/02/21 Python
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
Myprotein俄罗斯官网:欧洲第一运动营养品牌
2019/05/05 全球购物
JSF界面控制层技术
2013/06/17 面试题
在校生汽车维修实习自我鉴定
2013/09/19 职场文书
工厂仓管员岗位职责
2014/01/01 职场文书
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
“三支一扶”支教教师思想汇报
2014/09/13 职场文书
家长通知书家长意见
2015/06/03 职场文书
保险公司增员口号
2015/12/25 职场文书
Django+Celery实现定时任务的示例
2021/06/23 Python
教你部署vue项目到docker
2022/04/05 Vue.js