如何在python中计算矩阵的平衡?

2024-05-21 05:57:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用python执行matrix balancing。我想用^{}使输入矩阵成为doubly stochastic matrix

from scipy import linalg
import numpy as np
x = np.array([[1,2,7], [9,1,1], [1,2,10*np.pi]])

y, permscale = linalg.matrix_balance(x)    
np.abs(x).sum(axis=0) / np.abs(x).sum(axis=1)        
np.abs(y).sum(axis=0) / np.abs(y).sum(axis=1)


permscale  

array([[ 1.,  0.,  0.],
      [ 0.,  2.,  0.],
      [ 0.,  0.,  1.]])

它看起来并没有真正平衡矩阵的行和列。你知道我该怎么办吗?在

如果我这样做:y, permscale = linalg.matrix_balance(x, scale=False)

结果也不是标准化的:

^{pr2}$

Tags: fromimportnp矩阵absarraymatrixsum
1条回答
网友
1楼 · 发布于 2024-05-21 05:57:11

您对输出的分析是正确的,但在考虑^{}的作用时却错了。从文件上看

The balanced matrix satisfies the following equality,

B = inv(T) * A * T (matrix products)

我们可以很容易地用你的矩阵来验证

>>>print(np.dot(np.dot(np.linalg.inv(permscale), x), permscale))

[[  1.           4.           7.        ]
 [  4.5          1.           0.5       ]
 [  1.           4.          31.41592654]]

确实是y。这意味着matrix_balance和它声称的一样工作。你声称

It doesn't look that it actually balancing the rows and cols of the matrix. Any idea what should I do?

但这不是真的:这个修正矩阵的L1范数是平衡的,在2的一个数量级之内,这样精确的数量级被反映到标度矩阵permscale。在

你的目标是使你的矩阵加倍随机,而不是(仅仅)平衡?如果是这样,你可以看看例如this project。按照上面的指南,我发现了下面的双随机矩阵

^{pr2}$

对于大多数用例来说,它应该“足够接近”。在

相关问题 更多 >