Tiaaaaa 2016-11-22 01:33 采纳率: 0%
浏览 3089

R做判别分析,多分类问题的距离判别,同样的程序换个数据就运行不了?

多分类问题的距离判别原程序:

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是换我自己的数据之后的

图片说明

  • 写回答

2条回答 默认 最新

  • Tiaaaaa 2016-11-22 05:47
    关注

    通过把X,G代入到薛毅的程序里一行行运行,知道错在了哪一行:
    mahalanobis(TstX, mu[i,], var(TrnX))
    mahalanobis(TstX, mu[i,], var(TrnX[TrnG==i,]))

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

    马氏距离需要你计算协方差矩阵的逆。马氏内部方法解决了计算逆算矩阵的方法。不幸的是,如果在逆计算中使用的一些数字是非常小的,它假定它们是零,导致假设,它是一个奇异矩阵。这就是为什么它指定它们在计算上是奇异的,因为矩阵可能不是奇异的给定一个不同的公差。
    该解决方案是设置的公差时,它假定它们是零。幸运的是,将允许你通过这个参数(TOL)来解决:
    即加一个参数马氏距离需要你计算协方差矩阵的逆。马氏内部使用功能解决了计算逆算方法。不幸的是,如果在逆计算中使用的一些数字是非常小的,它假定它们是零,导致的假设,它是一个奇异矩阵。这就是为什么它指定它们在计算上是奇异的,因为矩阵可能不是奇异的给定一个不同的公差。
    该解决方案是设置的公差时,它假定它们是零。幸运的是,将允许你通过这个参数(TOL)来解决:
    新加入的参数是: ,tol=2e-21 (我的erro中数字是2.60317e-20,这里tol设置比error里的数字小就行)

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

    评论

报告相同问题?

悬赏问题

  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题