k-nearest neighbor,k近邻法
核心:物以类聚----根据邻近样本决定测试样本的类别。
一、概念
所谓邻近样本,就是离它最近的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] | B |
代码:
# -*- 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近邻法相关推荐
- 机器学习之深入理解K最近邻分类算法(K Nearest Neighbor)
[机器学习]<机器学习实战>读书笔记及代码:第2章 - k-近邻算法 1.初识 K最近邻分类算法(K Nearest Neighbor)是著名的模式识别统计学方法,在机器学习分类算法中占有 ...
- K Nearest Neighbor 算法
K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KNN算法是相对比较容易理解的算法.其中的K表示最接近自己的K个数据样本.KNN算法和K-M ...
- K NEAREST NEIGHBOR 算法(knn)
K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KNN算法是相对比较容易理解的算法.其中的K表示最接近自己的K个数据样本.KNN算法和K-M ...
- 文献记录(part81)--Clustering-based k -nearest neighbor classification for large-scale data with ...
学习笔记,仅供参考,有错必纠 文章目录 Clustering-based k -nearest neighbor classification for large-scale data with ne ...
- k Nearest Neighbor Algorithm
k Nearest Neighbor Algorithm k Nearest Neighbor(kNN) algorithm算法和k-Means算法一样,都是简单理解,但是实际效果出人意料的算法之一. ...
- 【资源分享】今日学习打卡--k近邻法 (k Nearest Neighbor Method)
他来了他来了,他带着礼物走来了. 今天继续学习打卡 今天给大家分享的是k近邻法,是监督学习中的最基本的分类问题模型. 博主从自己看的几个比较好的视频中,分享了一些自己认为比较好的视频.希望能在大家和博 ...
- 机器学习——K近邻算法(KNN)(K Nearest Neighbor)
参考视频与文献: python与人工智能-KNN算法实现_哔哩哔哩_bilibili 机器学习--K近邻算法(KNN)及其python实现_清泉_流响的博客-CSDN博客_python实现knn 机器 ...
- kNN算法(k近邻算法,k Nearest Neighbor)
主要内容: 1.认识kNN算法 2.kNN算法原理 3.应用举例 4.kNN改进方法 1.认识knn算法 "看一个人怎么样,看他身边的朋友什么样就知道了",kNN算法即寻找最近的K ...
- 最近邻分类器(Nearest Neighbor Classifier)
先从简单的方法开始说,先提一提最近邻分类器/Nearest Neighbor Classifier,不过事先申明,它和深度学习中的卷积神经网/Convolutional Neural Networks ...
- 【机器翻译】《Nearest Neighbor Knowledge Distillation for Neural Machine Translation》论文总结
<Nearest Neighbor Knowledge Distillation for Neural Machine Translation>https://arxiv.org/pdf/ ...
最新文章
- 更换XP SN的vbs
- Go 语言编程 — 并发 — GMP 调度模型
- python面向编程:类继承、继承案例、单继承下属性查找、super方法
- 使用Spring+Junit4.4进行测试
- 24、JSON与OC互相转化
- 【网络编程】之六、选择select
- 趁webpack5还没出,先升级成webpack4吧
- SQL-字符串运算符和函数
- leetcode 796. 旋转字符串(Rotate String)
- 转:upload.parseRequest为空
- jdk 安装 linux环境
- 幻兽天下修复版java_宠物天下四-幻兽天下
- 文件读取 linux_救命,Linux正在吃掉我的内存
- Codeforces 1009G Allowed Letters 最大流转最小割 sosdp
- Harmony OS — PageSlider滑动页面
- 用PPT直接修改主集成模板,并保存为pps格式,即可现场展示应用.
- 全球唯一顶级车展来袭,云徙科技成为造车新势力?
- MacBook邮件登陆163邮箱,解决无法验证账户名或密码的问题
- 用计算机弹斗地主,单机斗地主
- Hyper-v安装和使用