基于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中的数据类型
May 05 Python
python win32 简单操作方法
May 25 Python
Python MySQL数据库连接池组件pymysqlpool详解
Jul 07 Python
Python迭代器和生成器定义与用法示例
Feb 10 Python
Python实现查看系统启动项功能示例
May 10 Python
Python操作word常见方法示例【win32com与docx模块】
Jul 17 Python
Python中的heapq模块源码详析
Jan 08 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
Oct 22 Python
python如何获取apk的packagename和activity
Jan 10 Python
Pytorch 使用不同版本的cuda的方法步骤
Apr 02 Python
Python run()函数和start()函数的比较和差别介绍
May 03 Python
Python 如何反方向迭代一个序列
Jul 28 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/03 日漫
PHP生成便于打印的网页
2006/10/09 PHP
php adodb连接带密码access数据库实例,测试成功
2008/05/14 PHP
PHP迭代器的内部执行过程详解
2013/11/12 PHP
PHP使用flock实现文件加锁的方法
2015/07/01 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
基于jquery实现的服务器验证控件的启用和禁用代码
2010/04/27 Javascript
JQuery扩展插件Validate 1 基本使用方法并打包下载
2011/09/05 Javascript
js中eval()函数和trim()去掉字符串左右空格应用
2013/02/02 Javascript
浅析Javascript使用include/require
2013/11/13 Javascript
js重写方法的简单实现
2016/07/10 Javascript
基于JavaScript实现本地图片预览
2017/02/08 Javascript
轻松学习Javascript闭包
2017/03/01 Javascript
JavaScript之事件委托实例(附原生js和jQuery代码)
2017/07/22 jQuery
Layui数据表格跳转到指定页的实现方法
2019/09/05 Javascript
微信小程序可滑动周日历组件使用详解
2019/10/21 Javascript
vue解决使用$http获取数据时报错的问题
2019/10/30 Javascript
javascript数组的定义及操作实例
2019/11/10 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
JavaScript实现下拉列表
2021/01/20 Javascript
Python删除windows垃圾文件的方法
2015/07/14 Python
Python基础语法(Python基础知识点)
2016/02/28 Python
python WindowsError的错误代码详解
2017/07/23 Python
对python中大文件的导入与导出方法详解
2018/12/28 Python
python中类的输出或类的实例输出为这种形式的原因
2019/08/12 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
有关打架的检讨书
2014/01/25 职场文书
临床护理求职信
2014/04/26 职场文书
财务检查整改报告
2014/11/06 职场文书
小学安全工作总结2015
2015/05/18 职场文书
力克胡哲观后感
2015/06/10 职场文书
个人向公司借款协议书
2016/03/19 职场文书
2019商业计划书格式、范文
2019/04/24 职场文书
pycharm部署django项目到云服务器的详细流程
2021/06/29 Python