一.工作原理

kNN算法是监督学习的一种,首先要有样本集(包含特征与目标变量),然后再输入没有标签只有特征的新数据,其次算出新数据与每个样本集的距离(所以kNN算法的特征都要为数据类型或标称型),这里的距离计算函数可以是欧氏距离、余弦距离、汉明距离、曼哈顿距离等,选出前k个最近距离的样本,最后定义新数据的目标变量是前k个样本中出现频率最高的目标变量。

把工作原理转化为伪代码的思路:

  1. 有一个未知分类的数据A,我们只知道A的特征值[x1, y1, z1], 我想知道A的分类是什么
  2. 如果要通过A的特征值来判断它的分类,前提条件一定是要有一批和A相同特征且已经知道分类的样本,这里我们取最简情况,样本有两个一个为B[x2, y2, z2]分类为“要下雨”,C[x3, y3, z3]分类为“不下雨”
  3. 按kNN算法的思路,我算出A与B,C的距离,A离B近那么A的分类就是“要下雨”,反之则A是“不下雨”,这样就成功得到A的分类,不过这只是最简的情况,下面我们还要考虑一些复杂的情况
  4. 问题1:如果有很多个样本,而且我们也没办法保证样本中没有异常值。 假如现在样本有五个分别为B(要下雨),C(不下雨),D(要下雨),E(不下雨),F(要下雨),其中F是异常值,假设测试样本A的真实分类是不下雨,因为F是异常值,导致F与A的距离最近,如果我们就简单地选距离最近的,就容易造成错误,所以这时候就要用到kNN算法中的K了,我们选取前K个最近距离的样本,然后再选出前K个中分类数最多的那个分类。比如,K取3,然后前3个中有1个要下雨,2个不下雨,那么我们就认为A是不下雨。
  5. 问题2:如果特征值x的取值范围大大超过y和z,会有什么影响? 例如:x的取值范围在[0,100],而y和z的取值范围只有[0,1],那么这样就会造成在算距离的时候特征x对距离的值影响非常大,这就要用到归一化的手段了,具体下面第六点有讲。
  6. 问题3:如果特征值是标称类的怎么办? 例如特征值z是指颜色,最简单的办法就是比较测试样本与训练样本的颜色是否相同,相同差值就为0,不相同差值就为1

二.代码思路

  1. 计算已知类别数据集中的点与当前点之间的距离;
  2. 按照距离递增次序排序;
  3. 选取与当前点距离最小的k个点;
  4. 确定前k个点所在类别的出现频率;
  5. 返回前k个点出现频率最高的类别作为当前点的预测分类

三.伪代码

输入参数

  • 测试样本 :是一个数组,存放当前要测试的样本
  • 训练样本 :是一个二维的矩阵,存放了很多条训练样本记录
  • 目标变量集:训练样本集对应的目标变量
分类器算法(测试样本,训练样本, 目标变量集,k):用线性运算求出训练样本每个记录与测试样本的距离对距离进行排序for i in  range(k):算出前k个分类变量中每个分类变量的数目返回数目最多的那个变量

四.python最简代码

写在kNN.py文件中,样本集和测试样本都存放在numpy的array对象中,因为array对象可以用线性代数运算

def classify0(in_data, feature_group, label, k):"""k近邻算法的分类器@param in_data:没有目标变量的新数据@param feature_group:只有特征的样本数据集@param label:训练样本数据集对应的目标变量@param k:@return:"""dim_len = feature_group.shape[0]  # 查看列方向的维度sub_data = np.tile(in_data, (dim_len, 1)) - feature_group  # tile:从不同维度扩展列表,1代表第二维不扩展sq_sub_data = sub_data ** 2  # 对列表中的每个元素求平方sum_sq_sub_data = sq_sub_data.sum(axis=1)  # 以行方向求和geom_distance = sum_sq_sub_data ** 0.5index_sorted_gd = geom_distance.argsort()  # 返回数组排序后的索引值label_freq = {}for i in range(k):label_value = label[index_sorted_gd[i]]label_freq[label_value] = label_freq.get(label_value, 0) + 1sort_class_label = sorted(iter(label_freq.items()), key=operator.itemgetter(1), reverse=True)  # 排序return sort_class_label[0][0]

五.示例

六.归一化

由于不同的特征,其总体的值大小不一样,这样有些特征占的权重就会非常大,所以我们要把所有的特征都归一化,这样每个特征的影响都一样

ef normalization(data_set):"""核心公式 (x-min)/(max-min), 记得用线性代数的思维去处理矩阵@param data_set:存放特征的数据集,不包含目标变量@return:归一化的特征数据集,后面两个返回变量可有可无,没什么影响"""max_data = data_set.max(0)  # 找出每列的最小值min_data = data_set.min(0)  # 找出每列的最大值range_data = max_data - min_datanorm_data = np.zeros(np.shape(data_set))d1 = data_set.shape[0]norm_data = data_set - np.tile(min_data, (d1, 1))  # min_data本身就三列,所以列不用扩展norm_data = norm_data/np.tile(range_data, (d1, 1))return norm_data, d1, min_data

kNN分类算法伪代码最简python代码相关推荐

  1. python分类算法_用Python实现KNN分类算法

    本文实例为大家分享了Python KNN分类算法的具体代码,供大家参考,具体内容如下 KNN分类算法应该算得上是机器学习中最简单的分类算法了,所谓KNN即为K-NearestNeighbor(K个最邻 ...

  2. 用Python开始机器学习(4:KNN分类算法)

    转自: http://blog.csdn.net/lsldd/article/details/41357931 1.KNN分类算法 KNN分类算法(K-Nearest-Neighbors Classi ...

  3. 利用python语言实现分类算法_使用python实现kNN分类算法

    k-近邻算法是基本的机器学习算法,算法的原理非常简单: 输入样本数据后,计算输入样本和参考样本之间的距离,找出离输入样本距离最近的k个样本,找出这k个样本中出现频率最高的类标签作为输入样本的类标签,很 ...

  4. python KNN分类算法 使用鸢尾花数据集实战

    KNN分类算法,又叫K近邻算法,它概念极其简单,但效果又很优秀. 如觉得有帮助请点赞关注收藏啦~~~ KNN算法的核心是,如果一个样本在特征空间中的K个最相似,即特征空间中最邻近的样本中的大多数属于某 ...

  5. 使用Python处理KNN分类算法

    简介: 我们在这世上,选择什么就成为什么,人生的丰富多彩,得靠自己成就.你此刻的付出,决定了你未来成为什么样的人,当你改变不了世界,你还可以改变自己. KNN分类算法的介绍 KNN分类算法(K-Nea ...

  6. KNN 分类算法原理代码解析

    作者 | Charmve 来源 | 迈微AI研习社 k-最近邻算法是基于实例的学习方法中最基本的,先介绍基x`于实例学习的相关概念. 基于实例的学习 已知一系列的训练样例,很多学习方法为目标函数建立起 ...

  7. Python实现knn分类算法(Iris 数据集)

    1.KNN分类算法 KNN分类算法(K-Nearest-Neighbors Classification),又叫K近邻算法,是一个概念极其简单,而分类效果又很优秀的分类算法. 他的核心思想就是,要确定 ...

  8. knn分类算法实现手写体数字识别python

    之前写过knn分类算法代码,想把knn用于设别手写体数字,看下正确率. 大概思路:获取图片(可以自己写,我之前有写过黑白图片转文本的代码,也可以网上找,反正数据量大会更好)->转成文本-> ...

  9. python 分类算法_python机器学习之KNN分类算法

    本文为大家分享了python机器学习之KNN分类算法,供大家参考,具体内容如下 1.KNN分类算法 KNN分类算法(K-Nearest-Neighbors Classification),又叫K近邻算 ...

最新文章

  1. 报文如何截取时间_5种报文、8种邻居状态机详解OSPF工作原理
  2. java 反射详解通俗易懂
  3. html5up ui开源框架,ZUI-HTML5前端 UI 框架
  4. 充分发挥bpl包的作用
  5. 小辣椒2019_小辣椒红辣椒7X尊享版(6GB 64GB)参数大全,好便宜的联发科手机
  6. Linux安装软件包
  7. NAND FLASH/NOR FLASH/EMMC等存储器的比较和区别
  8. P3345-[ZJOI2015]幻想乡战略游戏【点分树,RMQ】
  9. java不可变类型_Java中的值类型:为什么它们不可变?
  10. 蚂蚁庄园 php源码,蚂蚁庄园五体投地
  11. 变更数据推送java_idea 团队成员修改工程后push推送
  12. 方差公式初三_初中数学,一元二次方程的解法:公式法、因式分解法和十字相乘法基础练习...
  13. Cast-128 加密算法和 MyPassWord 的破解
  14. Linux C++线程池框架
  15. 2020最新 程序员数学(基础+进阶)
  16. 阿里邮箱企业版在电脑PC客户端设置方法汇总
  17. CSDN技术主题月:实战解读移动信息安全技术
  18. It Was a Good Barn
  19. 总结python之excel write(row,col,data)
  20. 运算符(笔记来自秦疆老师的视频笔记)

热门文章

  1. 1972年图灵奖--埃德斯加·狄克斯特拉生平
  2. 中级前端工程师应该具备什么技术
  3. 什么是 IT 运营管理 (ITOM)
  4. 在html页面中引入jquery
  5. 说说Teams里的Card
  6. 使用正则表达式批量去除第一个逗号前的内容(含逗号)以及去除最后一个逗号后面的内容
  7. Linux:用户与群组管理
  8. EasyCVR实现智慧楼宇道闸控制流程及参考代码分享
  9. 【BAT 面试题宝库附详尽答案解析】分布式事务实现原理
  10. c# IE浏览器清除缓存没用