基于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操作列表之List.insert()方法的使用
May 20 Python
在Apache服务器上同时运行多个Django程序的方法
Jul 22 Python
Python开发如何在ubuntu 15.10 上配置vim
Jan 25 Python
python实现人民币大写转换
Jun 20 Python
Python一个简单的通信程序(客户端 服务器)
Mar 06 Python
python3.4 将16进制转成字符串的实例
Jun 12 Python
python之mock模块基本使用方法详解
Jun 27 Python
numpy.ndarray 实现对特定行或列取值
Dec 05 Python
flask 实现上传图片并缩放作为头像的例子
Jan 09 Python
在Tensorflow中实现梯度下降法更新参数值
Jan 23 Python
Python confluent kafka客户端配置kerberos认证流程详解
Oct 12 Python
Python实现学生管理系统并生成exe可执行文件详解流程
Jan 22 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函数)
2006/10/09 PHP
jQuery与ExtJS之选择实例分析
2010/08/19 Javascript
js获取指定的cookie的具体实现
2014/02/20 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
2014/05/23 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
jQuery实现复选框成对选择及对应取消的方法
2015/03/03 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
2019/07/24 Javascript
解决layer.confirm选择完之后消息框不消失的问题
2019/09/16 Javascript
JavaScript实现省份城市的三级联动
2020/02/11 Javascript
解决在Vue中使用axios POST请求变成OPTIONS的问题
2020/08/14 Javascript
python解析中国天气网的天气数据
2014/03/21 Python
初学python的操作难点总结(新手必看篇)
2017/08/03 Python
Python实现基于C/S架构的聊天室功能详解
2018/07/07 Python
Django框架中间件(Middleware)用法实例分析
2019/05/24 Python
Django中在xadmin中集成DjangoUeditor过程详解
2019/07/24 Python
Python学习笔记之函数的定义和作用域实例详解
2019/08/13 Python
一文了解python 3 字符串格式化 F-string 用法
2020/03/04 Python
Python pandas如何向excel添加数据
2020/05/22 Python
Python通过队列来实现进程间通信的示例
2020/10/14 Python
如何用Java实现列出某个目录下的所有子目录
2015/07/20 面试题
高校学生干部的自我评价分享
2013/11/04 职场文书
在校硕士自我鉴定
2014/01/23 职场文书
电气自动化求职信
2014/06/24 职场文书
会员活动策划方案
2014/08/19 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
2016优秀员工先进事迹材料
2016/02/25 职场文书
表扬稿表扬信的格式及范文
2019/06/24 职场文书
Python字符串对齐方法使用(ljust()、rjust()和center())
2021/04/26 Python
在Django中使用MQTT的方法
2021/05/10 Python
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis
springBoot基于webSocket实现扫码登录
2021/06/22 Java/Android
我们认为中短波广播场强仪的最佳组合
2022/04/05 无线电
python前后端自定义分页器
2022/04/13 Python