我是统计的新手。我正在完成进化算法的论文。我必须从T-distribution或Laplace distribution生成一些随机数。我怎样才能做到这一点?
一个简单的解释将不胜感激。
我是统计的新手。我正在完成进化算法的论文。我必须从T-distribution或Laplace distribution生成一些随机数。我怎样才能做到这一点?
一个简单的解释将不胜感激。
以下是使用该统计工具箱中的TINV在 Matlab 中执行此操作的方法:
%# choose the degree of freedom
df = 4; %# note you can also choose an array of df's if necessary
%# create a vector of 100,000 uniformly distributed random varibles
uni = rand(100000,1);
%# look up the corresponding t-values
out = tinv(uni,df);
使用更新版本的 Matlab,您还可以简单地使用TRND直接创建随机数。
out = trnd(100000,df);
这是直方图out
编辑回复:合并问题
Matlab 没有用于从拉普拉斯分布中绘制数字的内置函数。但是,有来自 Matlab 文件交换的函数LAPRND ,它提供了一个编写良好的实现。
简单的答案:使用 R 并获取n
变量-自由度df
分布为rt(n, df)
。如果您不使用 R,也许您可以编写您使用的语言,而其他人可能能够准确地告诉您要做什么。
如果您不使用 R 或其他带有内置随机数生成器的语言-分布,但您可以使用分位数功能,, 为了-分布,你可以生成一个统一的随机变量上然后遵循一个-分配。
否则,请查看Wikipedia 页面中的这个简短部分。
通过查看 Wikipedia 文章,我编写了一个函数来从拉普拉斯分布生成随机变量。这里是:
function x = laplacernd(mu,b,sz)
%LAPLACERND Generate Laplacian random variables
%
% x = LAPLACERND(mu,b,sz) generates random variables from a Laplace
% distribution having parameters mu and b. sz stands for the size of the
% returned random variables. See [1] for Laplace distribution.
%
% [1] http://en.wikipedia.org/wiki/Laplace_distribution
%
% by Ismail Ari, 2011
if nargin < 1 % Equal to exponential distribution scaled by 1/2
mu = 0;
end
if nargin < 2
b = 1;
end
if nargin < 3
sz = 1;
end
u = rand(sz) - 0.5;
x = mu - b*sign(u) .* log(1-2*abs(u));
这是一个使用它的代码片段
clc, clear
mu = 30;
b = 2;
sz = [50000 1];
x = laplacernd(mu,b,sz);
hist(x,100)
我在 Matlab 中找到的最好的(运行速度最快,而不是编码速度最快的;)免费解决方案是用 mex 函数包装 R 的 MATHLIB_STANDALONE c 库。这使您可以访问 R 的 t 分布 PRNG。这种方法的一个优点是您也可以使用相同的技巧从非中心 t 分布中获取变量。
第二个最好的免费解决方案是使用 octave 的trnd实现。事实证明,从 octave 移植比为我包装 c 代码更费力。
就我的口味而言,使用统一生成通孔rand
和反转通孔tinv
太慢了。YMMV。