今天看到代码,归一化是这么写的:
mat.dot(dInvSqrtMat).transpose().dot(dInvSqrtMat).tocoo()
。
mat是一个对称矩阵,dInvSqrtMat是度矩阵,一直想不明白,推导了一下:
原代码逻辑为第一行:
A^=(AD−12)TD−12=(D−12)TATD−12=D−12AD−12
\hat{A} = (AD^{-\frac{1}{2}})^TD^{-\frac{1}{2}} \\
= (D^{-\frac{1}{2}})^T A^T D^{-\frac{1}{2}} \\
=D^{-\frac{1}{2}} A D^{-\frac{1}{2}}
A^=(AD−21)TD−21=(D−21)TATD−21=D−21AD−21
其中,可使用的条件为:A满足对称矩阵,D满足E的特性。
(AB)T=BTATET=EA是对称矩阵,AT=A
(AB)^T = B^TA^T \\
E^T = E \\
A是对称矩阵,A^T = A \\
(AB)T=BTATET=EA是对称矩阵,AT=A
这么写的目的是为了:结合稀疏矩阵的计算特性,保证结果矩阵的对称性以及计算效率。