Создание многомерных данных
Имеет ли R пакет для генерации случайных чисел в многомерном пространстве? Например, предположим, что я хочу создать 1000 точек внутри кубоида или сферы.
Ответы
Ответ 1
Также проверьте комплект копулы. Это приведет к получению данных в кубе/гиперкубе с однородными полями, но с настройками корреляции. Сгенерированные переменные затем могут быть преобразованы для представления других фигур, но все же с отношениями, отличными от независимых.
Если вам нужны более сложные фигуры, но они довольны равномерностью и идеалом внутри формы, вы можете просто выполнить отбор проб: произвести данные в кубе, который содержит вашу фигуру, а затем проверить, находятся ли точки в вашей форме, отклонить их, если а затем продолжайте делать это, пока не будет достаточно очков.
Ответ 2
У меня есть некоторые функции для выбора гиперкуба и n-сферы, которые генерируют dataframes с декартовыми координатами и гарантируют равномерное распределение через гиперкуб или 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
с a 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 измерениях, они дают:
![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)
Ответ 3
Пару лет назад я сделал пакет под названием geozoo. Он доступен на CRAN.
install.packages("geozoo")
library(geozoo)
Он имеет множество различных функций для создания объектов в N-измерениях.
p = 4
n = 1000
# Cube with points on it 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 edges.
cube.dotline(4)
Также посетите веб-сайт: http://streaming.stat.iastate.edu/~dicook/geometric-data/. Он содержит изображения и загружаемые наборы данных.
Надеюсь, он удовлетворит ваши потребности!
Ответ 4
куб:
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
Примечание: отредактировано, чтобы включить код для сферы
Ответ 5
Вот один из способов сделать это.
Скажем, мы надеемся сгенерировать группу 3d-точек вида y = (y_1, y_2, y_3)
Образец 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.
Возьмите гауссовский cdf каждого ковариата (фи (x_1), фи (x_2), фи (x_3)). В этом случае фи является гауссовым cdf наших переменных. Т.е. phi (x_1) = Pr [x & lt; = x_1] Посредством интегрального преобразования вероятности эти (phi (x_1), phi (x_2), phi (x_3)) = (u_1, u_2, u_3) будут одинаково Нарушено на [0,1].
Затем возьмите обратный 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 распределения Вы пытаетесь взять образец из.