我正在尝试计算具有以下等式的矩阵。
S = (D^−1/2) * W * (D^−1/2)
其中 D 是这种形式的对角矩阵:
array([[ 0.59484625, 0. , 0. , 0. ],
[ 0. , 0.58563893, 0. , 0. ],
[ 0. , 0. , 0.58280472, 0. ],
[ 0. , 0. , 0. , 0.58216725]])
和W:
array([[ 0. , 0.92311635, 0.94700586, 0.95599748],
[ 0.92311635, 0. , 0.997553 , 0.99501248],
[ 0.94700586, 0.997553 , 0. , 0.9995501 ],
[ 0.95599748, 0.99501248, 0.9995501 , 0. ]])
我尝试使用 numpy
函数 linalg.matrix_power(D,-1/2)
计算 D^-1/2
和numpy.power(D,-1/2)
和 matrix_power
函数引发 TypeError: exponent must be an integer
和 numpy.power
函数引发 RuntimeWarning: divide by zero encountered in power
。
如何计算对角矩阵的负幂 -1/2。请帮忙。
最佳答案
如果您可以更新 D
(就像在您自己的答案中一样),那么只需更新其对角线索引处的项目,然后调用 np.dot
:
>>> D[np.diag_indices(4)] = 1/ (D.diagonal()**0.5)
>>> np.dot(D, W).dot(D)
array([[ 0. , 0.32158153, 0.32830723, 0.33106193],
[ 0.32158153, 0. , 0.34047794, 0.33923936],
[ 0.32830723, 0.34047794, 0. , 0.33913717],
[ 0.33106193, 0.33923936, 0.33913717, 0. ]])
或者创建一个新的 zeros 数组,然后用 1/(D.diagonal()**0.5)
填充它的对角线元素:
>>> arr = np.zeros(D.shape)
>>> np.fill_diagonal(arr, 1/ (D.diagonal()**0.5))
>>> np.dot(arr, W).dot(arr)
array([[ 0. , 0.32158153, 0.32830723, 0.33106193],
[ 0.32158153, 0. , 0.34047794, 0.33923936],
[ 0.32830723, 0.34047794, 0. , 0.33913717],
[ 0.33106193, 0.33923936, 0.33913717, 0. ]])
关于python - 将对角矩阵提高到负幂 1/2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28824225/