原理:已知样本集中每一个数据与所属分类的对应关系,输入没有标签的新数据后,将新数据与训练集的数据对应特征进行比较,找出“距离”最近的k(通常k<20)数据,选择这k个数据中出现最多的分类作为新数据的分类。

算法描述:(1)计算已知类别数据及中的点与当前点的距离;

(2)按距离递增次序排序

(3)选取与当前点距离最小的k个点

(4)确定前K个点所在类别出现的频率

(5)返回频率最高的类别作为当前类别的预测

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

最常见以欧氏距离作为衡量标准,下文例子也以欧式距离为标准。

R实现:

以鸢尾花数据集为例来说明K-近邻算法:

鸢尾花数据集包含150个数据,测量变量为花瓣的长度与宽度,花萼的长度与宽度,以及种类分类为setosa, versicolor, 和 virginica。

(1)为了了解数据,应先通过作图分析,相关分析来看看数据分类指标的合理性,这一点十分重要,有助于减少分类指标中的噪声。

代码为:plot(Sepal.Width,Sepal.Length,col=Species)

plot(Petal.Width,Petal.Length,col=Species)

从上图可以看出,Petal的长度和宽度2个变量大致是可以把鸢尾花分类的,也就是说分类的特征变量选择是合理的,而Sepal的长度和宽度分类效果不如Petal,但大致上还是能区分的,当然也可以选择计算相关系数来看特征变量的合理性。

(2)数据归一化处理

容易发现,数值差最大的属性对距离的影响最大,所以在特征值等权重的假定下,我们先得归一化特征值,计算公式为:

Newvalue=(oldvalue-min)/(max-min)

代码为:

autonorm<-function(data){

min<-min(data)

max<-max(data)

for(i in 1:length(data))

data[i]<-(data[i]-min)/(max-min)

return(data)

}

data<-apply(as.matrix(iris[,1:4]),2,autonorm)

(3)计算距离。

在这里取三个数据作为验证集来看看分类的效果,首先将验证集归一化:

x<-iris[13,1:4]

y<-iris[79,1:4]

z<-iris[100,1:4]

x<-(x-apply(iris[c(-13,-79,-100),1:4],2,min))/(apply(iris[c(-13,-79,-100),1:4],2,max)-apply(iris[c(-13,-79,-100),1:4],2,min))

y<-(y-apply(iris[c(-13,-79,-100),1:4],2,min))/(apply(iris[c(-13,-79,-100),1:4],2,max)-apply(iris[c(-13,-79,-100),1:4],2,min))

z<-(z-apply(iris[c(-13,-79,-100),1:4],2,min))/(apply(iris[c(-13,-79,-100),1:4],2,max)-apply(iris[c(-13,-79,-100),1:4],2,min))

计算距离,仅以Z为例,运行代码:(k取5)

dis<-rep(0,length(data[,1]))

for(i in 1:length(data[,1]))

dis[i]<-sqrt(sum((z-data[i,1:4])^2))

table(iris[order(dis)[1:5],5])

结果如下:

从x,y,z的输出结果可以看到,分类完全正确,没有错误分类。

值得一提的是,我们用同样的办法计算K=3时的情形,会发现没有出现误分类。这也就引出了一个值得思考的问题:k应该如何选取?k过小,噪声对分类的影响就会变得非常大,K过大,那么包含错误就理所当然,误分类也不足为奇。虽然这里我们对K的取值并未进行讨论,但在实际中,我们应该通过交叉验证的办法来确定k值。

R语言内置函数kknn简介    

R语言里的kknn包也可以实现最邻近算法——使用kknn函数。

kknn(formula = formula(train),train, test, na.action = na.omit(), k= 7, distance = 2, kernel = "optimal", ykernel = NULL, scale=TRUE, contrasts= c('unordered' = "contr.dummy", ordered ="contr.ordinal"))

参数解释:

formula      一个回归模型,具体为:分类变量~特征变量

train        训练集

test         测试集

na.action    缺失值处理,默认为去掉缺失值

k           k值选择,默认为7

distance    这个是明科夫斯基距离,p=2时为欧氏距离

其他参数    略

上面的鸢尾花例子使用kknn包可以实现(k=5):

library(kknn)

data(iris)

m <- dim(iris)[1]

val <- sample(1:m, size =round(m/3), replace = FALSE,prob= rep(1/m, m))

iris.learn <- iris[-val,]

iris.valid <- iris[val,]

iris.kknn <- kknn(Species~.,iris.learn, iris.valid, distance = 5,kernel= "triangular")

summary(iris.kknn)

fit <- fitted(iris.kknn)

table(iris.valid$Species, fit)

运行结果为:

原文:http://blog.csdn.net/yujunbeta/article/details/14648343

分类算法——K近邻算法及其R实现相关推荐

  1. 第4章 最基础的分类算法-k近邻算法

    思想极度简单 应用数学知识少 效果好(缺点?) 可以解释机器学习算法使用过程中的很多细节问题 更完整的刻画机器学习应用的流程 distances = [] for x_train in X_train ...

  2. 09_分类算法--k近邻算法(KNN)、案例、欧氏距离、k-近邻算法API、KNeighborsClassifier、及其里面的案例(网络资料+学习资料整理笔记)

    1 分类算法–k近邻算法(KNN) 定义:如果一个样本在特征空间中**k个最相似(即特征空间中最邻近)**的样本中的大多数属于某一个类别,则该样本也属于这个类别,则该样本也属于这个类别. k-近邻算法 ...

  3. python人工智能——机器学习——分类算法-k近邻算法

    分类算法-k近邻算法(KNN) 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. 来源:KNN算法最早是由Cover和Hart提 ...

  4. 惰性学习算法 ---- k 近邻算法

    惰性学习算法 ---- k 近邻算法 KNN 是惰性学习算法的典型例子.说它具有 惰性 不是因为它看起来简单,而是因为它仅仅对训练数据集有记忆功能,而不会从训练集中通过学习得到一个函数. 这种基于记忆 ...

  5. 机器学习算法---K近邻算法

    K近邻算法 1. K-近邻算法简介 1.1 什么是K-近邻算法 根据你的"邻居"来推断出你的类别 K Nearest Neighbor算法⼜叫KNN算法,这个算法是机器学习⾥⾯⼀个 ...

  6. 机器学习-分类之K近邻算法(KNN)原理及实战

    k近邻算法(KNN) 简介 KNN算法是数据挖掘分类技术中最简单的方法之一.它通过测量不同特征值之间的距离进行分类的.其基本思路为:如果一个样本在特征空间中的k个最近邻样本中的大多数属于某一个类别,则 ...

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

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

  8. python人工智能——机器学习——分类算法-k近邻算法——kaggle案例: Facebook V: Predicting Check Ins

    题目及翻译 Facebook and Kaggle are launching a machine learning engineering competition for 2016. Faceboo ...

  9. k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优

    k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优 k近邻算法 k近邻算法概述 k近邻算法代码实现 k近邻算法的评价 朴素贝叶斯算法 朴素贝叶斯算法概述 朴素贝叶斯代码实现 朴素贝叶斯的评价 分类模型 ...

最新文章

  1. “你行你上”:有本事跟OpenAI Five打一把DOTA?| 极客头条
  2. python sql语句传参数_pyMySQL SQL语句传参问题,单个参数或多个参数说明
  3. IE中页面不居中,火狐谷歌等正常
  4. 跟我学大数据分析之四:“钱”去哪儿了?
  5. .NET Core实战项目之CMS 第十七章 CMS网站系统的部署
  6. 一秒点击屏幕次数测试_安卓App性能专项测试流畅度深度解析
  7. Bootstrap之栅格系统
  8. Linux——curl(转)
  9. oracle中between
  10. js实现的tooltip简单小组件
  11. Android 系统(132)---ODM 开发用户常见需求文档(六)
  12. Dell R410服务器查看系统raid级别
  13. python 菜鸟-Python 列表(List)
  14. python 实例化过程_python实例化对象的具体方法
  15. visual studio可以开发app吗_做好APP定制开发的计划,可以让你的应用开发事半功倍...
  16. 技术创新是场寂寞的长跑
  17. 2022-2027年中国海参行业市场深度分析及投资战略规划报告
  18. 统计学知识大梳理(附框架图公式)
  19. 最适合0基础入门的5种编程语言
  20. 联想电脑充不进去电,电量一直为0,插充电器才可以开机问题

热门文章

  1. 1084. Broken Keyboard (20)
  2. Udp广播的发送和接收(iOS + AsyncUdpSocket)下篇
  3. HDU 1176 免费馅饼
  4. DOS下如何访问4G内存
  5. input type=file 实现上传、预览、删除等功能
  6. python opengl 截图_初试PyOpenGL二 (Python+OpenGL)基本地形生成与高度检测
  7. 开关电源磁性元件理论及设计pdf_邵革良首席科学家丨高性价比PFC电源设计及其电感技术...
  8. EJB3.0 JPQL
  9. 微软小娜 服务器连不上网,Win10 64位联网状态下微软小娜无法连接网络
  10. android注册的模板下载地址,Android --LoginActivity模板登录