Ich programmiere eine expectation-maximization algorithm mit R. Um die Berechnung zu beschleunigen, möchte ich diesen Engpass vektorisieren. Ich weiß, dass N etwa hundert mal k ist.Wie beschleunigt man diese Art von Doppel-For-Schleife?
MyLoglik = 0
for (i in c(1:N))
{
for (j in c(1:k))
{
MyLoglik = MyLoglik + MyTau[i,j]*log(MyP[j]*MyF(MyD[i,], MyMu[j,], MyS[[j]]))
}
}
Es gibt auch diese Liste von Matrizen:
MyDf.list <- vector("list", k)
for(i in 1:k)
{
MyDf.list[[i]] <- matrix(0,d,d)
for (j in c(1:N))
{
MyDf.list[[i]] = MyDf.list[[i]] + MyTau[j,i]*as.numeric((MyD[j,]-MyMu[i,])) %*% t(as.numeric(MyD[j,]-MyMu[i,]))
}
MyDf.list[[i]] = MyDf.list[[i]]/MyM[i]
}
Ich habe mit ein wenig beschleunigt Dinge:
MyLoglik = 0
for (j in c(1:k))
{
MyR= apply(MyD, 1, function(x) log(MyP[j]*MyF(x, MyMu[j,], MyS[[j]])))
MyLoglik = MyLoglik + sum(MyTau[,j]*MyR)
}
und:
d = dim(MyD)[2]
MyDf.list <- vector("list", k)
for(i in 1:k)
{
MyDf.list[[i]] <- matrix(0,d,d)
MyR= apply(MyD, 1, function(x) as.numeric((x-MyMu[i,])) %*% t(as.numeric(x-MyMu[i,])))
MyDf.list[[i]] = matrix(rowSums(t(MyTau[,i]*t(MyR)))/MyM[i],d,d)
}
Netter Vorschlag für den ersten! Über die zweite, dachte ich, war die einzige Möglichkeit, die Arrays wie in Matlab zu bekommen. – Wok
Überprüfen Sie? Array - es kann mehrere Dimensionen behandeln. – Wine
Immer lernen. :) – Wok