将函数应用于多个向量/列表R

时间:2016-01-29 02:11:14

标签: r list function apply

我创建了一个函数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

谢谢大家

0 个答案:

没有答案