Генерация многомерных данных - PullRequest
14 голосов
/ 16 февраля 2011

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

Ответы [ 4 ]

16 голосов
/ 16 февраля 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
}

в двух измерениях, это дает:

enter image description here

Из кода:

 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)
5 голосов
/ 16 февраля 2011

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

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

4 голосов
/ 16 февраля 2011

Пару лет назад я сделал пакет под названием 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/. Он содержит изображения и загружаемые наборы данных.

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

2 голосов
/ 16 февраля 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

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

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