核心:物以类聚----根据邻近样本决定测试样本的类别。

一、概念

所谓邻近样本,就是离它最近的k个样本,通过计算其与所有已知样本的距离来确定。

( 距离的计算方式有多种(机器学习笔记:各种范数及各类距离_禺垣的博客-CSDN博客),kNN一般使用的是欧氏距离, 即两点间的空间距离,为两点向量差的L2范数。两个n维向量A(x11,x12,...,x1n)和B(x21,x22,...,x2n)间的欧氏距离为:

                                                                  )

所以kNN分类的初始状态就是一些已知类别的样本(全部特征向量表示),对于一个未知类别的新样本,我们找到k个距离最小的 邻居样本,看这k个邻居属于哪个类的多,我们就认为新样本也属于那个类。

示例:

如图所示,蓝色正方形和红色三角形分别是两个类别的已知样本(训练集),绿色圆形是待分类样本。如果k取3,离它最近的三个样本中有两个三角形一个正方形,三角形数多于正方形,所以认为小圆形属于三角形那一类;如果k取5,离它最近的五个样本中有两个三角形三个正方形,正方形数多于三角形,所以认为小圆形属于正方形那一类。

二、一般过程:

1)计算已训练集中样本与待测样本之间的距离;

2)按距离排序;

3)选取与当前样本距离最小的k个邻居样本;

4)确定此k个样本中各个类别的频率;

5)频率最高的类别作为该样本的预测分类。

三、注意事项:

1.kNN算法的三要素:k值选择、距离度量和分类决策规则都会对分类结果产生重要影响。

k值选择:通常是不大于20的整数,通常由交叉验证选择最优的k.

距离度量:不同的距离度量方法所确定的k个邻近点是不同的,会对结果产生影响,一般选用欧氏距离。

分类决策规则:一般是多数表决,即k个邻居中多的说的算。可以根据不同距离的邻居对该样本产生的影响赋予不同的权重。

2.数据标准化:在开始实现算法之前,我们要考虑一个问题,不同特征的特征值范围可能有很大的差别,例如,我们要分辨一个人的性别,一个女生的身高是1.70m,体重是60kg,一个男生的身高是1.80m,体重是70kg,而一个未知性别的人的身高是1.81m, 体重是64kg,这个人与女生数据点的“距离”的平方 d^2 = ( 1.70 - 1.81 )^2 + ( 60 - 64 )^2 = 0.0121 + 16.0 = 16.0121,而与男生数据点的“距离”的平方d^2 = ( 1.80 - 1.81 )^2 + ( 70 - 64 )^2 = 0.0001 + 36.0 = 36.0001 。可见,在这种情况下,身高差的平方相对于体重差的平方基本可以忽略不计,但是身高对于辨别性别来说是十分重要的。为了解决这个问题,就需要将数据标准化(normalize),把每一个特征值除以该特征的范围,保证标准化后每一个特征值都在0~1之间。

四、例子及python实现:

见    机器学习之KNN算法 - 知其然,知其所以然。 - 博客园

下面两例代码参考

关于KNN的python3实现 - 不秩稚童 - 博客园,

机器学习算法与Python实践之(一)k近邻(KNN)_zouxy09的博客-CSDN博客_机器学习算法与python实践之一

1.已知四个点的特征向量及其类别如下表所示,问 [1.2, 1.0] 和 [0.1, 0.3]两个样本点属于哪一类?

样本点 类别
[1.0, 0.9] A
[1.0, 1.0] A
[0.1, 0.2] B
[0.0, 0.1]

代码:

# -*- coding: utf-8 -*-
"""
Created on Sun Nov  6 16:09:00 2016@author: Administrator
"""# Input:
#   newInput:待测的数据点(1xM)
#   dataSet:已知的数据(NxM)
#   labels:已知数据的标签(1xM)
#   k:选取的最邻近数据点的个数
#
# Output:
#   待测数据点的分类标签
#from numpy import *# creat a dataset which contain 4 samples with 2 class
def createDataSet():# creat a matrix: each row as a samplegroup = array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])labels = ['A', 'A', 'B', 'B']return group, labels# classify using KNN
def KNNClassify(newInput, dataSet, labels, k):numSamples = dataSet.shape[0]  # row number# step1:calculate Euclidean distance# tile(A, reps):Constract an array by repeating A reps timesdiff = tile(newInput, (numSamples, 1)) - dataSetsqureDiff = diff ** 2squreDist = sum(squreDiff, axis=1)  # sum if performed by rowdistance = squreDist ** 0.5# step2:sort the distance# argsort() returns the indices that would sort an array in a ascending ordersortedDistIndices = argsort(distance)classCount = {}for i in range(k):# choose the min k distancevoteLabel = labels[sortedDistIndices[i]]# step4:count the times labels occur# when the key voteLabel is not in dictionary classCount,# get() will return 0classCount[voteLabel] = classCount.get(voteLabel, 0) + 1# step5:the max vote class will returnmaxCount = 0for k, v in classCount.items():if v > maxCount:maxCount = vmaxIndex = kreturn maxIndex# testdataSet, labels = createDataSet()testX = array([1.2, 1.0])
k = 3
outputLabel = KNNClassify(testX, dataSet, labels, 3)print("Your input is:", testX, "and classified to class: ", outputLabel)testX = array([0.1, 0.3])
k = 3
outputLabel = KNNClassify(testX, dataSet, labels, 3)print("Your input is:", testX, "and classified to class: ", outputLabel)

2.手写数字识别例子,代码及数据已调试通过,见kNN实现手写数字识别代码及数据_knn手写数字识别实验报告-机器学习代码类资源-CSDN下载

参考:

1.李航,《统计学习方法》第3章

2.郑捷,《机器学习算法原理与编程实践》

3.机器学习算法与Python实践之(一)k近邻(KNN)_zouxy09的博客-CSDN博客_机器学习算法与python实践之一

4.关于KNN的python3实现 - 不秩稚童 - 博客园

5.机器学习之KNN算法 - 知其然,知其所以然。 - 博客园

6.利用Python实现kNN算法 - 魔法少女小Q - 博客园

k-nearest neighbor,k近邻法相关推荐

  1. 机器学习之深入理解K最近邻分类算法(K Nearest Neighbor)

    [机器学习]<机器学习实战>读书笔记及代码:第2章 - k-近邻算法 1.初识 K最近邻分类算法(K Nearest Neighbor)是著名的模式识别统计学方法,在机器学习分类算法中占有 ...

  2. K Nearest Neighbor 算法

    K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KNN算法是相对比较容易理解的算法.其中的K表示最接近自己的K个数据样本.KNN算法和K-M ...

  3. K NEAREST NEIGHBOR 算法(knn)

    K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KNN算法是相对比较容易理解的算法.其中的K表示最接近自己的K个数据样本.KNN算法和K-M ...

  4. 文献记录(part81)--Clustering-based k -nearest neighbor classification for large-scale data with ...

    学习笔记,仅供参考,有错必纠 文章目录 Clustering-based k -nearest neighbor classification for large-scale data with ne ...

  5. k Nearest Neighbor Algorithm

    k Nearest Neighbor Algorithm k Nearest Neighbor(kNN) algorithm算法和k-Means算法一样,都是简单理解,但是实际效果出人意料的算法之一. ...

  6. 【资源分享】今日学习打卡--k近邻法 (k Nearest Neighbor Method)

    他来了他来了,他带着礼物走来了. 今天继续学习打卡 今天给大家分享的是k近邻法,是监督学习中的最基本的分类问题模型. 博主从自己看的几个比较好的视频中,分享了一些自己认为比较好的视频.希望能在大家和博 ...

  7. 机器学习——K近邻算法(KNN)(K Nearest Neighbor)

    参考视频与文献: python与人工智能-KNN算法实现_哔哩哔哩_bilibili 机器学习--K近邻算法(KNN)及其python实现_清泉_流响的博客-CSDN博客_python实现knn 机器 ...

  8. kNN算法(k近邻算法,k Nearest Neighbor)

    主要内容: 1.认识kNN算法 2.kNN算法原理 3.应用举例 4.kNN改进方法 1.认识knn算法 "看一个人怎么样,看他身边的朋友什么样就知道了",kNN算法即寻找最近的K ...

  9. 最近邻分类器(Nearest Neighbor Classifier)

    先从简单的方法开始说,先提一提最近邻分类器/Nearest Neighbor Classifier,不过事先申明,它和深度学习中的卷积神经网/Convolutional Neural Networks ...

  10. 【机器翻译】《Nearest Neighbor Knowledge Distillation for Neural Machine Translation》论文总结

    <Nearest Neighbor Knowledge Distillation for Neural Machine Translation>https://arxiv.org/pdf/ ...

最新文章

  1. 更换XP SN的vbs
  2. Go 语言编程 — 并发 — GMP 调度模型
  3. python面向编程:类继承、继承案例、单继承下属性查找、super方法
  4. 使用Spring+Junit4.4进行测试
  5. 24、JSON与OC互相转化
  6. 【网络编程】之六、选择select
  7. 趁webpack5还没出,先升级成webpack4吧
  8. SQL-字符串运算符和函数
  9. leetcode 796. 旋转字符串(Rotate String)
  10. 转:upload.parseRequest为空
  11. jdk 安装 linux环境
  12. 幻兽天下修复版java_宠物天下四-幻兽天下
  13. 文件读取 linux_救命,Linux正在吃掉我的内存
  14. Codeforces 1009G Allowed Letters 最大流转最小割 sosdp
  15. Harmony OS — PageSlider滑动页面
  16. 用PPT直接修改主集成模板,并保存为pps格式,即可现场展示应用.
  17. 全球唯一顶级车展来袭,云徙科技成为造车新势力?
  18. MacBook邮件登陆163邮箱,解决无法验证账户名或密码的问题
  19. 用计算机弹斗地主,单机斗地主
  20. Hyper-v安装和使用

热门文章

  1. 将一个数组按照从小到大的顺序排列
  2. 【数据结构】 最小生成树(四)——利用kruskal算法搞定例题×3+变形+一道大水题...
  3. 安装(解密)win10 10074 esd 更新 10162 esd
  4. 低风险整体式微服务演进第一部分
  5. 【Javascript】函数中的arguments
  6. Python:创建函数判断闰年
  7. 结构体对齐和补齐(详细解释)
  8. 编程之美--3.5最短摘要的生成
  9. java如何开发webservice接口
  10. SIGGRAPH中海洋的研究学习