Я думаю, это должно сработать. Его можно легко превратить в функцию.
d = 5 # number of dimensions
n_draws = 100 # number of draws
sigma = 0.2 # standard deviation
Я начинаю с выборки случайных векторов, которые должны быть равномерно распределены на единичной сфере. Я делаю это, нормализуя отрисовки из d-мерного многомерного нормального распределения. (Возможно, есть более прямой способ сделать этот шаг, но я буду использовать rmvnorm
позже, так что это было удобно.) Я называю их dirs
, потому что, поскольку мы нормализуем, все, что мы действительно делаем на этом шаге, — это выборка. "направления".
library(mvtnorm)
# sample
dirs = rmvnorm(n = n_draws, mean = rep(0, d))
# normalize
dirs = dirs / sqrt(rowSums(dirs^2))
Теперь мы делаем еще один рисунок из многомерной нормали, чтобы добавить шум.
x = dirs + rmvnorm(n = n_draws, mean = rep(0, d), sigma = sigma * diag(d))
Чтобы сопоставить это с переменными, которые вы использовали в своем вопросе, определите Y = X + эпсилон. Мой dirs
— это Y, тогда я добавляю шум — эпсилон; добавление их дает X, который вы просили.
person
Gregor Thomas
schedule
27.07.2015