数据分析与挖掘 - R语言:KNN算法

一个简单的例子!
环境:CentOS6.5
Hadoop集群、Hive、R、RHive,具体安装及调试方法见博客内文档。

KNN算法步骤:
需对所有样本点(已知分类+未知分类)进行归一化处理。然后,对未知分类的数据集中的每个样本点依次执行以下操作:
1、计算已知类别数据集中的点与当前点(未知分类)的距离。
2、按照距离递增排序
3、选取与当前距离最小的k个点
4、确定前k个点所在类别的出现频率
5、返回前k个点出现频率最高的类别作为当前点的预测类别

编写R脚本:

#!/usr/bin/Rscript
#1、对iris进行归一化处理
iris_s <- data.frame(scale(iris[, 1:4]))
iris_s <- cbind(iris_s, iris[, 5])
names(iris_s)[5] = "Species"

#2、对iris数据集随机选择其中的100条记录作为已知分类的样本集
sample.list <- sample(1:150, size = 100)
iris.known <- iris_s[sample.list, ]

#3、剩余50条记录作为未知分类的样本集(测试集)
iris.unknown <- iris_s[-sample.list, ]

#4、对测试集中的每一个样本,计算其与已知样本的距离,因为已经归一化,此处直接使用欧氏距离
length.known <- nrow(iris.known)
length.unknown <- nrow(iris.unknown)

#5、计算
for (i in 1:length.unknown) {
    dis_to_known <- data.frame(dis = rep(0, length.known))
    for (j in 1:length.known) {
        dis_to_known[j, 1] <- dist(rbind(iris.unknown[i, 1:4], iris.known[j,1:4]), method = "euclidean")
        dis_to_known[j, 2] <- iris.known[j, 5]
        names(dis_to_known)[2] = "Species"
    }

    dis_to_known <- dis_to_known[order(dis_to_known$dis), ]

    k <- 5
    type_freq <- as.data.frame(table(dis_to_known[1:k, ]$Species))
    type_freq <- type_freq[order(-type_freq$Freq), ]
    iris.unknown[i, 6] <- type_freq[1, 1]
}

names(iris.unknown)[6] = "Species.pre"

#7、输出分类结果
iris.unknown[, 5:6]

输出结果:略,结果集中,Species为样本实际分类,Species.pre为Knn算法的分类,正确率达90%以上。

KNN是有监督的学习算法,其特点有:
1、精度高,对异常值不敏感
2、只能处理数值型属性
3、计算复杂度高(如已知分类的样本数为n,那么对每个未知分类点要计算n个距离)

KNN算法存在的问题:
1、k值的确定是个难题。
2、如果距离最近的k个已知分类样本中,频数最高的类型有多个(频数相同),如何选择对未知样本的分类?目前看是随机的。
3、如果有n个未知类型样本,m个已知类型样本,则需要计算n*m个距离,计算量较大,且需存储全部数据集合,空间复杂度也较大。
4、能否把预测的样本分类加入到已知类别集合中,对剩余的未知类型样本进行分类?
5、归一化放在所有处理的最前面,这样需要知道全部的样本集合(已知分类+未知分类)来构建分类器,而实际上未知分类的样本并不一定能事先获得,这样如何进行归一化处理?

时间: 2024-10-06 04:47:38

数据分析与挖掘 - R语言:KNN算法的相关文章

下载零基础数据分析与挖掘R语言实战课程(R语言)

随着大数据在各行业的落地生根和蓬勃发展,能从数据中挖金子的数据分析人员越来越宝贝,于是很多的程序员都想转行到数据分析,挖掘技术哪家强?当然是R语言了,R语言的火热程度,从TIOBE上编程语言排名情况可见一斑.于是善于学习的程序员们开始了R语言的学习之旅.对于有其他语言背景的程序员来说,学习R的语法小菜一碟,因为它的语法的确太简单了,甚至有的同学说1周就能掌握R语言,的确如此.但是之后呢?……好像进行不下去了!死记硬背记住了两个分析模型却不明其意,输出结果如同天书不会解读,各种参数全部使用缺省值,

零基础数据分析与挖掘R语言实战课程(R语言)

随着大数据在各行业的落地生根和蓬勃发展,能从数据中挖金子的数据分析人员越来越宝贝,于是很多的程序员都想转行到数据分析, 挖掘技术哪家强?当然是R语言了,R语言的火热程度,从TIOBE上编程语言排名情况可见一斑.于是善于学习的程序员们开始了R语言的学习 之旅.对于有其他语言背景的程序员来说,学习R的语法小菜一碟,因为它的语法的确太简单了,甚至有的同学说1周就能掌握R语言,的确如 此.但是之后呢?……好像进行不下去了!死记硬背记住了两个分析模型却不明其意,输出结果如同天书不会解读,各种参数全部使用缺

数据分析与挖掘 - R语言:贝叶斯分类算法(案例三)

案例三比较简单,不需要自己写公式算法,使用了R自带的naiveBayes函数. 代码如下: > library(e1071)> classifier<-naiveBayes(iris[,1:4], iris[,5]) #或写成下面形式,都可以. > classifier<- naiveBayes(Species ~ ., data = iris) #其中Species是类别变量 #预测 > predict(classifier, iris[1, -5]) 预测结果为:

数据分析与挖掘 - R语言:贝叶斯分类算法(案例二)

接着案例一,我们再使用另一种方法实例一个案例 直接上代码: #!/usr/bin/Rscript library(plyr) library(reshape2) #1.根据训练集创建朴素贝叶斯分类器 #1.1.生成类别的概率 ##计算训练集合D中类别出现的概率,即P{c_i} ##输入:trainData 训练集,类型为数据框 ## strClassName 指明训练集中名称为 strClassName列为分类结果 ##输出:数据框,P{c_i}的集合,类别名称|概率(列名为 prob) cla

2015lopdev生态联盟开发者大会:股市中的R语言量化算法模型

前言 记得10年前还在上学的时候,总是参加IBM的大会,看着各种新技术从实验室创造,特别地神奇.今天我也有机会站在了IBM大会的讲台上,给大家分享我所研究的R语言技术,对我来说也是一件非常有纪念意义的事情. 感谢IBM主办方的邀请,也真心希望有机会与IBM建立合作机会. 目录 我的演讲主题:股市中的R语言量化算法模型 会议体验和照片分享 整体文章:http://blog.fens.me/meeting-lopdev-20150922/

2015WOT移动互联网开发者大会:股市中的R语言量化算法模型

前言 大会历时两天,以"洞察移动互联网用户行为 分享移动应用研发实践"为主题,共设立"架构与设计"."平台与技术"."MDSA创新与创业"."移动游戏"."算法分析"."HTML5专场"."运维安全"."新浪微博技术"等八大技术专场,并垂直整合了技术和体验,深度服务于参会者与讲师.同时,在内容上也深度结合了目前移动互联网环境,通

R语言 神经网络算法

人工神经网络(ANN),简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经网络由大量的人工神经元联结进行计算.大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统.现代神经网络是一种非线性统计性数据建模工具,常用来对输入和输出间复杂的关系进行建模,或用来探索数据的模式. 人工神经网络从以下四个方面去模拟人的智能行为: 物理结构:人工神经元将模拟生物神经元的功能 计算模拟:人脑的神经元有局部计算和存储的功能,通过连接构成一个系统.人工神经网络中也有大量

ML(5):KNN算法

K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,可以简单的理解为由那离自己最近的K个点来投票决定待分类数据归为哪一类.这个算法是机器学习里面一个比较经典的算法, 总体来说KNN算法是相对比较容易理解的算法.其中的K表示最接近自己的K个数据样本.KNN算法和K-Means算法不同的是,K-Means算法用来聚类,用来判断哪些东西是一个比较相近的类型,而KNN算法是用来做归类的,也就是说,有一个样本空间里的样本分成几个类型,然后,给定一个待分类的数据,通过计算

R与数据分析学习总结之一:R语言基本操作

最近开始学习R语言,把学习笔记和小伙伴们分享一下吧,欢迎一起交流 R 起源: R是S语言的一种实现.S语言是由 AT&T贝尔实验室开发的一种用来进行数据探索.统计分析.作图的解释型语言.最初S语言的实现版本主要是S-PLUS.S-PLUS是一个商业 软件,它基于S语言,并由MathSoft公司的统计科学部进一步完善.后来Auckland大学的Robert Gentleman 和 Ross Ihaka 及其他志愿人员开发了一个R系统.R的使用与S-PLUS有很多类似之处,两个软件有一定的兼容性.