我创建了一个函数g
来计算多元正态分布后的最大似然,以便在34个类之间对数据帧test
的行进行分类。所以我需要在数据框架上使用这个函数,并使用几组不同的参数。我的代码有效,但速度慢。我想让它更快,可能是删除for
循环并使用其他一些apply的系列函数(我没有任何经验)。
g = function(x,p,mu,Sigma){
log(p) - log(det(Sigma)) - as.matrix(x-mu)%*%solve(Sigma)%*%t(as.matrix(x-mu))
}
mu = summaryBy(.~class,train,FUN=mean)
Sigma = by(train[,1:8],train$class,cov)
p = as.data.frame(table(train$class))
p$Freq = p$Freq/n
k = length(levels(train$class))
logver = NULL
for(j in 1:k){
logver = cbind(logver,apply(test,1,g,p=p$Freq[j],mu=mu[j,-1],Sigma=Sigma[[j]]))
}
preds = apply(logver,1,which.max)
输出logver
必须是一个数据框,每行测试一行,每个j一个col,所以在这种情况下有340000行和34个col。
p$Freq
是一个数字向量1x34。 mu
是数据框34x9(第一个col是由summaryBy生成的因子)。 Sigma
是一个包含34个元素的列表,每个元素是一个8x8的covariace矩阵。 test
是数据框340000x8。
head(test)
band1 band2 band3 band4 band5 band6 band7 band9
1 2.0592 4.3630 6.6506 10.5952 18.4566 37.3683 36.9154 33.9467
2 2.5772 4.0766 6.0116 10.1476 18.8585 36.7654 36.2221 33.3717
3 2.8240 4.0766 6.4183 9.6813 18.5148 37.3113 35.7318 33.8367
4 2.8999 4.4317 7.4529 10.2842 18.4566 37.2513 37.3219 33.8367
5 2.8684 3.5324 7.5845 10.9021 19.2262 37.4758 36.0219 33.3472
6 2.4069 4.3256 6.0241 10.6668 20.0381 36.7203 36.4816 33.3472
head(train)
band1 band2 band3 band4 band5 band6 band7 band9 class
1 5.1224 8.1723 11.6837 15.6408 22.5884 33.9782 32.2985 32.1805 Green
2 5.4430 6.1158 9.8344 14.7719 23.2234 34.1247 32.0722 32.4367 Dry
3 4.5048 7.7364 11.9494 15.7740 22.6291 33.7642 32.4599 32.5217 Conifer
4 5.3120 6.9558 9.8344 14.3223 22.8088 34.0513 32.2985 32.4045 Snow
5 5.2907 6.6837 10.5367 16.0684 22.6291 33.7156 32.1650 32.4900 Ice
6 5.3120 6.8131 10.9727 15.7114 22.8088 34.6136 32.4772 32.4367 Soil
谢谢大家