目录
一、背景描述
二、D^(-1/2)的理论基础
三、代码实现
四、总结
今天在看如下论文的时候:
态势感知+图卷积网络在电力系统连锁故障中的应用-机器学习文档类资源-CSDN文库https://download.csdn.net/download/mzy20010420/86745616?spm=1001.2014.3001.5503讲到了图卷积网络的部分,是这么描述的:
此步骤在计算图卷积层的输出,也就是如下流程图中①的地方:
对于图过滤器,需要计算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做机器学习,数学功底很重要。无论是高等数学还是线性代数。很多知识可能在本科阶段没有涉及,因此需要不断地学习才能满足需要!