在 R 中生成随机向量 (X,Y,Z) 样本的函数
Function that produces a sample of random vectors (X,Y,Z) in R
我们有一个半径为 1、中心为 1,1 的球体。
地球仪表面有随机分布的斑点。
我们正在生成独立的 Unif(-1,1) 随机变量 X、Y、Z,它们将是随机点的坐标。
将 (X,Y,Z) 除以 √{X2 +Y2 +Z2} 得到距地球中心 1m 的点。
**
编写一个函数 sample3d,它生成一个随机向量样本 (X, Y, Z),每个样本都是地球表面均匀分布的一个点。通过命令 sample3d(n) 调用此函数应生成一个 n × 3 数组,其中每一行都是一个向量 (X, Y, Z)。
我已经完成了 ** 但无法创建 sample3d,任何帮助将不胜感激!
我很高兴尝试想出一些有用的东西,这是我得到的:
首先,我定义了一个函数norm.2
,它计算一个向量的两个范数:
norm.2 <- function(x, na.rm){
if(length(dim(x)) != 0){
v1.logical <- ifelse(missing(na.rm), FALSE, TRUE)
return(sqrt(colSums(x^2, na.rm = v1.logical)))
}
if(length(dim(x)) == 0){
v1.logical <- ifelse(missing(na.rm), FALSE, TRUE)
return(sqrt(sum(x^2, na.rm = v1.logical)))
}
}
然后,我继续定义一个函数 sample3d
,它将在 3 维 space 中给出 n 个点,所有这些点都具有范数 1,即在 2 维球面上:
sample3d <- function(n, Boundary){
M <- ifelse(missing(Boundary), sqrt(2e+300), Boundary)
x1 <- runif(n, min = -M, max = M)
x2 <- runif(n, min = -M, max = M)
x3 <- runif(n, min = -M, max = M)
x <- t(cbind(x1,x2,x3))
p <- t(t(x)/norm.2(x))
df <- data.frame(t(p), stringsAsFactors = FALSE)
return(df)
}
这是结果的示例:
> head(sample3d(10000))
x1 x2 x3
1 0.321159709 -0.5014622 -0.8033630
2 0.488181408 0.5547003 -0.6737852
3 -0.661576495 -0.4592729 0.5927773
4 -0.333447393 0.9331249 -0.1345016
5 -0.009070263 0.4267690 0.9043152
6 -0.375122328 -0.2393661 -0.8955373
现在,使用 plotly
包,我们可以从中获得一些有趣的可视化效果:
library(plotly)
dat <- sample3d(100000)
p <- plot_ly(dat, x = ~x1, y = ~x2, z = ~x3, color = norm.2(t(dat)), colors = c('#BF382A', '#0C4B8E')) %>%
add_markers() %>%
layout(scene = list(xaxis = list(title = 'X'),
yaxis = list(title = 'Y'),
zaxis = list(title = 'Z')))
我们有一个半径为 1、中心为 1,1 的球体。 地球仪表面有随机分布的斑点。 我们正在生成独立的 Unif(-1,1) 随机变量 X、Y、Z,它们将是随机点的坐标。 将 (X,Y,Z) 除以 √{X2 +Y2 +Z2} 得到距地球中心 1m 的点。 **
编写一个函数 sample3d,它生成一个随机向量样本 (X, Y, Z),每个样本都是地球表面均匀分布的一个点。通过命令 sample3d(n) 调用此函数应生成一个 n × 3 数组,其中每一行都是一个向量 (X, Y, Z)。
我已经完成了 ** 但无法创建 sample3d,任何帮助将不胜感激!
我很高兴尝试想出一些有用的东西,这是我得到的:
首先,我定义了一个函数norm.2
,它计算一个向量的两个范数:
norm.2 <- function(x, na.rm){
if(length(dim(x)) != 0){
v1.logical <- ifelse(missing(na.rm), FALSE, TRUE)
return(sqrt(colSums(x^2, na.rm = v1.logical)))
}
if(length(dim(x)) == 0){
v1.logical <- ifelse(missing(na.rm), FALSE, TRUE)
return(sqrt(sum(x^2, na.rm = v1.logical)))
}
}
然后,我继续定义一个函数 sample3d
,它将在 3 维 space 中给出 n 个点,所有这些点都具有范数 1,即在 2 维球面上:
sample3d <- function(n, Boundary){
M <- ifelse(missing(Boundary), sqrt(2e+300), Boundary)
x1 <- runif(n, min = -M, max = M)
x2 <- runif(n, min = -M, max = M)
x3 <- runif(n, min = -M, max = M)
x <- t(cbind(x1,x2,x3))
p <- t(t(x)/norm.2(x))
df <- data.frame(t(p), stringsAsFactors = FALSE)
return(df)
}
这是结果的示例:
> head(sample3d(10000))
x1 x2 x3
1 0.321159709 -0.5014622 -0.8033630
2 0.488181408 0.5547003 -0.6737852
3 -0.661576495 -0.4592729 0.5927773
4 -0.333447393 0.9331249 -0.1345016
5 -0.009070263 0.4267690 0.9043152
6 -0.375122328 -0.2393661 -0.8955373
现在,使用 plotly
包,我们可以从中获得一些有趣的可视化效果:
library(plotly)
dat <- sample3d(100000)
p <- plot_ly(dat, x = ~x1, y = ~x2, z = ~x3, color = norm.2(t(dat)), colors = c('#BF382A', '#0C4B8E')) %>%
add_markers() %>%
layout(scene = list(xaxis = list(title = 'X'),
yaxis = list(title = 'Y'),
zaxis = list(title = 'Z')))