Génération de vecteurs aléatoires avec contraintes

10

J'ai besoin de créer des vecteurs aléatoires de nombres réels a_i satisfaisant aux contraintes suivantes:

abs(a_i) < c_i;      
sum(a_i)< A;        # sum of elements smaller than A
sum(b_i * a_i) < B; # weighted sum is smaller than B 
aT*A*a < D          # quadratic multiplication with A smaller than D

where c_i, b_i, A, B, D are constants.

Quel serait l'algorithme typique pour générer efficacement ce type de vecteur?

LouisChiffre
la source
1
Qu'entendez-vous par la quatrième contrainte, "La magnitude d'un est .."
M. Tibbits
Mon erreur. Description terminée. Merci pour les commentaires.
LouisChiffre
Comment cela a_isuit-il la distribution p_iet est-il aussi moins que cela c? C'est parce que la distribution p_iest aussi moins que ça c? Dans quelle distribution pensez-vous?
deps_stats
@deps_stats. Très bons points. Le pseudo-code n'était pas très clair. La distribution que j'ai en tête est la distribution poisson. Chaque élément suit une distribution de poisson avec un lambda différent. Dans cet esprit, je suppose que la première condition (a_i <c) n'est pas nécessaire car je peux simplement redimensionner a_i à la fin de la génération pour la satisfaire.
LouisChiffre
Permettez - moi de poser une autre question ... Est -ce la c, A, Bet lambdas fixes?
deps_stats

Réponses:

4

Si je vous comprends bien, seuls les points d'un petit volume d'espace à n dimensions répondent à vos contraintes.

Votre première contrainte la contraint à l'intérieur d'une hypersphère, ce qui me rappelle la FAQ comp.graphics.algorithms "Points aléatoires uniformes sur la sphère" et Comment générer des points uniformément distribués dans la boule d'unité 3D? La deuxième contrainte tranche un peu en dehors de l'hypersphère, et les autres contraintes diminuent encore davantage le volume qui répond à vos contraintes.

Je pense que la chose la plus simple à faire est l'une des approches suggérées par la FAQ:

  • choisissez un cadre de sélection arbitraire aligné sur l'axe qui, nous en sommes sûrs, contient tout le volume. Dans ce cas, -c <a_1 <c, -c <a_2 <c, ... -c <a_n <c contient tout le volume contraint, car il contient l'hypersphère décrite par la première contrainte, et les autres contraintes continuent de se tailler loin à ce volume.
  • L'algorithme sélectionne uniformément les points dans cette boîte englobante. Dans ce cas, l'algorithme définit indépendamment chaque coordonnée d'un vecteur candidat sur un certain nombre aléatoire uniformément réparti indépendant de -c à + c. (Je suppose que vous voulez des points distribués avec une densité égale dans tout ce volume. Je suppose que vous pourriez faire en sorte que l'algorithme sélectionne certaines ou toutes les coordonnées avec une distribution de Poisson ou une autre distribution non uniforme, si vous aviez une raison de le faire).
  • Une fois que vous avez un vecteur candidat, vérifiez chaque contrainte. Si l'un d'eux échoue, revenez en arrière et choisissez un autre point.
  • Une fois que vous avez un vecteur candidat, stockez-le quelque part pour une utilisation ultérieure.
  • Si vous n'avez pas assez de vecteurs stockés, revenez en arrière et essayez d'en générer un autre.

Avec un générateur de nombres aléatoires de qualité suffisamment élevée, cela vous donne un ensemble de coordonnées stockées qui répondent à vos critères avec une densité uniforme (attendue).

Hélas, si vous avez une dimensionnalité relativement élevée n (c'est-à-dire si vous construisez chaque vecteur à partir d'une liste de coordonnées relativement longue), la sphère inscrite (et encore moins votre volume réduit) a une part étonnamment petite du volume total de la zone de délimitation totale, il peut donc être nécessaire d'exécuter de nombreuses itérations, la plupart générant des points rejetés en dehors de votre zone contrainte, avant de trouver un point à l'intérieur de votre zone contrainte. Étant donné que les ordinateurs de nos jours sont assez rapides, cela sera-t-il assez rapide?

David Cary
la source
Donc, ce que vous proposez est effectivement d'échantillonner l'espace. J'ai un problème similaire, sauf que la recherche d'une boîte englobante ne peut pas être effectuée statiquement (IE, ne peut pas être codée en dur). Par expérience, cela tombe en panne si vos contraintes sont de la forme. f1(x1) + f2(x2) == CDes suggestions ici?
Groostav
Oui, la méthode d'échantillonnage ne fonctionne pas si vous avez des contraintes d'égalité ("=="). Contraintes telles que des points qui se trouvent à la surface d'une sphère, ou à la surface d'un cylindre, etc. (rayon == R), plutôt qu'à l'intérieur de la sphère (rayon <= R). La sélection uniforme de points sur l'ensemble du volume n'atteindra "jamais" (probabilité proche de 0) la surface souhaitée. Donc, vous devez en quelque sorte ne sélectionner que les points qui se trouvent sur cette surface - c'est-à-dire, pour trouver des points [x1, x2, x3] tels que f1 (x1) + f2 (x2) == C, vous pouvez choisir au hasard x1 puis forcer x2 = inverse_f2 (C - f1 (x1)).
David Cary
Pour le cas particulier des points uniformément répartis sur la surface d'une sphère, voir "Points aléatoires uniformes sur la sphère" .
David Cary
@Groostav: Votre question est peut-être suffisamment différente de la question d'origine pour que vous puissiez la publier en tant que nouvelle question de niveau supérieur? "On vient de me dire que je dois poster une question de suivi, pourquoi et comment?"
David Cary