Zufallsvektoren mit Einschränkungen erzeugen

10

Ich muss Zufallsvektoren von reellen Zahlen a_i erstellen, die die folgenden Bedingungen erfüllen:

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.

Was wäre der typische Algorithmus, um diese Art von Vektor effizient zu erzeugen?

LouisChiffre
quelle
1
Was meinst du mit der vierten Einschränkung: "Die Größe von a ist ..."
M. Tibbits
Mein Fehler. Fertige Beschreibung. Danke für die Rückmeldung.
LouisChiffre
Wie a_ifolgt das der Verteilung p_iund ist das auch weniger c? Das liegt daran, dass die Verteilung p_iauch weniger ist c? In welcher Distribution denkst du?
deps_stats
@deps_stats. Sehr gute Punkte. Pseudocode war nicht sehr klar. Die Verteilung, an die ich denke, ist die Poisson-Verteilung. Jedes Element folgt einer Poissonverteilung mit einem anderen Lambda. In diesem Sinne denke ich, dass die erste Bedingung (a_i <c) nicht notwendig ist, da ich a_i am Ende der Generation einfach neu skalieren kann, um sie zu erfüllen.
LouisChiffre
Lassen Sie mich fragen , etwas anderes ... die c, A, Bund Lambda - Ausdrücke festgelegt?
deps_stats

Antworten:

4

Wenn ich Sie richtig verstehe, erfüllen nur Punkte in einem kleinen Volumen des n-dimensionalen Raums Ihre Einschränkungen.

Ihre erste Einschränkung beschränkt sie auf das Innere einer Hypersphäre, was mich an die häufig gestellten Fragen zu " comp.graphics.algorithms " "Einheitliche zufällige Punkte auf der Kugel" und " Wie werden gleichmäßig verteilte Punkte in der 3-D-Einheitskugel erzeugt? " Erinnert . Die zweite Einschränkung schneidet ein wenig aus der Hypersphäre heraus, und die anderen Einschränkungen verschwinden weiter bei dem Volumen, das Ihren Einschränkungen entspricht.

Ich denke, das Einfachste ist einer der in den FAQ vorgeschlagenen Ansätze:

  • Wählen Sie einen beliebigen achsenausgerichteten Begrenzungsrahmen , der sicher das gesamte Volumen enthält. In diesem Fall enthält -c <a_1 <c, -c <a_2 <c, ... -c <a_n <c das gesamte eingeschränkte Volumen, da es die durch die erste Einschränkung beschriebene Hypersphäre enthält und die anderen Einschränkungen weiter schnitzen weg bei dieser Lautstärke.
  • Der Algorithmus wählt einheitlich Punkte in diesem Begrenzungsrahmen aus. In diesem Fall setzt der Algorithmus unabhängig jede Koordinate eines Kandidatenvektors auf eine unabhängige gleichmäßig verteilte Zufallszahl von -c bis + c. (Ich gehe davon aus, dass Sie Punkte mit gleicher Dichte in diesem Volumen verteilen möchten. Ich nehme an, Sie könnten den Algorithmus veranlassen, einige oder alle Koordinaten mit einer Poisson-Verteilung oder einer anderen ungleichmäßigen Verteilung auszuwählen, wenn Sie einen Grund dafür hätten.)
  • Wenn Sie einen Kandidatenvektor haben, überprüfen Sie jede Einschränkung. Wenn einer von ihnen fehlschlägt, gehen Sie zurück und wählen Sie einen anderen Punkt.
  • Wenn Sie einen Kandidatenvektor haben, speichern Sie ihn irgendwo für die spätere Verwendung.
  • Wenn Sie nicht genügend gespeicherte Vektoren haben, gehen Sie zurück und versuchen Sie, einen anderen zu generieren.

Mit einem ausreichend hochwertigen Zufallszahlengenerator erhalten Sie einen Satz gespeicherter Koordinaten, die Ihre Kriterien mit (erwarteter) gleichmäßiger Dichte erfüllen.

Wenn Sie eine relativ hohe Dimensionalität n haben (dh wenn Sie jeden Vektor aus einer relativ langen Liste von Koordinaten konstruieren), hat die beschriftete Kugel (geschweige denn Ihr verkleinertes Volumen) einen überraschend kleinen Teil des Gesamtvolumens von Der gesamte Begrenzungsrahmen muss daher möglicherweise viele Iterationen ausführen, von denen die meisten abgelehnte Punkte außerhalb Ihres eingeschränkten Bereichs generieren, bevor ein Punkt innerhalb Ihres eingeschränkten Bereichs gefunden wird. Da Computer heutzutage ziemlich schnell sind, wird das schnell genug sein?

David Cary
quelle
Sie schlagen also vor, den Raum effektiv abzutasten. Ich habe ein ähnliches Problem, außer dass das Auffinden eines Begrenzungsrahmens nicht statisch erfolgen kann (IE kann nicht fest codiert werden). Aus Erfahrung bricht dies zusammen, wenn Ihre Einschränkungen die Form haben. f1(x1) + f2(x2) == CIrgendwelche Vorschläge hier?
Groostav
Ja, die Stichprobenmethode funktioniert nicht, wenn Sie Gleichheitsbeschränkungen ("==") haben. Einschränkungen wie Punkte, die sich auf der Oberfläche einer Kugel oder auf der Oberfläche eines Zylinders usw. befinden (Radius == R) und nicht innerhalb der Kugel (Radius <= R). Die einheitliche Auswahl von Punkten über das gesamte Volumen trifft "nie" (Wahrscheinlichkeit nahe 0) auf die gewünschte Oberfläche. Sie müssen also irgendwie nur Punkte auswählen, die sich auf dieser Oberfläche befinden - dh um Punkte [x1, x2, x3] so zu finden, dass f1 (x1) + f2 (x2) == C, können Sie x1 zufällig auswählen und dann erzwingen x2 = invers_f2 (C - f1 (x1)).
David Cary
Für den Sonderfall gleichmäßig verteilter Punkte auf der Oberfläche einer Kugel siehe "Gleichmäßige zufällige Punkte auf der Kugel" .
David Cary
@Groostav: Vielleicht unterscheidet sich Ihre Frage genug von der ursprünglichen Frage, dass Sie sie als neue Frage der obersten Ebene veröffentlichen könnten? "Mir wurde gerade gesagt, dass ich eine Folgefrage stellen muss, warum und wie?"
David Cary