基于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多线程学习资料
Dec 19 Python
最大K个数问题的Python版解法总结
Jun 16 Python
Python随机生成数据后插入到PostgreSQL
Jul 28 Python
Python Web编程之WSGI协议简介
Jul 18 Python
如何使用Python 打印各种三角形
Jun 28 Python
wxPython实现整点报时
Nov 18 Python
pytorch 归一化与反归一化实例
Dec 31 Python
python:删除离群值操作(每一行为一类数据)
Jun 08 Python
python退出循环的方法
Jun 18 Python
python利用paramiko实现交换机巡检的示例
Sep 22 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
Jan 09 Python
Python matplotlib可视化之绘制韦恩图
Feb 24 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
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
2015/01/26 PHP
PHP访问Google Search API的方法
2015/03/05 PHP
php正则替换处理HTML页面的方法
2015/06/17 PHP
php统计数组元素个数的方法
2015/07/02 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
js 遍历对象的属性的代码
2011/12/29 Javascript
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
javascript框架设计读书笔记之数组的扩展与修复
2014/12/02 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
jquery验证手机号是否正确实例讲解
2015/11/17 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
2016/05/11 Javascript
React Native实现进度条弹框的示例代码
2017/07/17 Javascript
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
2017/08/17 Javascript
vue iview实现动态路由和权限验证功能
2018/04/17 Javascript
微信小程序实现搜索功能
2020/03/10 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
原生JS实现音乐播放器的示例代码
2021/02/25 Javascript
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
2014/02/24 Python
python实现聚类算法原理
2018/02/12 Python
Python实现求解一元二次方程的方法示例
2018/06/20 Python
python中sys.argv函数精简概括
2018/07/08 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
通过自学python能找到工作吗
2020/06/21 Python
利用python爬取有道词典的方法
2020/12/08 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
canvas实现滑动验证的实现示例
2020/08/11 HTML / CSS
专门出售各种儿童读物的网站:Put Me In The Story
2016/08/07 全球购物
浅谈react路由传参的几种方式
2021/03/23 Javascript
打架检讨书100字
2014/01/19 职场文书
采购部经理岗位职责
2014/02/10 职场文书
中文专业自荐书
2014/06/29 职场文书
煤矿施工安全协议书
2016/03/22 职场文书
JAVA长虹键法之建造者Builder模式实现
2022/04/10 Java/Android