最近邻算法:

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. ps: 图层样式;

    图层样式是ps的一项图层处理能力,功能强大,能够简单快捷的制作处立体投影,各种质感以及光影效果. 10种图层样式: (1)投影:将为图层上的对象.文本或形状后面添加阴影效果.投影参数由“混合模式”.“ ...

  2. 【知名的3D造型设计软件】犀牛 Rhinoceros 5.5.2 for Mac

    [简介] 今天和大家分享最新的3D设计软件 犀牛 Rhinoceros for Mac 5.5.2 版本,支持中文界面,这是一款Mac上知名的3D造型软件,犀牛可以广泛地应用于三维动画制作.工业制造. ...

  3. 2017-12-15python全栈9期第二天第五节之while else的用法一当被break打断时else内容的结果不会被打印

    #!/user/bin/python# -*- coding:utf-8 -*-count = 0while count <5 : count += 1 if count == 3 : brea ...

  4. jQuery克隆html元素并改变id

    如题,前端操作经常需要ajax异步刷新html页面数据.有时候js里面拼接html代码很麻烦. 因此选择一个div克隆并改变一些值就省了很多事.这个div也可以提前写在html里面hide() 下面是 ...

  5. forEach、for in、for of 三者对比

    forEach forEach专门用来循环数组,可以直接取到元素,同时也可以取到index值 存在局限性,不能continue跳过或者break终止循环,没有返回值,不能return let arr ...

  6. 【转载】C#:使用双缓冲让界面绘制图形时避免闪烁

    https://blog.csdn.net/fujie724/article/details/5767064#

  7. php实现无限级分类查询(递归、非递归)

    递归函数实现方式 上面提到,递归函数的也是借助于栈的机制实现的,但是底层对于栈的处理对于程序员来说都是透明的,程序员只需要关心应用的实现逻辑.所以说使用递归处理上述问题理解起来比较容易,代码也比较简洁 ...

  8. bash test命令探秘

    shell 测试条件命令 http://blog.csdn.net/yangruibao/article/details/7427503 test 和 [ 命令 虽然 Linux 和 UNIX 的每个 ...

  9. c++注意易错点

    1.cout采用endl,cin不用endl cin>>a>>b; cout<<a<<b<<endl; 2.函数定义后面不要加分号,完了也没 ...

  10. PHP实现流程管理功能

    核心逻辑:流程管理,在各种系统中扮演很重要的地位,可以把设定好的流程放入系统中,规定好几个节点,只要所有节点都通过,就可以通过. 建立四张数据库表: 1.我们首先做一个新建流程页面 flow.php, ...