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 knn-基于python实现KNN分类算法相关推荐

  1. python分类算法的应用_Python基于sklearn库的分类算法简单应用示例

    Python基于sklearn库的分类算法简单应用示例 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Python基于sklearn库的分类算法简单应用示例.tx ...

  2. 【python代码实现】人工神经网络分类算法及其实战案例(股票价格波动分析)

    目录 前置知识 1.前言 2.人工神经网络模型 2.1.神经元模型与单层神经网络 2.2.多层人工神经网络模型 人工神经网络分类算法 1.构建数据集 2.响应函数 3.模型训练 4.测试样本分类 案例 ...

  3. Python数据挖掘入门与实践-OneR分类算法

    Python数据挖掘入门与实践-OneR分类算法 OneR算法 OneR算法是根据已有的数据中,具有相同特征值的个体最可能属于哪个类别进行分类. 在本例中,只需选区Iris是个特征中分类效果最好的一个 ...

  4. Python下基于栈和逆波兰算法实现四则运算

    参考<大话数据结构>一书4.9节,Python下基于栈和逆波兰算法实现四则运算. 栈的实现使用顺序结构,即基于列表实现,参考本人博客Python实现顺序结构栈Sequence Stack ...

  5. 基于Adaboost的高光谱分类算法设计

    这次我们分享数据挖掘领域中较为经典的一个算法 AdaBoost,首先请看本次分享的目录梗概: 数据集简介 AdaBoost算法简介 AdaBoost算法实例解析 代码展示 参考文献 一.数据集简介 数 ...

  6. KNN(K最近邻)分类算法_糖潮丽子的博客

    申明:文章内容是作者自己的学习笔记,教学来源是开课吧讲师梁勇老师. 讲师介绍:梁老师 <细说Java>与<Java深入解析>图书作者.一线互联网资深数据分析专家,超过十年软件开 ...

  7. 使用python语言编写常见的文本分类算法

    自然语言处理中一个很常见的操作就是文本分类,比如一组新闻文本,通过分类模型,将新闻文本分为政治.体育.军事.娱乐.财经等等几大类.那么分类第一步就是文本向量化,前一篇博客讲了一些,本文可以说是前文的实 ...

  8. python推荐系统-基于Python的推荐系统的设计与实现

    张玉叶 摘  要: 大数据时代的推荐系统可以帮助用户从海量信息中高效地获取自己的潜在需求,是大数据在互联网领域的典型应用.文章介绍了利用Python语言实现的一个基于物品的协同过滤算法推荐系统,给出了 ...

  9. python篮球-基于Python/Java的人工智能篮球训练系统的制作方法

    本发明涉及信息技术领域,尤其涉及一种基于Python/Java的人工智能篮球训练系统. 背景技术: 人工智能的发展已经开始渗透到各行各业.经过发明人的研究和检索,发现作为篮球训练,已经有专利申请.其中 ...

  10. (附源码)python+mysql+基于python的学生成绩管理系统 毕业设计071143

    Django学生成绩管理 摘 要 在国家重视教育影响下,教育部门的密确配合下,对教育进行改革.多样性.质量等等的要求,使教育系统的管理和运营比过去十年前更加理性化.依照这一现实为基础,设计一个快捷而又 ...

最新文章

  1. 讨论oracle的反腐,关于oracle SCN 的讨论
  2. 封装,多态,类的约束,super()深入了解
  3. 关于C#中用access做数据库,使用like语句的问题
  4. 开发人员也要懂点的测试知识
  5. python twisted教程_Python Twisted系列教程1:Twisted理论基础
  6. 使用Pass提高效率
  7. 数据库删除表中多列语法总结
  8. [转贴]深山红叶使用图文教程
  9. 关注手机病毒:重点手机安全事件盘点
  10. spark scala求PV,UV,topN
  11. matlab编程螺旋oam,一种多模态OAM涡旋电磁波微带阵列天线制造技术
  12. 海洋cms(海洋视频内容管理系统) v12.5
  13. SSD制作自己的数据集
  14. MacBook Pro换固态硬盘出现的一个稀缺问题
  15. #软件设计模式#桥接模式#小黑的学习笔记
  16. Jtapi开发之转接二 传递uui
  17. 【Java入门】--键盘输入月份,控制台返回对应英文月份。
  18. C语言频率计程序,基于单片机的频率计的C语言源代码
  19. 汽车动力经济性开发工具,发动机最优燃油消耗曲线计算程序 发动机最优燃油消耗曲线matlb计算模型,MATLAB模型,发动机OOL
  20. YaCy—基于P2P的分布式开源搜索引擎

热门文章

  1. cesium多边形描边_Cesium专栏-地形开挖2-任意多边形开挖(附源码下载)
  2. XP新建管理员账户后administrator消失或者不能登录的解决方法!
  3. 如何添加显示桌面图标置于快速启动栏
  4. python中格式符的应用%s,%d,%f以及format()的实例以及输出格式
  5. 算法(5) 归并排序
  6. Oracle基本操作(二)
  7. Linux的10个游戏
  8. micro-mvc框架支持mvc各层业务代码热部署
  9. mysql单用户赋予多库权限
  10. BT觀念分享和常見問題彙整