我想知道在某些条件下是否有一种简单的方法可以在python中生成一个填充随机数的方阵:
这是一个随机矩阵,并且可以生成一个矩阵,但是棘手的部分是关于对角线的条件。 例如对于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]]
是否有很好的方法可以为可变大小生成这样的矩阵?
答案 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]]