Генерация многомерных данных

Есть ли в R пакет для генерации случайных чисел в многомерном пространстве? Например, предположим, что я хочу сгенерировать 1000 точек внутри прямоугольного параллелепипеда или сферы.


person Pradeep    schedule 16.02.2011    source источник


Ответы (5)


Также проверьте пакет копулы. Это создаст данные внутри куба/гиперкуба с одинаковыми полями, но с установленными вами структурами корреляции. Затем сгенерированные переменные могут быть преобразованы для представления других форм, но все же с отношениями, отличными от независимых.

Если вам нужны более сложные формы, но вас устраивает единообразие и независимость внутри формы, вы можете просто выполнить выборку отклонения: сгенерировать данные в кубе, содержащем вашу форму, затем проверить, находятся ли точки в вашей форме, отклонить их, если нет, затем продолжайте делать это, пока не будет достаточно очков.

person Greg Snow    schedule 16.02.2011
comment
Я не понимаю, как можно использовать связки для создания случайных точек в n-мерном пространстве, ограниченных определенными пределами. Эллипсовидная связка, например, вообще не имеет равномерного распределения внутри, она основана на многомерном нормальном (или t) распределении. Следует быть очень осторожным при использовании этого великолепного пакета и знать, что на выходе получается именно то, что он думает. Я бы не стал использовать его для этой цели. Отклонение выборки - это совсем другое дело, это прекрасное решение. - person Joris Meys; 16.02.2011

У меня есть несколько функций для выбора гиперкуба и n-сферы, которые генерируют кадры данных с декартовыми координатами и гарантируют равномерное распределение по гиперкубу или n-сфере для произвольного количества измерений:

GenerateCubiclePoints <- function(nrPoints,nrDim,center=rep(0,nrDim),l=1){

    x <-  matrix(runif(nrPoints*nrDim,-1,1),ncol=nrDim)
    x <-  as.data.frame(
            t(apply(x*(l/2),1,'+',center))
          )
    names(x) <- make.names(seq_len(nrDim))
    x
}

находится в кубе/гиперкубе nrDim размеров с center и l длиной одной стороны.

Для n-сферы с размерами nrDim можно сделать что-то подобное, где r — радиус:

GenerateSpherePoints <- function(nrPoints,nrDim,center=rep(0,nrDim),r=1){
    #generate the polar coordinates!
    x <-  matrix(runif(nrPoints*nrDim,-pi,pi),ncol=nrDim)
    x[,nrDim] <- x[,nrDim]/2
    #recalculate them to cartesians
    sin.x <- sin(x)
    cos.x <- cos(x)
    cos.x[,nrDim] <- 1  # see the formula for n.spheres

    y <- sapply(1:nrDim, function(i){
        if(i==1){
          cos.x[,1]
        } else {
          cos.x[,i]*apply(sin.x[,1:(i-1),drop=F],1,prod)
        }
    })*sqrt(runif(nrPoints,0,r^2))

    y <-  as.data.frame(
            t(apply(y,1,'+',center))
          )

    names(y) <- make.names(seq_len(nrDim))
    y
}

в 2 измерениях они дают:

введите здесь описание изображения

Из кода:

 T1 <- GenerateCubiclePoints(10000,2,c(4,3),5)
 T2 <- GenerateSpherePoints(10000,2,c(-5,3),2)
 op <- par(mfrow=c(1,2))
 plot(T1)
 plot(T2)
 par(op)
person Joris Meys    schedule 16.02.2011
comment
@Pradeep - Если это лучше отвечает на ваш вопрос, вам следует подумать о том, чтобы принять этот ответ, а не тот, который вы сделали. - person Prasad Chalasani; 14.06.2011
comment
GenerateSpherePoints() не создает однородных сферических данных для более чем двух измерений. Во-первых, предельные распределения не равны. Быстрый способ моделирования однородных сферических данных и некоторую диагностику можно найти по адресу github.com/ahfoss/n. -сфера-моделирование - person ahfoss; 21.07.2014

Пару лет назад я сделал пакет под названием geozoo. Он доступен на CRAN.

install.packages("geozoo")
library(geozoo)

Он имеет множество различных функций для создания объектов в N-мерном пространстве.

p = 4
n = 1000

# Cube with points on it's face.  
# A 3D version would be a box with solid walls and a hollow interior.
cube.face(p)

# Hollow sphere
sphere.hollow(p, n)


# Solid cube
cube.solid.random(p, n)
cube.solid.grid(p, 10) # evenly spaced points

# Solid Sphere
sphere.solid.random(p, n)
sphere.solid.grid(p, 10) # evenly spaced points

Один из моих любимых анимационных объектов — это куб с точками по краям, потому что это был один из первых объектов, которые я сделал. Это также дает вам ощущение расстояния между вершинами.

# Cube with points along it's edges.  
cube.dotline(4)

Также посетите веб-сайт: http://streaming.stat.iastate.edu/~dicook/geometric-data/. Он содержит изображения и загружаемые наборы данных.

Надеюсь, он удовлетворит ваши потребности!

person Barret    schedule 16.02.2011
comment
Спасибо большое обязательно посмотрю :) - person Pradeep; 17.02.2011
comment
этот ваш пакет выглядит многообещающе, спасибо, что указали на него. - person daroczig; 19.02.2011

Кубовидный:

df <- data.frame(
    x = runif(1000),
    y = runif(1000),
    z = runif(1000)
)

head(df)

          x           y         z
1 0.7522104 0.579833314 0.7878651
2 0.2846864 0.520284731 0.8435828
3 0.2240340 0.001686003 0.2143208
4 0.4933712 0.250840233 0.4618258
5 0.6749785 0.298335804 0.4494820
6 0.7089414 0.141114804 0.3772317

Сфера:

df <- data.frame(
    radius = runif(1000),
    inclination = 2*pi*runif(1000),
    azimuth = 2*pi*runif(1000)
)


head(df)

     radius inclination  azimuth
1 0.1233281    5.363530 1.747377
2 0.1872865    5.309806 4.933985
3 0.2371039    5.029894 6.160549
4 0.2438854    2.962975 2.862862
5 0.5300013    3.340892 1.647043
6 0.6972793    4.777056 2.381325

Примечание: отредактировано, чтобы включить код для сферы

person Andrie    schedule 16.02.2011
comment
Я хочу генерировать точки в пределах заданной формы.. скажем, кубоид, куб, сфера ??.... есть ли способ генерировать такие наборы данных?? - person Pradeep; 16.02.2011

Вот один из способов сделать это. Скажем, мы надеемся сгенерировать набор трехмерных точек вида y = (y_1, y_2, y_3)

  1. Выборка X из многомерного гауссова с нулевым средним и ковариационной матрицей R.

       (x_1, x_2, x_3) ~ Multivariate_Gaussian(u = [0,0,0], R = [[r_11, r_12, r_13],r_21, r_22, r_23], [r_31, r_32, r_33]]
    

    Вы можете найти функцию, которая генерирует многомерные выборки Гаусса в пакете R.

  2. Возьмите гауссовский cdf каждой ковариаты (phi(x_1), phi(x_2), phi(x_3)). В этом случае phi — это гауссовский cdf наших переменных. То есть phi(x_1) = Pr[x ‹= x_1] По интегральному преобразованию вероятности эти (phi(x_1), phi(x_2), phi(x_3)) = (u_1, u_2, u_3) будут равномерно распределены на [0,1].

  3. Затем возьмите обратную cdf каждого равномерно распределенного маргинала. Другими словами, возьмите обратный cdf u_1, u_2, u_3:

    F^{-1}(u_1), F^{-2}(u_2), F^{-3}(u_3) = (y_1, y_2, y_3), где F — предельная cdf дистрибутива, который вы пытаетесь для выборки из.

person michael_fortunato    schedule 16.08.2019