【问题标题】:Moving the function to the right does not work将功能向右移动不起作用
【发布时间】:2022-01-19 15:26:13
【问题描述】:

我做了高斯混合模型,效果很好,但是函数没有向右移动。在图中,它显示好像该函数没有移动任何东西。我为 mu 合并了一个 for 循环:

for(i in 1:n){
  for (j in 1:5){
    mu1 = c(1+j,2)
    mu2 = c(6+j,7) 
    .
    .
    .
     }
     }

但它不起作用。我尝试获取图像中出现的图形:它在保存之前的东西的同时移动,覆盖越来越多的空间

library(MASS)


n = 1000
Sigma = matrix(c(1, 0.5, 0.5, 1), 2, 2)
rho = 0.5

# Gaussian mixture model
# X=(X1,X2) ~ rho * N(mu1, Sigma) + (1-rho) * N(mu2, Sigma)
X = cbind(rep(0, n), rep(0, n))
for(i in 1:n){
  for (j in 1:5){
    mu1 = c(1+j,2)
    mu2 = c(6+j,7)
    u = runif(1, min = 0, max = 1)
    if(u < rho){
      X[i,] = mvrnorm(1, mu = mu1, Sigma = Sigma)
    }else{
      X[i,] = mvrnorm(1, mu = mu2, Sigma = Sigma)
    }
  }
}

plot(X[,1], X[,2], xlab = 'X1', ylab = 'X2')

【问题讨论】:

  • 似乎在您的内部循环中,X[i, ] 行在每次迭代时都会被覆盖。 j 循环的意义何在?
  • 我也看不懂"我尝试获取图像中出现的图形:它在保存之前的东西的同时移动,覆盖越来越多的空间"。你的意思是你想要一个动画情节?还是一系列情节?还是显示随时间进展的单个图?
  • 当我迭代mu 时,我尝试将 5 次迭代中的每一次保存在 X [i,]` 中。 mu右移时保存分布的数据
  • @GregorThomas,显示随时间变化的单个图
  • i 为 1 时,j 在不同的迭代中具有值 1,2,3,4,5。但是对于所有 5 个 j 值,只有一个 i 值,所以 X[i,] 只会有来自 j = 5---X[i,] 的结果每次都会被覆盖。

标签: r plot


【解决方案1】:

我已调整您的代码以保存所有 5000 行:

n = 1000  
m = 5
Sigma = matrix(c(1, 0.5, 0.5, 1), 2, 2)
rho = 0.5

library(MASS)
# Gaussian mixture model
# X=(X1,X2) ~ rho * N(mu1, Sigma) + (1-rho) * N(mu2, Sigma)
X = cbind(rep(0, n * m), rep(0, n * m))
for(i in 1:n){
  for (j in 1:m){
    mu1 = c(1+j,2)
    mu2 = c(6+j,7)
    u = runif(1, min = 0, max = 1)
    if(u < rho){
      X[(i - 1) * m + j,] = mvrnorm(1, mu = mu1, Sigma = Sigma)
    }else{
      X[(i - 1) * m + j,] = mvrnorm(1, mu = mu2, Sigma = Sigma)
    }
  }
}

plot(X[,1], X[,2], xlab = 'X1', ylab = 'X2')

【讨论】:

  • 谢谢@GregorThomar。我真的不明白这部分是如何工作的X[(i - 1) * m + j,]。你能给我解释一下吗?我试图理解它,但我无法理解它
  • 我们做一个小例子:想象一个嵌套循环集n &lt;- 3; m &lt;- 4和循环for(i in 1:n) { for(j in 1:m) { print(...) }}。谜题是在... 中放入一些东西,它会打印出 1、2、3、4、5、6、7、...、12。这就是该谜题的解决方案。我们需要这个序列,以便每个子迭代都有一个唯一的值,因此我们可以将它存储在X 的唯一行中。我最好的理解它的建议是进行实验。 print(i)print(j) 在每次迭代、实验中,都会有意义。
  • 另一种方法是在循环之前使用单独的counter,例如counter &lt;- 1,分配给X[counter, ] &lt;- ...,然后在分配后立即放置counter &lt;- counter + 1
  • 非常感谢您的帮助
猜你喜欢
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 2015-01-02
相关资源
最近更新 更多