K最近邻(kNN,k-NearestNeighbor)算法是一种监督式的分类方法,但是,它并不存在单独的训练过程,在分类方法中属于惰性学习法,也就是说,当给定一个训练数据集时,惰性学习法简单地存储或稍加处理,并一直等待,直到给定一个检验数据集时,才开始构造模型,以便根据已存储的训练数据集的相似性对检验数据集进行分类。惰性学习法在提供训练数据集时,只做少量的计算,而在进行分类或数值预测时做更多的计算。kNN算法主要用于模式识别,对于随机分布的数据集分类效果较差,对于类内间距小,类间间距大的数据集分类效果好,而且对于边界不规则的数据效果好于线性分类器。常用于推荐系统:推荐受众喜欢电影、美食和娱乐等。

一,kNN算法逻辑

kNN算法的核心思想是:如果一个数据在特征空间中最相邻的k个数据中的大多数属于某一个类别,则该样本也属于这个类别(类似投票),并具有这个类别上样本的特性。通俗地说,对于给定的测试样本和基于某种度量距离的方式,通过最靠近的k个训练样本来预测当前样本的分类结果。

例如,借用百度的一张图来说明kNN算法过程,要预测图中Xu的分类结果,先预设一个距离值,只考虑以Xu为圆心以这个距离值为半径的圆内的已知训练样本,然后根据这些样本的投票结果来预测Xu属于w1类别,投票结果是4:1。

kNN算法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
kNN算法在类别决策时,只与极少量的相邻样本有关。
由于kNN算法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。

1,kNN算法的计算步骤

kNN算法就是根据距离待分类样本A最近的k个样本数据的分类来预测A可能属于的类别,基本的计算步骤如下:

  • 对数据进行标准化,通常是进行归一化,避免量纲对计算距离的影响;
  • 计算待分类数据与训练集中每一个样本之间的距离;
  • 找出与待分类样本距离最近的k个样本;
  • 观测这k个样本的分类情况;
  • 把出现次数最多的类别作为待分类数据的类别。

计算距离的方法有:"euclidean"(欧氏距离),”minkowski”(明科夫斯基距离), "maximum"(切比雪夫距离), "manhattan"(绝对值距离),"canberra"(兰式距离), 或 "minkowski"(马氏距离)等。

2,kNN算法如何计算距离?

在计算距离之前,需要对每个数值属性进行规范化,这有助于避免较大初始值域的属性比具有较小初始值域的属性的权重过大。

  • 对于数值属性,kNN算法使用距离公式来计算任意两个样本数据之间的距离。
  • 对于标称属性(如类别),kNN算法使用比较法,当两个样本数据相等时,距离为0;当两个样本数据不等时,距离是1。
  • 对于缺失值,通常取最大的差值,假设每个属性都已经映射到[0,1]区间,对于标称属性,设置差值为1;对于数值属性,如果两个元组都缺失值,那么设置差值为1;如果只有一个值缺失,另一个规范化的值是v,则取差值为 1-v 和 v 的较大者。

3,kNN算法如何确定k的值?

k的最优值,需要通过实验来确定。从k=1开始,使用检验数据集来估计分类器的错误率。重复该过程,每次k增加1,允许增加一个近邻,选取产生最小错误率的k。一般而言,训练数据集越多,k的值越大,使得分类预测可以基于训练数据集的较大比例。在应用中,一般选择较小k并且k是奇数。通常采用交叉验证的方法来选取合适的k值。

R的kknn包中包含两个自动选择最优参数的函数:train.kknn和cv.kknn,前者采用留一交叉验证做参数选择,后者采用交叉验证做参数选择(可以自己选择折数):

train.kknn(formula, data, kmax = 11, ks = NULL, distance = 2, kernel = "optimal",ykernel = NULL, scale = TRUE, contrasts = c('unordered' = "contr.dummy",ordered = "contr.ordinal"), ...)
cv.kknn(formula, data, kcv = 10, ...)

参数注释:

kmax:最大的k值

  • ks:向量,用于指定k值,如果非null,那么ks覆盖kmax的值。
  • distince:Minkowski距离的参数
  • kernel:有效值是:"rectangular" (which is standard unweighted knn), "triangular", "epanechnikov" (or beta(2,2)), "biweight" (or beta(3,3)), "triweight" (or beta(4,4)), "cos", "inv", "gaussian" and "optimal".
  • kcv:k-fold交叉验证的分区数量

函数的返回值:

best.parameters:列出最佳的k和kernel

fitted.values:内核和k的所有组合的预测列表。

MISCLASS:分类错误的矩阵,用于查看错误率

二,kNN算法的R实现

R语言实现kNN算法的函数包主要有:

  • class函数包中的knn、knn.cv函数;
  • caret函数包中的knn3函数;
  • kknn函数包中的kknn函数;

class包是比较基础的,kknn是优化之后的算法。
例如,使用kknn包执行kNN算法,对检验数据集进行分类:

mydata <- read.csv(file='C:/BlackFriday.csv',header=TRUE,stringsAsFactors = TRUE)
dt <- mydata[,c('Gender','Age', 'Occupation','City_Category','Stay_In_Current_City_Years', 'Marital_Status','Product_Category')]dt$Occupation <- factor(as.character(dt$Occupation))
dt$Product_Category=factor(as.character(dt$Product_Category))mydt <- dt[1:10000,]library(kknn)m <- dim(mydt)[1]
val <- sample(1:m,round(m/10),replace = TRUE)dt.learn <- mydt[-val,]
dt.test <- mydt[val,]myk <- train.kknn(Product_Category~.,dt.learn)
k <- myk$best.parameters # get best parameters of kNNmyknn <- kknn(Product_Category ~.,dt.learn,dt.test,k=11)summary(myknn)fit <- fitted(myknn)
table(fit,dt.test$Product_Category)

参考文档:

KNN算法的R语言实现

数据挖掘 第五篇:分类(kNN)相关推荐

  1. 数据挖掘算法揭秘篇——分类方法(一)

    分类是一种重要的数据挖掘技术,其目的是根据数据集的特点构造一个分类函数或分类模型(也常称作分类器),该模型能把未知类别的样本映射到给定的类别当中. 分类可描述如下:输入数据,或称训练集(Trainin ...

  2. 《数据挖掘导论》Pangaea-Ning Tan 读书笔记 ----第五章 分类其他技术

    文章目录 第五章 分类:其他技术 5.1 基于规则的分类 5.1.1 基于规则的分类器的工作原理 5.1.2 规则的排序方案 5.2 最近邻算法(KNN) 无监督最近邻 KDTree和BallTree ...

  3. 第五篇——胡咧咧之动漫素材分类如何妙用?

    第五篇--胡咧咧之动漫素材分类如何妙用? 催动我进行分类的原因有两个哈: 第一个就是阿婆猪们的卡点视频好看啊,视觉盛宴啊,我也想弄这样的视频啊,而分类就很有用了,比如火影战斗场面的素材,都集合到一个视 ...

  4. python数据挖掘笔记】二十.KNN最近邻分类算法分析详解及平衡秤TXT数据集读取

    #2018-04-06 07:57:00 April Friday the 14 week, the 096 day SZ SSMR python数据挖掘笔记]二十.KNN最近邻分类算法分析详解及平衡 ...

  5. 带你少走弯路:五篇文章学完吴恩达机器学习

    本文是吴恩达老师的机器学习课程[1]的笔记和代码复现部分,这门课是经典,没有之一.但是有个问题,就是内容较多,有些内容确实有点过时. 如何在最短时间学完这门课程?作为课程的主要翻译者和笔记作者,我推荐 ...

  6. 数据挖掘 —— 有监督学习(分类)

    数据挖掘 -- 有监督学习(分类) 1. KNN分类算法 2. 决策树分类算法 3. SVM算法简介 4. 分类--集成算法 4.1 随机森林参数介绍 4.2 Adaboost算法参数介绍 5 总结 ...

  7. CCNP-第五篇-OSPF高级版(二)

    CCNP-第五篇-OSPF高级版(二) 链路状态数据库=LSDB=拓扑表 link state database 收到之后放入自己的数据库再计算最新的放入路由表 根据COST值来计算 >COST ...

  8. MVC教程第五篇:MVC整合Ajax

    MVC教程第五篇:MVC整合Ajax     摘要 本文将从完成"输入数据验证"这个功能出发,逐渐展开ASP.NET MVC与Ajax结合的方法.首先,本文将使用ASP.NET M ...

  9. Linux系统详解 第五篇:Linux的安装-4:Fedora 16的安装

    Linux系统详解 第五篇:Linux的安装-4:Fedora 16的安装 前言: 本系列文章取材广泛,有来自于互联网的,有来自教科书的,有来自自己的笔记的,也有来自自己对Linux的经验积累的.此系 ...

  10. 计算机工程说课稿,人教版数学说课稿集合五篇

    人教版数学说课稿集合五篇 在教学工作者实际的教学活动中,时常需要用到说课稿,编写说课稿助于积累教学经验,不断提高教学质量.如何把说课稿做到重点突出呢?下面是小编为大家整理的人教版数学说课稿5篇,欢迎大 ...

最新文章

  1. Win7下U盘安装Ubuntu14.04双系统
  2. leetcode算法题--比特位计数
  3. 云炬创业政策学习笔记20210106
  4. boost::geometry::model::segment用法的测试程序
  5. github中的watch、star、fork的作用
  6. linux系统将python升级到2.7.10版本
  7. diamond升级IP,覆盖的时候报错
  8. 漫步数学分析三十五——乘法法则与梯度
  9. Java从入门到精通 第4章 常量与变量
  10. Android开源项目:微信打飞机游戏源代码
  11. FMEA软件功能安全 FMEAHunter
  12. 推荐一个特别好用的软件,简直就是懒人神器,强迫症的福音
  13. QT常用函数和总结(持续更新)
  14. 哮喘病人小气道上皮细胞 (Asthma) Small airway epithelial cells 培养解决方案
  15. access查询设计sol视图_选择查询-在access中如何建立一个选择查询只查询一个信?在access 爱问知识人...
  16. ZUCC_计算机网络实验_实验09 网络基本命令
  17. 洛谷 CF311B Cats Transport
  18. php支持postgresql,php支持postgresql
  19. Electron+Vue3+Vite+Element-Plus,保持软后台全速运行(解决循环过多导致的界面不刷新问题,保证窗口失去焦点后setTimeOut可用)
  20. 麒麟KY-RTI分布仿真技术:前言

热门文章

  1. Java 安装+环境配置(图文详解)
  2. 值得看看的艺术影片 (转)
  3. python根据汉字获得拼音_python获_取一组汉字拼音首字母的方法
  4. 洛谷 P3987 我永远喜欢珂朵莉~(Splay+BIT+无限卡常)
  5. 基于深度学习的多目标跟踪(MOT)技术一览
  6. Weclome to Thm-V九维空间
  7. mac 安装virtualbox虚拟机
  8. 安卓126邮箱服务器怎么填,安卓126邮箱设置.doc
  9. 关于Flutter应用程序的AndroidX兼容性
  10. 81、【backtrader基金策略】如果每周定投一次,在周几定投收益率更高?