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

图片说明

通过把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中去,得到结果。

。。。复制粘贴有一小块重复了,凑合看吧- -