如何创建一个随机矩阵,使所有行总和为 1
Posted
技术标签:
【中文标题】如何创建一个随机矩阵,使所有行总和为 1【英文标题】:How to create a random matrix such that all rows sum to 1 【发布时间】:2012-02-16 14:17:36 【问题描述】:这是矩阵的样子:
有 8 列,说 100 行,任何行中的随机数总和为 1。
.125 .125 .125 .125 ....... .125
.005 .105 .005 .205 ....... .205
.002 .003 .012。 201 ....... .200
...
Matlab 能否自动创建这种矩阵,即right stochastic matrix?我正在寻找一个脚本。
【问题讨论】:
【参考方案1】:使用bsxfun
而不是repmat
:
mat = rand(100, 8);
rowsum = sum(mat,2);
mat = bsxfun(@rdivide, mat, rowsum);
【讨论】:
【参考方案2】:这是另一个想法:对于每一行,您可以生成 7 个随机数(介于 0 和 1 之间)并将它们视为您的“间隔”位置 - 换句话说,在您的 8 个随机数总和为 1 中,这些是您的部分总和。然后您可以对它们进行排序并获取差异以获得生成的随机数。这是我的想法的代码:
numrows = 100;
partialsums = [zeros(numrows,1), rand(numrows,7), ones(numrows,1)];
partialsums = sort(partialsums, 2);
randmat = diff(partialsums, 1, 2);
根据您的操作方式,数字的分布会有所不同。我将此方法与 Aabaz 发布的方法进行了比较,我得到了这个用于分发。
所以我的看起来更指数化,你得到一些更高的值,而他的更均匀一些,但你得到的随机数的截止值更低。
【讨论】:
+1 指出有不同的方式导致不同的分布。【参考方案3】:您可以先创建随机矩阵,然后对其进行归一化,以使每一行的总和等于 1(如果这是您的意思):
mat=rand(100,8);
matnorm=repmat(sum(mat,2),1,8);
mat=mat./matnorm;
【讨论】:
【参考方案4】:第 1 步:计算向量的范数,即该向量中元素的平方和的平方根。
第 2 步:将向量中的每个元素除以向量的范数。
第 3 步:将得到的向量乘以其转置来平方向量中的每个元素。
然后您可以看到向量中(最终)结果元素的总和为 1。
【讨论】:
【参考方案5】:嗯
rand(100,8)
将生成一个包含 100 行和 8 列的随机数矩阵,其所有条目都可以加到 1。如果这不符合您的要求,您将不得不再解释一下。
【讨论】:
-1 这会创建一个随机数矩阵,每个随机数分布在 0 和 1 之间。行的总和不等于 1,这是提问者所要求的。以上是关于如何创建一个随机矩阵,使所有行总和为 1的主要内容,如果未能解决你的问题,请参考以下文章