Biorąc pod uwagę pięć wymiarowych, chciałbym wygenerować 100 wektorów, wszystkie ze stałą wielkością = m, gdzie wartości składników są losowo rozprowadzane.

Pierwotnie myślałem o zaczynaniu z wektora jednostki, a następnie stosując matrycę rotacji, z losowymi parametrami dla 10 stopni wolności ... czy ta praca? i jak?

Każdy miły sposób na to w JavaScript ...?

Pozdrawiam dla każdego wskaźników!

1
greTech 26 wrzesień 2012, 01:21

4 odpowiedzi

Najlepsza odpowiedź

Oto algorytm Monte Carlo, którego użyłem (nie wiem, jak javascript wystarczająco dobrze, aby kasować w nim z góry mojej głowy):

  1. Generuj wartości losowe w zakresie od -1 do 1 dla każdego z pięciu wymiarów.

  2. Oblicz wielkość M, jeśli m = 0 lub M & GT; 1, a następnie odrzuć te wartości i powrócić do kroku # 1.

  3. Normalizuj wektor, aby mieć wielkość 1 (podziel każdy wymiar przez m).

To powinno dać ci losowe wektory jednostkowe równomiernie rozłożone na 5-wymiarowej powierzchni super kuli.


Zapytano pytanie: "Po co odrzucić wektor, jeśli M & GT; 1?"

Odpowiedź: Aby końcowi wektory będą równomiernie rozłożone na powierzchni urządzenia 5-sfery.

Rozumowanie: Co generujemy w pierwszym etapie, jest zestawem losowych wektorów, które są równomiernie dystrybuowane w objętości urządzenia 5-Cube. Niektóre z tych wektorów są również w obrębie objętości jednostki 5 kuli, a niektóre z nich są poza tym objętością. W przypadku znormalizowanego, wektory w 5 kuli są równomiernie rozmieszczone na jego powierzchni, jednak , te poza nim nie są w ogóle równomiernie rozpowszechniane.

Pomyśl o tym tak, jak w przypadku normalnej trójwymiarowej kostki jednostkowej i kula jednostki, a nawet kwadratowy jednostki i koła jednostki, jednostka 5-sfera jest całkowicie zawarta w urządzeniu 5-Cube, która dotyka tylko w Pięć punktów osi o wymiarach dodatnich:

(1,0,0,0,0)
(0,1,0,0,0)
(0,0,1,0,0)
(0,0,0,1,0)
(0,0,0,0,1)

I ich odpowiednie punkty osi jednostek. Dzieje się tak dlatego, że są to jedyne punkty na powierzchni sześcianu, które mają wielkość (odległość z pochodzenia) z 1, we wszystkich innych punktach, powierzchnia 5-Cube ma odległość od pochodzenia, który jest większa niż 1.

Oznacza to, że istnieje wiele punktów między (0,0,0,0) i (1,1,1,1,1) niż między (0,0,0,0,0) i ( 1,0,0,0,0). W rzeczywistości o SQRT (5) lub Aprx. 2,25 razy więcej.

Oznacza to, że jeśli włączyłeś Wszystkie Wektory w urządzeniu 5-Cube, skończyłbyś więcej niż dwa razy więcej wyników "losowo" mapowanie do około (0,44,0.44,0.44,0.44 , 0,44) niż (1,0,0,0,0).


Dla tych, którzy są Ŝe / N-sfer # alternatywy "Rel =" Nofollow "> http://pl.wikipedia.org/wiki/n-phere#alterndes

5
RBarryYoung 3 listopad 2020, 18:50

Oto kilka podejść, to jest wektory jednostkowe, ale można po prostu pomnożyć przez M:

http://burtleburtle.net/bob/rand/unitvec.html.

1
Bitwise 25 wrzesień 2012, 21:41

Problem z pobieraniem próbek z hypercube jednostki w 5-dimensionach, a następnie ponowne skalowanie, jest punktami w niektórych kierunkach (w kierunku narożników hipercube) będzie próbkowane.

Ale jeśli używasz schematu odrzucenia, tracisz zbyt wiele próbek. Oznacza to, że objętość hypercube jednostki w 5-D oznacza PI ^ 2 * (8/15) = 5.26378901391432. Porównaj to do objętości jednostki Hyper-Cube w 5 wymiarach, które będą po prostu zawierać sferę. Że Hypercube ma objętość 32. Więc jeśli odrzucesz punkty spadające na zewnątrz kuli, odrzucisz

1 - 5.26378901391432/32 = 0.835506593315178

Lub około 83,5% punktów odrzuconych. Oznacza to, że będziesz musiał spróbować około 6 punktów średnio, zanim znajdziesz próbkę, która znajduje się w 5-kuli.

Doskonale lepszy pomysł jest próbkowanie przy użyciu normalnej próbki jednostki, a następnie ponownie przeanalizuj, że wektor punktów ma normę jednostki. Ponieważ wielofunkcyjny rozkład normalny jest sferycznie symetryczny, nie ma potrzeby odrzucenia w ogóle.

2
user85109user85109 25 wrzesień 2012, 23:35

Polecam przypisanie liczb losowych między -1 a +1 dla każdego elementu. Po przypisaniu wszystkich elementów na wektor, powinieneś znormalizować wektor. Aby normalizować, po prostu podziel każdy element o wielkość ogólnego wektora. Po zrobieniu tego, masz losowy wektor z wielkością 1. Jeśli chcesz skalować wektory do wielkości m, wystarczy pomnożyć każdy element przez M.

0
zigzag 25 wrzesień 2012, 21:26