He estado utilizando la función random_element()
proporcionada por SAGE para generar particiones enteras aleatorias para un número entero dado (N
) que tienen una longitud determinada (S
). Intento generar muestras aleatorias imparciales del conjunto de todas las particiones para los valores dados de N
y S
. La función de SAGE devuelve rápidamente particiones aleatorias para N (es decir, Partitions(N).random_element()
).Algoritmo para generar aleatoriamente particiones enteras de una longitud determinada, en Python?
Sin embargo, se ralentiza enormemente al agregar S
(es decir, Partitions(N,length=S).random_element()
). Del mismo modo, el filtrado de particiones aleatorias de N
que son de longitud S
es increíblemente lento.
Sin embargo, y espero que esto ayude a alguien, me he dado cuenta que en el caso de que la función devuelve una partición de N
que no coincida con la longitud S
, que la partición conjugada es a menudo de longitud S. Es decir:
S = 10
N = 100
part = list(Partitions(N).random_element())
if len(part) != S:
SAD = list(Partition(part).conjugate())
if len(SAD) != S:
continue
Esto aumenta la velocidad a la que se encuentran particiones de longitud S
y aparece para producir muestras de recomendaciones (he examinado los resultados contra conjuntos completos de particiones para varios valores de N
y S
).
Sin embargo, estoy usando valores de N (por ejemplo, 10,000
) y S (por ejemplo, 300
) que hacen que incluso este enfoque sea poco práctico. El comentario asociado con la función random_element()
de SAGE admite que hay mucho espacio para la optimización. Entonces, ¿hay alguna forma de generar más rápidamente muestras imparciales (es decir, aleatorio) de particiones enteras que coincidan con los valores dados de N
y S
, quizás, al no generar particiones que no coincidan con S
? Además, el uso de particiones conjugadas funciona bien en muchos casos para producir muestras imparciales, pero no puedo decir que entiendo precisamente por qué.
Gracias por la respuesta, pero no veo cómo esta función se obtiene particiones basadas en el muestreo aleatorio uniforme. – klocey
@klocey, me perdí el hecho de que estás generando elementos aleatorios de la secuencia, lo siento. –
Implementé esta función y comparé las muestras aleatorias generadas por él con conjuntos completos de particiones para varias combinaciones de N y S. Las comparaciones se realizaron usando curvas de densidad de kernel generadas a partir de varianzas de particiones. Al igual que cualquier otra estrategia de muestreo que he probado, esta función produce muestras sesgadas (particiones de una varianza inferior a la esperada). Aparentemente, es realmente difícil generar una muestra aleatoria imparcial del conjunto de todas las particiones para un N total dado y una longitud S. La función SAGE es la más cercana que he visto, pero está lejos de ser óptima. – klocey