将对角矩阵提高到负幂 1/2
Raise diagonal matrix to the negative power 1/2
我正在尝试计算具有以下等式的矩阵。
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)
和 numpy.power(D,-1/2)
和 matrix_power
函数计算 D^-1/2
计算 TypeError: exponent must be an integer
和 numpy.power
函数引发 RuntimeWarning: divide by zero encountered in power
.
如何计算对角矩阵的负幂 -1/2。请帮忙。
我通过计算数学术语得到了答案,但希望看到任何直接的衬垫:)
def compute_diagonal_to_negative_power():
for i in range(4):
for j in range(4):
if i == j:
element = D[i][j]
numerator = 1
denominator = math.sqrt(element)
D[i][j] = numerator / denominator
return D
diagonal_matrix = compute_diagonal_to_negative_power()
S = np.dot(diagonal_matrix, W).dot(diagonal_matrix)
print(S)
"""
[[ 0. 0.32158153 0.32830723 0.33106193]
[ 0.32158153 0. 0.34047794 0.33923936]
[ 0.32830723 0.34047794 0. 0.33913718]
[ 0.33106193 0.33923936 0.33913718 0. ]]
"""
来源:https://math.stackexchange.com/questions/340321/raising-a-square-matrix-to-a-negative-half-power
如果您可以更新 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. ]])
您可以执行以下操作:
numpy.power(D,-1/2, where=(D!=0))
然后您将避免收到警告:
RuntimeWarning:在 power
中遇到除以零
numpy 会将矩阵上的每个值按元素除以它自己的平方根,它不是零,所以基本上你不会再尝试除以零了。
我正在尝试计算具有以下等式的矩阵。
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)
和 numpy.power(D,-1/2)
和 matrix_power
函数计算 D^-1/2
计算 TypeError: exponent must be an integer
和 numpy.power
函数引发 RuntimeWarning: divide by zero encountered in power
.
如何计算对角矩阵的负幂 -1/2。请帮忙。
我通过计算数学术语得到了答案,但希望看到任何直接的衬垫:)
def compute_diagonal_to_negative_power():
for i in range(4):
for j in range(4):
if i == j:
element = D[i][j]
numerator = 1
denominator = math.sqrt(element)
D[i][j] = numerator / denominator
return D
diagonal_matrix = compute_diagonal_to_negative_power()
S = np.dot(diagonal_matrix, W).dot(diagonal_matrix)
print(S)
"""
[[ 0. 0.32158153 0.32830723 0.33106193]
[ 0.32158153 0. 0.34047794 0.33923936]
[ 0.32830723 0.34047794 0. 0.33913718]
[ 0.33106193 0.33923936 0.33913718 0. ]]
"""
来源:https://math.stackexchange.com/questions/340321/raising-a-square-matrix-to-a-negative-half-power
如果您可以更新 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. ]])
您可以执行以下操作:
numpy.power(D,-1/2, where=(D!=0))
然后您将避免收到警告: RuntimeWarning:在 power
中遇到除以零numpy 会将矩阵上的每个值按元素除以它自己的平方根,它不是零,所以基本上你不会再尝试除以零了。