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

How to calculate the balancing of a matrix in python?

我想执行 matrix balancing in python. I thought to use linalg.matrix_balance in order to make the input matrix a 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)

结果也未标准化:

array([[ 1. , 2. , 7. ], [ 9. , 1. , 1. ], [ 1. , 2. , 31.41592654]])

你对输出的分析是正确的,但你对 matrix_balance 所做的事情的考虑是错误的。从文档中,

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 范数是 平衡的,在二的一个数量级内,这样精确的数量级反映到缩放矩阵 permscale.

你的目标是让你的矩阵是双随机的,而不是(只是)平衡的吗?如果是这样,您可以查看 例如 this project。按照那里介绍的指南,我为您的数据找到了以下双随机矩阵,

>>>print(sk.fit(x))

[[ 0.1385636   0.55482644  0.30660996]
 [ 0.79518122  0.17688932  0.02792947]
 [ 0.06695665  0.26810303  0.66494032]]

>>>print(sk.fit(x).sum(axis=0), sk.fit(x).sum(axis=1))

[ 1.00070147  0.99981878  0.99947975] [ 1.  1.  1.]

对于大多数用例来说应该是 'close enough'。