创建一个任意大小的矩阵,其中行总和为1?

Ral*_* L. 7 python random matrix markov

我的任务是为任意数量的事件创建一个模拟离散时间马尔可夫链的程序.然而,现在我正在努力的部分是创建代表概率的正确的随机矩阵.右边的随机矩阵是一个矩阵,其行条目总和为1.对于给定的大小,我知道如何编写执行该操作的矩阵,但问题是我不知道如何做到这一点任意大小.

例如:这是我的3x3矩阵代码,以及我得到的输出示例.

http://pastebin.com/4GXpAYTM

但是,我的代码每次都不起作用 - 有时候行中的第三个条目是负数,因为前两个条目太大了.我不知道怎么解决这个问题,据我所知,Python中没有一个函数可以让你生成随机数,特别是某些东西.

任何帮助表示赞赏.

(请注意,这不是一个家庭作业问题,它仅用于我的数学课程中的额外学分,教授不介意使用外部资源.)

Sai*_*ait 11

使用@ MBo的想法:

In [16]: matrix = np.random.rand(3,3)

In [17]: matrix/matrix.sum(axis=1)[:,None]
Out[17]:
array([[ 0.25429337,  0.22502947,  0.52067716],
       [ 0.17744651,  0.42358254,  0.39897096],
       [ 0.36179247,  0.28707039,  0.35113714]])

In [18]:
Run Code Online (Sandbox Code Playgroud)


Mih*_*giu 5

这是一些代码:

import random

precision = 1000000

def f(n) :
    matrix = []
    for l in range(n) :
        lineLst = []
        sum = 0
        crtPrec = precision
        for i in range(n-1) :
            val = random.randrange(crtPrec)
            sum += val
            lineLst.append(float(val)/precision)
            crtPrec -= val
        lineLst.append(float(precision - sum)/precision)
        matrix.append(lineLst)
    return matrix


matrix = f(5)
print matrix
Run Code Online (Sandbox Code Playgroud)

我假设随机数必须是正数,原始数字的总和必须是 1。我在变量“精度”中使用了精度,如果这是 1000,则意味着随机数在逗号后将有 3 位数字。在示例中使用了 6 位数字,您可以使用更多数字。

输出:

[[0.086015, 0.596464, 0.161664, 0.03386, 0.121997], 
[0.540478, 0.040961, 0.374275, 0.003793, 0.040493], 
[0.046263, 0.249761, 0.460089, 0.006739, 0.237148], 
[0.594743, 0.125554, 0.142809, 0.056124, 0.08077], 
[0.746161, 0.151382, 0.068062, 0.005772, 0.028623]]
Run Code Online (Sandbox Code Playgroud)


MBo*_*MBo 4

生成具有随机值的 NxN 矩阵。
对于每一行:
求 S 行的总和

S[j] = Sum(0..N-1){A[j, i]}

然后从该行中的每个值中减去 (S-1)/N

A[j, i] = A[j, i] - (S[j] - 1) / N

如果您只需要非负值,请生成非负随机数,并将行中的每个值除以该行的总和

A[j, i] = A[j, i] / S[j]