【问题标题】:Sampling in Matlab with discrete pareto distribution在 Matlab 中使用离散帕累托分布进行采样
【发布时间】:2016-04-22 12:21:06
【问题描述】:

我想在 matlab 中生成具有离散帕累托分布的 10000 数字。

我用 R 写了这段代码,但我想用 Matlab 写。

离散帕累托的 R 码:

N<-5 ##for instance,you need N large enough
i0<-(1:N)
p<-1/(i0^1.98); p<-p/sum(p)
X<-sample(i0,N,replace=TRUE,prob=p)
X

alpha=1.98 并且您在此链接中看到离散的 pPareto 分布 q=0, https://en.wikipedia.org/wiki/Zipf%E2%80%93Mandelbrot_law

我的问题是:如何在 Matlab 中编写这段代码?

我在matlab中使用randsample,并在matlab中翻译了这段代码。

例如:

N=5;
for i0=1:N
    p=1/(i0.^1.98);
    P=p/sum(p);`
    X=randsample(i0,N,true,P);
    X
end

但它有一个错误。

谁能给个建议?

【问题讨论】:

  • 你能把错误包括进来吗?

标签: matlab static discrete-mathematics random-sample


【解决方案1】:

以下是一些建议:

  1. 您的代码中有错误: P=p/总和(p);` 应该 P=p/sum(p);

(这可能是一个格式化的东西,只是需要编辑,但不清楚你的错误是什么:所以从这里开始)

  1. 您可能需要 Statistics and Machine Learning Toolbox 才能使用 randsample,这需要额外的许可证。

  2. 如果这些都不能解决问题,请尝试输入 帮助 randsample 在 MATLAB 终端上并验证您的设置。

这看起来是您感兴趣的部分(来自帮助):

Y = randsample(N,K,true,W) 或 randsample(POPULATION,K,true,W) 返回一个 加权样本,使用正权重 W,带放回。 W是 通常是概率向量。此功能不支持加权 无需更换即可采样。

  1. 我认为您的代码可能存在误解。看起来您认为 P 应该是一个分布,但这意味着 p 将是一个数组或向量。但是,从您的代码中

p=1/(i0.^1.98);

只是将评估为一个标量值(即p,对于 i0=1,评估为 1^(-1.98),因此 P 将等于 1。

也许您正在寻找类似的东西?

N=5;
i0=1:N;
p=1./(i0.^1.98);
P=p/sum(p);
X=randsample(i0,N,true,P)  

(我省略了最后一个;,以便您可以将结果显示到终端)

【讨论】:

  • 谢谢用户2254698。我忘了在 p=1./(i0.^1.98); 中使用“.”我认为我不应该在这里使用“for”!
  • @samira - 是的,一般来说,您希望尽可能避免 MATLAB 中的“for”循环。您的代码仍然可以使用 for 循环,但通常不会针对 MATLAB 的运行时进行优化。你对我给出的答案满意吗?如果可以,你能接受吗?
  • 通常需要“for”的循环应该在 Matlab 中应用,但我不知道为什么我输入“for”它给了我错误,我必须删除它
  • @samira - 'for' 循环是允许的,并且肯定会在 MATLAB 中工作,但一般来说,如果你能够对其进行矢量化,你的代码将更有效地运行(在 MATLAB 中)。向量化是我开始使用 MATLAB 时必须克服的早期障碍之一,如果您想了解更多信息,请点击此处的链接 如果您是 MATLAB 新手,您可能需要查看有关向量化的链接mathworks.com/help/matlab/matlab_prog/vectorization.html
  • @samira - 太棒了;祝您其余的离散帕累托分布和相关工作好运。我希望过渡顺利进行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
相关资源
最近更新 更多