如何计算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'。
我想执行 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'。