基于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将字符串转换成数组的方法
Apr 29 Python
python日志记录模块实例及改进
Feb 12 Python
python中使用print输出中文的方法
Jul 16 Python
python组合无重复三位数的实例
Nov 13 Python
Python实现的多进程拷贝文件并显示百分比功能示例
Apr 09 Python
500行Python代码打造刷脸考勤系统
Jun 03 Python
python做接口测试的必要性
Nov 20 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
Feb 26 Python
Jupyter Notebook远程登录及密码设置操作
Apr 10 Python
Jupyter Notebook安装及使用方法解析
Nov 12 Python
Python音乐爬虫完美绕过反爬
Aug 30 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 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
php将图片保存为不同尺寸图片的图片类实例
2015/03/30 PHP
深入理解PHP原理之执行周期分析
2016/06/01 PHP
基于PHP实现邮箱验证激活过程详解
2020/10/28 PHP
jQuery+CSS 实现的超Sexy下拉菜单
2010/01/17 Javascript
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
jQuery Ajax使用 全解析
2010/12/15 Javascript
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
js 获取radio按钮值的实例
2013/08/17 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
JS实现仿京东淘宝竖排二级导航
2014/12/08 Javascript
jQuery中:reset选择器用法实例
2015/01/04 Javascript
复杂的javascript窗口分帧解析
2016/02/19 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
内容滑动切换效果jquery.hwSlide.js插件封装
2016/07/07 Javascript
JavaScript中的this使用详解
2016/07/27 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
vue如何解决循环引用组件报错的问题
2018/09/22 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
Node.js原生api搭建web服务器的方法步骤
2019/02/15 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
vue中uni-app 实现小程序登录注册功能
2019/10/12 Javascript
JavaScript隐式类型转换代码实例
2020/05/29 Javascript
使用vue构建多页面应用的示例
2020/10/22 Javascript
Python使用迭代器捕获Generator返回值的方法
2017/04/05 Python
python 连接sqlite及简单操作
2017/06/30 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
python pyinstaller打包exe报错的解决方法
2019/11/02 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
python网络编程之五子棋游戏
2020/05/14 Python
新加坡第一大健康与美容零售商:屈臣氏新加坡(Watsons Singapore)
2020/12/11 全球购物
应用电子技术专业个人求职信
2013/09/21 职场文书
夫妻分居协议书范本(有子女版)
2014/11/01 职场文书
利用Python读取微信朋友圈的多种方法总结
2021/08/23 Python
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL