distance.distinguish<-function
(x,class,newx = NULL){
if (is.factor(class)== FALSE){
class<-factor(class)
}
if (is.null(newx) == TRUE)
newx<-x
else
newx<-rbind(x,newx)
if (is.vector(newx) == TRUE)
newx<-t(as.matrix(newx))
else if (is.matrix(newx)!= TRUE)
newx<-as.matrix(newx)
if (is.matrix(x)!= TURE)
x<-as.matrix(x)
nx<-nrow(newx)
n<-rep("n",nx-nrow(x))
blong<-matrix(rep(0,2*nx),nrow=2)
g<-length(levels(class))
mu<-matrix(0,nrow=g,ncol=ncol(x))
for (i in 1:g)
mu[i,]<-colMeans(x[class==i,])
#计算各个总体的均值
D<-matrix(0,nrow=g,ncol=nx)
for (i in 1:g)
D[i,]<-mahalanis(newx,mu[i,],var(x[class==i,]))
#计算newx中每个样本与第i个总体的马氏距离,保存在行向量D[i,]中
for (j in 1:nx){
dmin<-Inf
for (i in 1:g)
if (D[i,j]<dmin){
dmin<-D[i,j];
blong[1,j]<-dmin;
blong[2,j]<-i
}
}
data.frame(G=c(class,n),distance=blong[1,],blong=blong[2,])
}
###R命令
x<-read.table("C:\\Users\\QJH\\Desktop\\第四次作业\\data.exercise.7.1.txt",header=T);x
x1<-x[,3:4];x1
x2<-x[,1];x2
newx<-c(5.5,245)
source("C:\\Users\\QJH\\Desktop\\第四次作业\\distance.distinguish.R")
distance.distinguish(x1,x2,newx)