R是否有用于在多维空间中生成随机数的包?例如,假设我想在长方体或球体内生成1000个点。
答案 0 :(得分:16)
我有一些用于超立方体和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
长度为一边。
对于nrDim
尺寸的n球,您可以执行类似的操作,其中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)
答案 1 :(得分:5)
另请查看copula包装。这将生成具有均匀边距的立方体/超立方体内的数据,但具有您设置的相关结构。然后可以转换生成的变量以表示其他形状,但仍然使用除独立之外的关系。
如果你想要更复杂的形状但是对形状内的均匀和独立感到满意那么你可以做拒绝采样:在包含你的形状的立方体内生成数据,然后测试这些点是否在你的形状内,拒绝它们如果不,然后继续这样做,直到有足够的分数。
答案 2 :(得分:4)
几年前,我制作了一个名为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/。它包含图片和可下载的数据集。
希望它符合您的需求!
答案 3 :(得分:2)
长方体:
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
注意:已编辑以包含球体
的代码答案 4 :(得分:1)
这是一种方法。 假设我们希望生成一堆3d点,形式为y =(y_1,y_2,y_3)
具有均值为零和协方差矩阵R的多元高斯样本X。
(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包中生成多元高斯样本。
取每个协变量(phi(x_1),phi(x_2),phi(x_3))的高斯cdf。在这种情况下,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]上。
然后,取每个均匀分布的边际的逆cdf。换句话说,取u_1,u_2,u_3的逆cdf:
F ^ {-1}(u_1),F ^ {-2}(u_2),F ^ {-3}(u_3)=(y_1,y_2,y_3),其中F是分布的边际cdf您正在尝试从中取样。