基于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实现的HTTP并发测试完整示例
Apr 23 Python
Python的多态性实例分析
Jul 07 Python
Python实现二维有序数组查找的方法
Apr 27 Python
简单讲解Python编程中namedtuple类的用法
Jun 21 Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 Python
Python 25行代码实现的RSA算法详解
Apr 10 Python
Python爬虫之UserAgent的使用实例
Feb 21 Python
Python函数默认参数常见问题及解决方案
Mar 26 Python
python修改微信和支付宝步数的示例代码
Oct 12 Python
10个示例带你掌握python中的元组
Nov 23 Python
基于tensorflow权重文件的解读
May 26 Python
Python实现数据的序列化操作详解
Jul 07 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
星际中一些鲜为人知的详细资料
2020/03/04 星际争霸
用php实现批量查询清除一句话后门的代码
2008/01/20 PHP
PHP 冒泡排序算法的实现代码
2010/08/08 PHP
用PHP读取超大文件的实例代码
2012/04/01 PHP
PHP中设置时区,记录日志文件的实现代码
2013/01/07 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
2014/08/08 PHP
php模拟post提交数据的方法
2015/02/12 PHP
js类中获取外部函数名的方法
2007/08/19 Javascript
学习ExtJS Window常用方法
2009/10/07 Javascript
Textbox控件注册回车事件及触发按钮提交事件具体实现
2013/03/04 Javascript
Javascript Throttle & Debounce应用介绍
2013/03/19 Javascript
使用JQuery 加载页面时调用JS的实现方法
2016/05/30 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
AngularJS入门教程之控制器详解
2016/07/27 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
jquery表单验证实例仿Toast提示效果
2017/03/03 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
jQuery鼠标移动图片上实现放大效果
2017/06/25 jQuery
js使用html2canvas实现屏幕截取的示例代码
2017/08/28 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
微信小程序实现折叠展开效果
2018/07/19 Javascript
微信小程序 Animation实现图片旋转动画示例
2018/08/22 Javascript
vue打开新窗口并实现传参的图文实例
2021/03/04 Vue.js
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
Python中遍历字典过程中更改元素导致异常的解决方法
2016/05/12 Python
深入理解python函数递归和生成器
2016/06/06 Python
Python打包可执行文件的方法详解
2016/09/19 Python
python更改已存在excel文件的方法
2018/05/03 Python
python实现图像拼接
2020/03/05 Python
css3绘制百度的小度熊
2018/10/29 HTML / CSS
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
白宫黑市官网:White House Black Market
2016/11/17 全球购物
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
员工拾金不昧表扬稿
2015/05/05 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书