【问题标题】:Generating multidimensional data生成多维数据
【发布时间】:2023-03-10 01:26:01
【问题描述】:

R 是否有用于在多维空间中生成随机数的包?例如,假设我想在长方体或球体内生成 1000 个点。

【问题讨论】:

    标签: r multidimensional-array shapes


    【解决方案1】:

    我有一些用于超立方体和 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 维度的立方体/超立方体中,其中一侧的长度为centerl

    对于具有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
    }
    

    在二维中,这些给出:

    来自代码:

     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)
    

    【讨论】:

    • @Pradeep -- 如果这更好地回答了你的问题,你应该考虑接受这个答案,而不是你接受的那个。
    • GenerateSpherePoints() 似乎不会产生超过二维的均匀球面数据。一方面,边际分布不均等。可以在github.com/ahfoss/n-sphere-simulation 找到模拟均匀球面数据和一些诊断的快速方法
    【解决方案2】:

    还可以查看 copula 包。这将在具有统一边距的立方体/超立方体内生成数据,但具有您设置的相关结构。然后可以将生成的变量转换为表示其他形状,但仍然具有独立以外的关系。

    如果您想要更复杂的形状,但对形状内的统一和独立感到满意,那么您可以进行拒绝抽样:在包含您的形状的立方体内生成数据,然后测试这些点是否在您的形状内,如果是则拒绝它们不,然后继续这样做,直到有足够的积分。

    【讨论】:

    • 我看不出如何使用 copula 在受特定限制的 n 维空间中生成随机点。例如,椭球copula根本没有均匀分布,它基于多元正态(或t)分布。使用这个 -great- 包时应该非常小心,并且知道出来的结果正是人们认为的那样。我不会将它用于此目的。拒绝抽样是完全不同的事情,这是一个完美的解决方案。
    【解决方案3】:

    几年前,我制作了一个名为 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/。它包含图片和可下载的数据集。

    希望它能满足您的需求!

    【讨论】:

    • 非常感谢你一定会去看看:)
    • 你的那个包裹看起来很有前途,谢谢你的指点。
    【解决方案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】:

    这是一种方法。 假设我们希望生成一堆 y = (y_1, y_2, y_3) 形式的 3d 点

    1. 平均零和协方差矩阵 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 包中找到生成多元高斯样本的函数。

    2. 获取每个协变量 (phi(x_1) , phi(x_2), phi(x_3)) 的高斯 cdf。在这种情况下,phi 是我们变量的高斯 cdf。即 phi(x_1) = Pr[x

    3. 然后,取每个均匀分布的边缘的逆 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您正在尝试从中采样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-31
      • 2016-07-28
      • 2014-10-28
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多