最近邻算法:

1.什么是最近邻是什么?

  kNN算法全程是k-最近邻算法(k-Nearest Neighbor)

  kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数数以一个类型别,则该样本也属于这个类别,并具有该类别上样本的特征。该方法在确定分类决策上,只依据最近邻的一个或者几个样本的类别来决定待分样本所属的类别。

下面举例说明:

即使不知道未知电影属于哪个类型,我们也可以通过某种方式计算,如下图

现在,我们得到了样本集中与未知电影的距离,按照距离的递增顺序,可以找到k个距离最近的电影,假设k=3,则三个最靠近的电影是he is not realy into Dudes,Beautiful women, California man , kNN 算法按照距离最近的三部电影类型决定未知电影的类型,这三部都是爱情片,所以未知电影的类型也是爱情片。

2:kNN算法的一般流程

  • step.1---初始化距离为最大值
  • step.2---计算未知样本和每个训练样本的距离dist
  • step.3---得到目前K个最邻近样本中的最大距离maxdist
  • step.4---如果dist小于maxdist, 则将训练样本作为K-最近邻样本
  • step.5---重复步骤2,3,4,直到未知样本和所有训练样本的距离都算完
  • step.6---统计K-最近邻样本中每个类标号出现的次数
  • step.7---出现频率最大的类标号最为未知样本的类标号

3.距离公式

在KNN算法中,通过计算对象间距离作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里距离一般使用欧式距离或者曼哈顿距离:

对应代码如下

#  kNN算法全称是k-最近邻算法(K-Nearest Neighbor)
from numpy import *
import operator # 创建数据函数
def createDataSet():
""" 创建数据集,array 创建数组
array数组内依次是打斗次数, 接吻次数
group小组, labels标签"""
group = array([[3, 104], [2, 100], [1, 81], [101, 10], [99, 5], [98, 2]])
labels = ["爱情片", "爱情片", "爱情片", "动作片", "动作片", "动作片"]
return group, labels # 归类函数
def classify(inX, dataSet, labels, k):
""" 获取维度,
inX 待测目标的数据,
dataSet 样本数据,
labels 标签,
k 设置比较邻近的个数"""
dataSetSize = dataSet.shape[0] # 训练数据集数据 行数
print(dataSetSize)
print(tile(inX, (dataSetSize, 1))) diffMat = tile(inX, (dataSetSize, 1)) - dataSet # 测试数据,样本之间的数据 矩阵偏差
print(diffMat) sqDiffMat = diffMat**2 # 平方计算,得出每个距离的值
print(sqDiffMat) sqDistance = sqDiffMat.sum(axis=1) # 输出每行的值
print(sqDistance) distances = sqDistance**0.5 # 开方计算
print(distances) sortedDistances = distances.argsort() # 排序 按距离从小到大 输出索引
print(sortedDistances) classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistances[i]] + 1.0 # 按照排序,获取k个对应的标签
classCount[voteIlabel] = classCount.get(voteIlabel, 0) # 在字典中添加距离最近的k个对应标签
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) return sortedClassCount[0][0] group, labels = createDataSet()
res = classify([18, 90], group, labels, 3)
print(res)

运行结果:

知识扩展:

python3字典中items()和python2.x中iteritems()有什么不同?
numpy中 array数组的shape属性
numpy 中 shape_base提供的tile方法

最近邻算法(KNN)的更多相关文章

  1. 转载: scikit-learn学习之K最近邻算法(KNN)

    版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ================== ...

  2. k最近邻算法(kNN)

    from numpy import * import operator from os import listdir def classify0(inX, dataSet, labels, k): d ...

  3. 【udacity】机器学习-knn最近邻算法

    Evernote Export 1.基于实例的学习介绍 不同级别的学习,去除所有的数据点(xi​,yi​),然后放入一个数据库中,下次直接提取数据 但是这样的实现方法将不能进行泛化,这种方式只能简单的 ...

  4. 机器学习【一】K最近邻算法

    K最近邻算法 KNN 基本原理 离哪个类近,就属于该类   [例如:与下方新元素距离最近的三个点中,2个深色,所以新元素分类为深色] K的含义就是最近邻的个数.在sklearn中,KNN的K值是通过n ...

  5. 在opencv3中实现机器学习算法之:利用最近邻算法(knn)实现手写数字分类

    手写数字digits分类,这可是深度学习算法的入门练习.而且还有专门的手写数字MINIST库.opencv提供了一张手写数字图片给我们,先来看看 这是一张密密麻麻的手写数字图:图片大小为1000*20 ...

  6. KNN(k-nearest neighbor的缩写)又叫最近邻算法

    KNN(k-nearest neighbor的缩写)又叫最近邻算法 机器学习笔记--KNN算法1 前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的 ...

  7. 【算法】K最近邻算法(K-NEAREST NEIGHBOURS,KNN)

    K最近邻算法(k-nearest neighbours,KNN) 算法 对一个元素进行分类 查看它k个最近的邻居 在这些邻居中,哪个种类多,这个元素有更大概率是这个种类 使用 使用KNN来做两项基本工 ...

  8. 12、K最近邻算法(KNN算法)

    一.如何创建推荐系统? 找到与用户相似的其他用户,然后把其他用户喜欢的东西推荐给用户.这就是K最近邻算法的分类作用. 二.抽取特征 推荐系统最重要的工作是:将用户的特征抽取出来并转化为度量的数字,然后 ...

  9. PCB 加投率计算实现基本原理--K最近邻算法(KNN)

    PCB行业中,客户订购5000pcs,在投料时不会直接投5000pcs,因为实际在生产过程不可避免的造成PCB报废, 所以在生产前需计划多投一定比例的板板, 例:订单 量是5000pcs,加投3%,那 ...

随机推荐

  1. Python入门介绍

    Python入门介绍(人生苦短,我用 Python) Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹 ...

  2. B+树及数据库索引的应用

    B树 每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为null. B+树 只有叶子节点存储data,叶子节点包含了这棵树的所有键值,叶子节点不存储指针. 后来,在B+树上增加了顺 ...

  3. Django中的ORM框架使用小技巧

      Django中的ORM框架使用小技巧 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. Django对各个数据提供了很好的支持,包括PostgreSQL,MySQL,SQLite ...

  4. 使用mysql存放Ambari元数据的配置案例

    使用mysql存放Ambari元数据的配置案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.环境准备   详情请参考我之前的笔记:离线方式部署Ambari2.6.0.0 中关 ...

  5. SpringBoot笔记十六:ElasticSearch

    目录 ElasticSearch官方文档 ElasticSearch安装 ElasticSearch简介 ElasticSearch操作数据,RESTful风格 存储 检查是否存在 删除 查询 更新 ...

  6. Idea使用Maven创建Java Web项目

    最近学到了Java Web项目,使用Idea和Maven创建Java Web的时候遇到了诸多问题,最多的还是404问题.现在记录一下解决方案. 一.使用maven创建一个web项目,这一步网上都有,下 ...

  7. springboot下整合各种配置文件

    本博是在springboot下整合其他中间件,比如,mq,redis,durid,日志...等等  以后遇到再更.springboot真是太便捷了,让我们赶紧涌入到springboot的怀抱吧. ap ...

  8. LR与SVM的异同

    原文:http://blog.sina.com.cn/s/blog_818f5fde0102vvpy.html 在大大小小的面试过程中,多次被问及这个问题:“请说一下逻辑回归(LR)和支持向量机(SV ...

  9. 开源ETL工具之Kettle介绍

    What 起源 Kettle是一个Java编写的ETL工具,主作者是Matt Casters,2003年就开始了这个项目,最新稳定版为7.1. 2005年12月,Kettle从2.1版本开始进入了开源 ...

  10. JAVA方法调用中的解析与分派

    JAVA方法调用中的解析与分派 本文算是<深入理解JVM>的读书笔记,参考书中的相关代码示例,从字节码指令角度看看解析与分派的区别. 方法调用,其实就是要回答一个问题:JVM在执行一个方法 ...