基于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练习程序批量修改文件名
Jan 16 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
Jun 30 Python
Django查询数据库的性能优化示例代码
Sep 24 Python
python画出三角形外接圆和内切圆的方法
Jan 25 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
Jul 17 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
python 判断三个数字中的最大值实例代码
Jul 24 Python
python mysql断开重连的实现方法
Jul 26 Python
Tensorflow获取张量Tensor的具体维数实例
Jan 19 Python
Python @property装饰器原理解析
Jan 22 Python
Python递归调用实现数字累加的代码
Feb 25 Python
如何在Python3中使用telnetlib模块连接网络设备
Sep 21 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
星际争霸 Starcraft 秘技补丁
2020/03/14 星际争霸
PHP实现原生态图片上传封装类方法
2016/11/08 PHP
FF IE兼容性的修改小结
2009/09/02 Javascript
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
Js sort排序使用方法
2011/10/17 Javascript
js+css实现的简单易用兼容好的分页
2013/12/30 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
jQuery产品间断向下滚动效果核心代码
2014/05/08 Javascript
JavaScript计时器示例分析
2015/02/05 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
jquery 验证用户名是否重复代码实例
2019/05/14 jQuery
如何通过JS实现日历简单算法
2020/10/14 Javascript
[02:56]DOTA2上海特锦赛小组赛解说FreeAgain采访花絮
2016/02/27 DOTA
简析Python的闭包和装饰器
2016/02/26 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
Pandas 同元素多列去重的实例
2018/07/03 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
2018/08/07 Python
Python在cmd上打印彩色文字实现过程详解
2019/08/07 Python
Python操作远程服务器 paramiko模块详细介绍
2019/08/07 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
2019/10/23 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
Django ValuesQuerySet转json方式
2020/03/16 Python
Python中remove漏删和索引越界问题的解决
2020/03/18 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
scrapy处理python爬虫调度详解
2020/11/23 Python
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
逻辑链路控制协议
2016/10/01 面试题
环境卫生标语
2014/06/09 职场文书
求职意向书
2014/07/29 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
债务追讨授权委托书范本
2014/10/16 职场文书
2016国庆节67周年红领巾广播稿
2015/12/18 职场文书