将功能向右移动不起作用
Posted
技术标签:
【中文标题】将功能向右移动不起作用【英文标题】: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,]
的结果每次都会被覆盖。
【参考方案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 <- 3; m <- 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 <- 1
,分配给X[counter, ] <- ...
,然后在分配后立即放置counter <- counter + 1
。
非常感谢您的帮助以上是关于将功能向右移动不起作用的主要内容,如果未能解决你的问题,请参考以下文章