生成随机转移概率矩阵python

时间:2017-11-16 12:56:39

标签: python matrix

我想知道在某些条件下是否有一种简单的方法可以在python中生成一个填充随机数的方阵:

  • 行必须总计为1。
  • 对角线上的值应显着高于 其他价值观。

这是一个随机矩阵,并且可以生成一个矩阵,但是棘手的部分是关于对角线的条件。 例如对于4x4矩阵,输出应该如下所示:

[[0.90, 0.03, 0.03, 0.04],
[0.01, 0.98, 0.005, 0.005],
[0.04, 0.01, 0.92, 0.03],
[0.00, 0.02, 0.03, 0.95]]

是否有很好的方法可以为可变大小生成这样的矩阵?

2 个答案:

答案 0 :(得分:1)

这是一个快速而肮脏的解决方案

import random

k = 4

result = [[random.uniform(0, 0.1 / k) for i in range(k)] for j in range(k)]
for j, r in enumerate(result):
    r[j] += 1 - sum(r)

您可能需要考虑使用不同的随机分布,还要考虑numpy。

答案 1 :(得分:0)

这是一个numpy.identity方法,以 k x k 单位矩阵开头,为其添加一个漂移项,然后进行标准化。

import numpy as np

k = 4
result = np.identity(4)

# Add a random drift term.  We can guarantee that the diagonal terms
#     will be larger by specifying a `high` parameter that is < 1.
# How much larger depends on that term.  Here, it is 0.25.
result = result + np.random.uniform(low=0., high=.25, size=(k, k))

# Lastly, divide by row-wise sum to normalize to 1.
result = result / result.sum(axis=1, keepdims=1)

# Check
print(result)
print(result.sum(axis=1))

# [[ 0.80736896  0.00663004  0.06474194  0.12125906]
#  [ 0.03545472  0.79746194  0.10495657  0.06212678]
#  [ 0.08566011  0.02632533  0.79709851  0.09091605]
#  [ 0.07298408  0.05698381  0.1585878   0.71144431]]
#
# [ 1.  1.  1.  1.]

以上浓缩为两行:

result = np.identity(k) + np.random.uniform(low=0., high=.25, size=(k, k))
result /= result.sum(axis=1, keepdims=1)

指定较大的high参数会使“对角线与其余对角线”的比例变小:

result = np.identity(k) + np.random.uniform(low=0., high=.60, size=(k, k))
result /= result.sum(axis=1, keepdims=1)
print(result.round(2))
# [[ 0.53  0.02  0.25  0.2 ]
#  [ 0.05  0.58  0.19  0.18]
#  [ 0.02  0.04  0.72  0.22]
#  [ 0.07  0.23  0.08  0.62]]