Как сгенерировать сеть на 8-мерной сфере - PullRequest
3 голосов
/ 19 июля 2010

Используя Matlab, как создать сеть из 3 ^ 10 точек, которые равномерно расположены (или распределены) в 8-мерной единичной сфере?

Ответы [ 3 ]

3 голосов
/ 19 июля 2010

Простой способ получить очки на сфере nd-единицы - создать nd-куб, срезать углы и нормализовать оставшиеся радиусы до 1. Обратите внимание, что без разреза распределение не будет равномерным.

Однако, поскольку объем гиперсферы относительно вмещающей рамки уменьшается с ростом размерности, это не особенно эффективный способ.

Лучший способ - создать массив ndНормально распределенные точки (радиусы), а для нормализации их к радиусу сферы - 3-е нормальное распределение радиально симметрично, и, следовательно, распределение на поверхности будет равномерным

%# set-up
nPoints = 3^10;
nDim = 8;

%# create normally distributed variables
points = randn(nPoints,nDim);

%# normalize by dividing by the norm (=square root of sum(points.^2,2) )
points = bsxfun(@rdivide,points,sqrt(sum(points.^2,2)));
0 голосов
/ 20 июля 2010

из википедии n-сфера

Для генерации равномерно распределенных случайные точки на (n - 1) -сфере (то есть поверхность n-шара), Марсалья (1972) дает следующее алгоритм.

Создание n-мерного вектора нормальные отклонения (достаточно использовать N (0, 1), хотя на самом деле выбор дисперсии произвольно), \ Mathbf {х} = (x_1, x_2, \ ldots, x_n). * +1008 *

Теперь посчитайте «радиус» этого точка, г = \ SQRT {x_1 ^ 2 + x_2 ^ 2 + \ cdots + x_n ^ 2}.

Вектор \ frac {1} {r} \ mathbf {x} равномерно распределены по поверхности единицы n-ball.

Фрагмент кода Matlab, который выполняет это:

numdims = 8;
numpts = 3^10;
x = randn([numdims numpts]);
lx = repmat(sqrt(sum(x.^2,1)), [numdims 1]);
x = x./lx;
%x(:,j) is the jth point on the circle)
0 голосов
/ 19 июля 2010

ОК, в Википедии мы читаем, что

n-сфера радиуса r определяется как множество точек в (n + 1) -мерном евклидовом пространстве, котороенаходятся на расстоянии r от центральной точки, где радиус r может быть любым положительным действительным числом

, поэтому ваша задача становится одной из генерации 3 ^ 10 векторов в 7-пространстве.Не теряя ничего, мы можем позволить r = 1.Подход будет состоять в том, чтобы генерировать случайные векторы в 7-пространстве и затем нормализовать их до единичной длины обычным способом

Вот код, который я спешно выбил, я знаю, что я должен был векторизовать вещи, а не писать циклыЯ оставлю это ОП.Код не должен нуждаться в каких-либо объяснениях.

pointset = rand(3^10,7);
normset = zeros(3^10,1);
for ix = 1:3^10
  normset(ix) = norm(pointset(ix,:));
end
for ix = 1:3^10
  pointset(ix,:) = pointset(ix,:)/normset(ix);
end

Это, конечно, зависит от того, как PRNG компании Matlab создает равномерно распределенные числа для создания равномерно распределенной сети на 8-сфере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...