基于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使用点操作符访问字典(dict)数据的方法
Mar 16 Python
pycharm 配置远程解释器的方法
Oct 28 Python
对python的bytes类型数据split分割切片方法
Dec 04 Python
详解python-图像处理(映射变换)
Mar 22 Python
python如何将两个txt文件内容合并
Oct 18 Python
pandas实现将日期转换成timestamp
Dec 07 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
python垃圾回收机制(GC)原理解析
Dec 30 Python
python语言中有算法吗
Jun 16 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
Aug 27 Python
PyQt实现计数器的方法示例
Jan 18 Python
python OpenCV学习笔记
Mar 31 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数字运算验证码的实现代码
2015/07/30 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
2016/03/23 PHP
PHP实现限制域名访问的实现代码(本地验证)
2020/09/13 PHP
js 事件小结 表格区别
2007/08/13 Javascript
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
js操作checkbox遇到的问题解决
2013/06/29 Javascript
javascript实现数字验证码的简单实例
2014/02/10 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
javascript实现获取服务器时间
2015/05/19 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
React-Native左右联动List的示例代码
2017/09/21 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
js实现无缝滚动双图切换效果
2019/07/09 Javascript
Vue2.0 实现页面缓存和不缓存的方式
2019/11/12 Javascript
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
python实现RabbitMQ的消息队列的示例代码
2018/11/08 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
2021/01/12 Python
关于iframe跨域使用postMessage的实现
2019/10/29 HTML / CSS
波比布朗英国官网:Bobbi Brown英国
2017/11/13 全球购物
酒店个人培训自我鉴定
2013/12/11 职场文书
药学专业大专生的自我评价
2013/12/12 职场文书
高中军训感言500字
2014/02/24 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
教师个人读书活动总结
2014/07/08 职场文书
生活部的活动方案
2014/08/19 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
单位工作证明
2014/10/07 职场文书
党的群众路线教育实践活动个人整改落实情况汇报
2014/10/28 职场文书
2014年司机工作总结
2014/11/21 职场文书
公司庆典主持词
2015/07/04 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis