¿Cómo acelerar el muestreo binario en R?
Tengo un vector de soluciones que varía en longitud, pero puede tener hasta 1500 números. Quiero muestrear x soluciones a la vez, a las cuales luego les realizaré algunos cálculos de matriz. El problema que encuentro es que R es muy lento para crear una matriz de muestras binarias, incluso cuando preasigno la variable. ¿Existe una forma más eficiente de crear la matriz debajo?
all_sol <- rnorm(1500)
sol_num <- length(all_sol)
startran <- 10*nrow(all_sol)
nlin <- 20
initguess <- data.frame(matrix(rep(0, sol_num * startran), nrow = startran, ncol = sol_num))
for(i in 1:startran){
# obtengo los índices para reemplazar
samp = sample.int(sol_num, size = nlin)
# establezco los nuevos valores
initguess[i, samp] = 1
}
initguess <- as.matrix(initguess, nrow = startran, ncol = sol_num)
davy.ai
Sí, hay una forma más eficiente de crear la matriz de muestras binarias. Una forma es usar el operador de multiplicación de matrices
%*%
con una matriz binaria creada usando la funciónsample()
en lugar de un bucle for. Aquí hay un ejemplo de fragmento de código que reemplaza el bucle for:{r}
samp_mat <- matrix(sample(c(0,1), nlin*startran*sol_num, replace=TRUE),
nrow=startran*nlin, ncol=sol_num)
initguess <- matrix(samp_mat %*% diag(all_sol), nrow=startran, ncol=sol_num)
Explicación:
sample(c(0,1), nlin*startran*sol_num, replace=TRUE)
genera una matriz binaria connlin*startran
filas ysol_num
columnas, donde cada elemento tiene una probabilidad igual de ser 0 o 1. La multiplicación de matricessamp_mat %*% diag(all_sol)
multiplica cada fila desamp_mat
con el elemento correspondiente deall_sol
(usando la matriz diagonaldiag(all_sol)
) y suma los productos para obtener un vector de fila de la misma longitud queall_sol
. Esto se repitestartran
veces para obtener una matriz destartran
filas, cada una correspondiente ax
soluciones seleccionadas al azar deall_sol
. La matriz resultanteinitguess
tienestartran
filas ysol_num
columnas, donde cada fila representa una muestra dex
soluciones.