【问题标题】:Gaussian random function高斯随机函数
【发布时间】:2014-04-14 17:34:13
【问题描述】:

通过使用normrnd,我想创建一个正态分布函数,其均值和 sigma 值表示为大小为 1x45 的向量,从 1:45 变化,并用理想值绘制这个模拟 PDF。

每当我创建如下所示的normrnd 时,

Gaussian = normrnd([1 45],[1 45],[1 500],length(c_t));

我收到以下错误,

Size information is inconsistent.

创建此 PDF 的原因是计算具有可变高斯噪声模型的示踪剂的化学动力学。基本上我有一个示踪剂的理想特性,现在我想添加高斯噪声并了解示踪剂的化学动力学如何随着噪声的变化而变化。

理解示踪剂的化学动力学基本上有不同的计算模型,其中一种是三室模型,其他是形状分析模型、约束形状分析模型。

我目前对所有各自的模型都有理想的曲线,现在我想为这些模型添加噪声并了解每个特定模型在不同噪声下的行为

这就是为什么我想使用normrnd 创建一个可变噪声模型的原因,将此模型添加到理想特征并计算噪声(Sigma)与误差 - 该分析将给我一个近似估计不同模型在不同噪声和哪种模型适合于估算示踪剂的化学动力学。

function [c_t,c_t_noise] =Noise_ConstrainedK2(t,a1,a2,a3,b1,b2,b3,td,tmax,k1,k2,k3)

    K_1   = (k1*k2)/(k2+k3);
    K_2   = (k1*k3)/(k2+k3);
    %DV_free= k1/(k2+k3);

    c_t = zeros(size(t));
    ind = (t > td) & (t < tmax);
    c_t(ind)= conv(((t(ind) - td) ./ (tmax - td) * (a1 + a2 + a3)),(K_1*exp(-(k2+k3)*t(ind)+K_2)),'same');
    ind = (t >= tmax);

    c_t(ind)=conv((a1 * exp(-b1 * (t(ind) - tmax))+ a2 * exp(-b2 * (t(ind) - tmax))) + a3 * exp(-b3 * (t(ind) - tmax)),(K_1*exp(-(k2+k3)*t(ind)+K_2)),'same');

    meanAndVar = (rand(45,2)-0.5)*2;
    numPoints = 500;
    randSamples = zeros(1,numPoints);
    for ii = 1:numPoints
        idx = mod(ii,size(meanAndVar,1))+1;
        randSamples(ii) = normrnd(meanAndVar(idx,1),meanAndVar(idx,2));
        c_t_noise = c_t + randSamples(ii);
    end
    scatter(1:numPoints,randSamples)

    dg = [0 0.5 0];
    plot(t,c_t,'r');
    hold on;
    plot(t,c_t_noise,'Color',dg);
    hold off; 

    axis([0 50 0 1900]);
    xlabel('Time[mins]');
    ylabel('concentration [Mbq]');
    title('My signal');

    %plot(t,c_tnp);
end

上述函数的输出特征如下,这里我看不到任何噪音

【问题讨论】:

  • 从 1:45 变化”是什么意思? normrnd 的前两个参数是用于生成随机数的分布的均值和 sigma。另外,[1 500] 是什么?
  • @Jacob 我需要 500 个随机值,每个值都有不同的平均值和不同的 sigma,不确定我的表达是否正确
  • 在任何人都能准确回答您的问题之前,您需要更清楚地解释自己。此外,当函数本身在样本之间不断随机变化时,变化以及均值和方差会告诉您有关特定函数的 PDF 的信息
  • 您无法可视化噪声,因为与您绘制的值相比,您的噪声值非常小。 +/- 1 的噪声不会与超过 1000 的值进行比较,它是不可见的。另外请注意,不要盲目地将人们发布的内容复制并粘贴到您的代码中并期望它 100% 满足您的需求,特别是当问题从一开始就没有明确说明时,您可能需要调整我写的内容和使其适合您的特定需求。
  • 我认为你应该考虑一下你的噪声模型。首先,为什么要增加噪声的平均值?这只会移动信号的平均值。其次,您想要一个噪声随时间增加的模型吗?或者您只是想看看信号在不同类型噪声下的表现如何?

标签: matlab noise-generator


【解决方案1】:

唯一与您想要做的事情很接近的事情可以按如下方式完成,但将涉及循环,因为您不能仅从 45 个不同的均值和方差中请求 500 个数据点,而不假设可以重新访问多个集合.

这是我对你想要什么的解释,虽然我仍然不完全确定。

随机高斯函数选择

meanAndVar = rand(45,2);
numPoints = 500;
randSamples = zeros(1,numPoints);
for ii = 1:numPoints
    randMeanVarIdx = randi([1,size(meanAndVar,1)]);
    randSamples(ii) = normrnd(meanAndVar(randMeanVarIdx,1),meanAndVar(randMeanVarIdx,2));
end
scatter(1:numPoints,randSamples)

上面的代码生成一个随机的均值和方差的二维矩阵(1st col = mean, 2nd col = variance)。然后我们预先分配一些空间。

在循环中,我们选择了一组随机的均值和方差(统一)使用,然后取该均值和方差,将其插入一个随机高斯值函数,并存储它。

矩阵randSamples 将包含一个随机值列表,这些随机值由以随机统一方式选择的一组随机高斯函数生成。

顺序函数选择

如果您不想随机选择要使用的函数,而只想按顺序进行,则可以使用模数循环获取要使用的值集的索引。

meanAndVar = (rand(45,2)-0.5)*2; % zero shift and make bounds [-1,1]
numPoints = 500;
randSamples = zeros(1,numPoints);
for ii = 1:numPoints
    idx = mod(ii,size(meanAndVar,1))+1;
    randSamples(ii) = normrnd(meanAndVar(idx,1),meanAndVar(idx,2));
end
scatter(1:numPoints,randSamples)

【讨论】:

  • 我已经更清楚地解释了我的问题,如果您需要有关我如何建模不同动力学模型的更详细信息,请告诉我
  • 我更关心你希望函数返回什么或者你希望它如何表现。
  • 我希望我的函数显示理想特征 c_t 和带有噪声填充的 c_t_noise 的图(噪声 VS 误差),我的函数必须计算 c_t 和 c_t_noise 之间的误差并绘制 c_t 的图,c_t_noise 此图以浓度与时间的关系表示,另一个图基本上给出(噪声 VS 误差)——噪声以不同的 Sigma 和平均值表示,误差在 c_t 和 c_t_noise 之间,我创建了一个模型函数(理想的)以上请验证
  • 如何在绘制生成的噪声时增加噪声量,我只能看到一小部分值,我想用高噪声信号可视化我的数据
  • 将一个常数产生的随机数相乘,简单的乘法不会影响它是高斯的。
【解决方案2】:

这句话的问题

Gaussian = normrnd([1 45],[1 45],[1 500],length(c_t));

是您提供两个 mu 值和两个 sigma 值,并要求一个大小为 [1 500] x 长度(c_t)的矩阵。你需要以统一的方式传递大小,所以要么

Gaussian = normrnd(mu, sigma,[500 length(c_t)]);

Gaussian = normrnd(mu, sigma, 500, length(c_t));

然后您应该确保 mu/sigma 向量的大小与您要求的矩阵的大小相匹配。所以如果你想要一个 500 x length(c_t) 矩阵作为输出,你需要传递 500 x length(c_t) (mu,sigma) 对。如果您只想改变 mu 或 sigma 之一,您可以为另一个参数传递单个值

要从具有固定均值和稳定增加 sigma 的正态分布中获取 N 个值,您可以这样做

noise = @(mu, s0, s1, n) normrnd(mu, s0:(s1-s0)/(n-1):s1, 1,n)

其中 s0 是​​最低的 sigma 值,s1 是最大的 sigma 值。要从 mu=0 和 sigma 从 1 增加到 5 的分布中提取 10 个值,您可以这样做

noise(0,1,5,10)

如果你想在 sigma 的增加中引入一些随机性,你可以这样做

noise_rand = @(mu, s0, s1, n) normrnd(mu, (s0:(s1-s0)/(n-1):s1) .* rand(1,n), 1,n)

【讨论】:

  • 我有兴趣创建一个具有变量 Sigma 和均值的高斯噪声函数,不确定我是否通过方程适当地建模,让我知道我在哪里犯了错误
  • 这里的 s0 和 s1 是什么
  • 当我以这种方式产生噪音时,您能否让我知道我的编码到底出了什么问题:for sigma = 1 :50 noise =normrnd(2,sigma,[1,500]);结束...这个 for 循环甚至会产生噪音,我无法理解我最初的陈述中有什么问题
  • :您能否告诉我一旦我将噪声填充到我的信号 c_t 后如何估计 K3 的值,我知道函数模型是非线性的,我想估计K3 有噪声和无噪声,请告诉我如何在这种情况下执行参数估计,我在 mathworks 中提到了一些示例,但这些示例非常模糊。
猜你喜欢
  • 1970-01-01
  • 2010-09-18
  • 2014-04-15
  • 2021-07-29
  • 2014-03-09
  • 1970-01-01
  • 2012-10-08
  • 2014-06-09
  • 1970-01-01
相关资源
最近更新 更多