全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
4417 4
2016-11-21
多分类问题的距离判别原程序:

distinguish.distance<-function
   (TrnX, TrnG, TstX = NULL, var.equal = FALSE){
   if ( is.factor(TrnG) == FALSE){
       mx<-nrow(TrnX); mg<-nrow(TrnG)
       TrnX<-rbind(TrnX, TrnG)
       TrnG<-factor(rep(1:2, c(mx, mg)))
   }
   if (is.null(TstX) == TRUE) TstX<-TrnX
   if (is.vector(TstX) == TRUE)  TstX<-t(as.matrix(TstX))
   else if (is.matrix(TstX) != TRUE)
      TstX<-as.matrix(TstX)
   if (is.matrix(TrnX) != TRUE) TrnX<-as.matrix(TrnX)

   nx<-nrow(TstX)
   blong<-matrix(rep(0, nx), nrow=1, dimnames=list("blong", 1:nx))
   g<-length(levels(TrnG))
   mu<-matrix(0, nrow=g, ncol=ncol(TrnX))
   for (i in 1:g)
      mu[i,]<-colMeans(TrnX[TrnG==i,])
   D<-matrix(0, nrow=g, ncol=nx)
   if (var.equal == TRUE  || var.equal == T){
      for (i in 1:g)
         D[i,]<- mahalanobis(TstX, mu[i,], var(TrnX))
   }
   else{
      for (i in 1:g)
         D[i,]<- mahalanobis(TstX, mu[i,], var(TrnX[TrnG==i,]))
   }
   for (j in 1:nx){
      dmin<-Inf
      for (i in 1:g)
          if (D[i,j]<dmin){
             dmin<-D[i,j]; blong[j]<-i
      }
   }
   blong
}


参考薛毅的《统计建模与R》里的判别分析,按他书里的例子用iris数据可以运行,我换了自己的X和G就不可以了,不明白问题出在哪里?

代码和运行错误的截图如下:  X1、G1是薛毅书里的数据,X、G是换我自己的数据之后的
附件列表
111.PNG

原图尺寸 154.26 KB

111.PNG

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2016-11-22 13:53:36
通过把X,G代入到薛毅的程序里一行行运行,知道错在了哪一行:
mahalanobis(TstX, mu[i,], var(TrnX))
mahalanobis(TstX, mu[i,], var(TrnX[TrnG==i,]))

百度mahalanobis 和 Eroor in........, 果然有人提问这个,而且也附有解答,函数是求马氏距离。

马氏距离需要你计算协方差矩阵的逆。马氏内部使用功能解决了计算逆算方法。不幸的是,如果在逆计算中使用的一些数字是非常小的,R认为它们是零,导致的假设,它是一个奇异矩阵。
解决方案是 : 允许你通过这个参数(TOL)来解决

新加入的参数是: ,tol=2e-21 (我的erro中数字是2.60317e-20,这里tol设置比error里的数字小就行)

将这个参数加入薛毅程序中mahalanobis()中去,得到结果。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-4-16 17:08:24
135792486 发表于 2016-11-22 13:53
通过把X,G代入到薛毅的程序里一行行运行,知道错在了哪一行:
mahalanobis(TstX, mu, var(TrnX))
mahalan ...
请问怎么加入mahalanobis()中,是第几个参数?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2018-8-30 09:42:56
135792486 发表于 2016-11-22 13:53
通过把X,G代入到薛毅的程序里一行行运行,知道错在了哪一行:
mahalanobis(TstX, mu, var(TrnX))
mahalan ...
,,,,,在哪添加那个tol 参数啊,直接添加的话没有用啊。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2018-8-30 09:42:56
135792486 发表于 2016-11-22 13:53
通过把X,G代入到薛毅的程序里一行行运行,知道错在了哪一行:
mahalanobis(TstX, mu, var(TrnX))
mahalan ...
,,,,,在哪添加那个tol 参数啊,直接添加的话没有用啊。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群