你好,游客 登录
背景:
阅读新闻

R语言与数据分析之三:分类算法2

[日期:2014-12-12] 来源:CSDN博客  作者:HowardGe [字体: ]

      上期与大家分享的传统分类算法都是建立在判别函数的基础上,通过判别函数值来确定目标样本所属的分类,这类算法有个最基本的假设:线性假设。今天继续和大家分享下比较现代的分类算法:决策树和神经网络。这两个算法都来源于人工智能和机器学习学科。

      首先和小伙伴介绍下数据挖掘领域比较经典的Knn(nearest neighbor)算法(最近邻算法)

      算法基本思想:

      Step1:计算出待测样本与学习集中所有点的距离(欧式距离或马氏距离),按距离大小排序,选择出距离最近的K个学习点;

      Step2:统计被筛选出来的K个学习点,看他们在分类中的分布,频数最大的分类及为待测点的分类;

决策树(Decision tree)

      该算法主要来源于人工智能,常用语博弈论,基本逻辑如下图(解释女网友见男网友的决策过程)。决策数学习集的属性可以是非连续的,可以是因子,也可 以逻辑是非等。决策过程中需要找到信息增益最大的属性作为根节点,然后逐级找出信息增益次小的属性,作为下一层决策点,逐级按照信息增益排列的所有属性, 即可做出决策树。目前用的最多的ID3和其后续升级版。

      现在我们来看看如何用R帮我们做决策树分析,我们借助鸢尾花数据集来做,同时我们需要导入rpart包来做决策树分析:

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. install.packages("rpart") 
  2. library(rpart) 
  3. iris.rp=rpart(Species~.,data=iris,method="class") 
  4. plot(iris.rp,uniform=T,branch=0,margin=0.01,main="DecisionTree") 
  5. text(iris.rp,use.n=T,fancy=T,col="blue") 

结果如下图:

人工神经网络

ANN(Artificial NeuralNetWorks)

通过学习集构造出一个模型(感知器:如下图),图中0.3即为该分支的权值,0.4为偏置因子(t), sum求和为本例的激活函数(也可是其他函数:三角,指数等),人工神经网络也就是通过学习集来修正权值,通过负反馈过程进行,具体算法如下:

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. Step1:另D={(xi,yi)|i=1,2…n}作为训练集; 
  2. Step2:随机生成初始权值向量w; 
  3. Step3: for 每一个训练集 
  4.             计算输出预测yyi 
  5.             For 每个权值wj 
  6.                 更新权值wj(k+1)=wj(k)+a(yi-yyi(k))*xij 
  7.             EndFor 
  8.     endFor 
  9. until满足终止条件 
  10. Ps: a 为学习效率,通常是是一个较小的数字 

显示的问题往往比较复杂,需要构造多层神经网络如下图:

接下来给小伙伴们分享下R语言如何实现人工神经网络分析,我们需要安装AMORE包,我们就解决上文提到的3个变量分类y 的案例:

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. library(AMORE) 
  2. x1=c(1,1,1,1,0,0,0,0) 
  3. x2=c(0,0,1,1,0,1,1,0) 
  4. x3=c(0,1,0,1,1,0,1,0) 
  5. y=c(-1,1,1,1,-1,-1,1,-1) 
  6. p<-cbind(x1,x2,x3) 
  7. target=y 
  8. net <- newff(n.neurons=c(3,1,1),learning.rate.global=1e-2, 
  9. momentum.global=0.4,error.criterium="LMS",Stao=NA,hidden.layer="tansig",output.layer="purelin",method="ADAPTgdwm")# n.neurons=c(输 入节点个数,……中间节点,输出节点个数), error.criterium="LMS"判断收敛的依据,最小平均平方 法,hidden.layer="tansig"隐藏层的激活函数,output.layer="purelin"输出层的哦激活函数 
  10. result <- train(net,p,target,error.criterium="LMS",report=TRUE,show.step=100,n.shows=5) 
  11. z<-sim(result$net,p) 

输出结果见下图:

其中Z看符号变可区分,对比Z 和Y,发现神经网络得出的结果和目标值100%吻合。

      由此,我们可以看出人工神经网络的强大魅力,我们可以不用去弄明白内部具体算法原理,我们只需要确定输入输出和设置相应的节点便可以轻松完成分类。对于隐藏层个数设置我们需要做一定的分析,并非隐藏层数越多,模型越精确,原因有两个:

      1、  对于问题规模不那么复杂时,较多的隐藏层会浪费我们过多没有必要的时间;

      2、  隐藏层越多确实可以给我们带来更好的拟合效果,但需要注意的是,对学习集的过度拟合会造成预测时的巨大误差。

      神经网络的黑箱性是把双刃剑,一方面黑箱给我们带来很大的方便;但另一方面黑箱的隐藏性让我们无法把控,得出的模型无法和业务结合做解释,因此神经网络需要新的思路来重构算法,Hopfield神经网络的出现就解决了早期神经网络的黑箱性和过度拟合等缺点。

原文链接:http://blog.csdn.net/howardge/article/details/41819729





收藏 推荐 打印 | 录入: | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款