0


【机器学习】求矩阵的-1/2次方的方法

一、背景描述

今天在看如下论文的时候:

态势感知+图卷积网络在电力系统连锁故障中的应用-机器学习文档类资源-CSDN文库https://download.csdn.net/download/mzy20010420/86745616?spm=1001.2014.3001.5503讲到了图卷积网络的部分,是这么描述的:

此步骤在计算图卷积层的输出,也就是如下流程图中①的地方:

对于图过滤器,需要计算D矩阵的-1/2次方。由于本科阶段的线性代数并没由涉及到这一部分,导致不会算。由此引发了今天的讨论。


二、D^(-1/2)的理论基础

A^{-1/2}就是A^{1/2}的逆矩阵.
这里A^{1/2}指A的算术平方根,通常只对A是Hermite正定矩阵而言(因为一般来讲平方根是多值的,只有正定阵容易规定取其中正定的平方根).对Hermite正定矩阵,利用谱分解定理容易证明存在唯一的Hermite正定矩阵B使得A=B^2.

具体理论基础如图手动推导所示:

其中,P是矩阵A的特征矩阵,需要归一化处理,而尖表示有矩阵特征值组成的对角矩阵,然后算矩阵中的每个元素的(-1/2)次方。

也就是说,我们需要先算出矩阵D的特征值和特征向量。具体算法如下示例:

我们下面来看一个例子:

我们带入:

可得:

解得:

当为2时:

同理,当为4时:

如果用python计算,会将矩阵向量归一化处理。


三、代码实现

代码如下:

import numpy as np

data = np.random.randint(1, 8, size=4).reshape((2, 2))
print(data)

'''
#这是给矩阵中的每一个元素开根号,不是想要的那种
data1 = data ** (-1 / 2)
print(data1)
'''

#正式开始!
# v 为特征值    Q 为特征向量
v, Q = np.linalg.eig(data)
V = np.diag(v**(-0.5))
# print(V)
T = Q * V * np.linalg.inv(Q)
print(T)

'''
#下面这种不是求逆的方法,只是对Q的每一个值取了倒数,不对!
T1 = Q * V * (Q**(-1))
print(T1)
'''

结果:

[[4 1]
 [3 7]]
[[ 0.46186147 -0.        ]
 [-0.          0.2963961 ]]

可以看出,最终的输出与之前手动推算的相同,确实是对角矩阵。

下面对比一下两个貌似正确的求逆的方法:

代码:

import numpy as np

data = np.random.randint(1, 8, size=4).reshape((2, 2))
print(data)

'''
#这是给矩阵中的每一个元素开根号,不是想要的那种
data1 = data ** (-1 / 2)
print(data1)
'''

#正式开始!
# v 为特征值    Q 为特征向量
v, Q = np.linalg.eig(data)
V = np.diag(v**(-0.5))
# print(V)
T = Q * V * np.linalg.inv(Q)
print(f'T is {T}')

#下面这种不是求逆的方法,只是对Q的每一个值取了倒数,不对!
T1 = Q * V * (Q**(-1))
print(f"T1 is {T1}")

结果:

[[7 3]
 [1 3]]
T is [[ 0.31751691 -0.        ]
 [-0.          0.57220385]]
T1 is [[0.3616512  0.        ]
 [0.         0.65173918]]

明显,是不同的。经过分析,第一种是对的。


四、总结

由于手头没有课本,线性代数部分的知识源自如下链接:

线性代数精华——矩阵的特征值与特征向量 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/104980382做机器学习,数学功底很重要。无论是高等数学还是线性代数。很多知识可能在本科阶段没有涉及,因此需要不断地学习才能满足需要!


本文转载自: https://blog.csdn.net/mzy20010420/article/details/127557236
版权归原作者 Rachel MuZy 所有, 如有侵权,请联系我们删除。

“【机器学习】求矩阵的-1/2次方的方法”的评论:

还没有评论