首页 > 其他 > 详细

论文中矩阵的各种trick

时间:2020-05-02 09:23:44      阅读:95      评论:0      收藏:0      [点我收藏+]

\(XQc\to XCq\)

其中\(X\in R^{n,p},\,Q\in R^{p,k},\, c\in R^{k,1},\, C\in R^{p, kp},\, q\in R^{kp, 1}\)\(n\)表示样本数,\(p\)表示特征维度,\(c\)表示pattern的个数。

推导过程如下:

\[\begin{align*}(XQc)_{r, 1}&=\sum_l(XQ)_{r,l}\,c_{l,1}\\&=\sum_l \sum_m X_{r,m}Q_{m,l}\,c_{l,1}\\&=\sum_m\sum_l X_{r, m} \,c_{l,1}Q_{m,l}\end{align*} \]

\(m\)先固定,如\(m=1\)\(l=\{1, \cdots ,k\}\)上式为

\[X_{r,1}c_{(1,\cdots,k),1}Q_{1, (1,\cdots,k)} \]

可以看到\(c\)\(Q\)每一行都做了矩阵乘法,而\(m\)是变动的,不难可以想象出\(I\otimes c.T\)\(Q\)要拉成已为向量。代码如下:

import numpy as np

np.random.seed(10)

X = np.random.randn(5, 10)
Q = np.random.randn(10, 3)
c = np.random.randn(3, 1)

# original 
result = X.dot(Q.dot(c))

# transformed
I = np.eye(10)
q = Q.reshape(-1, 1)

# 
C = np.outer(I, c.T).reshape(10, -1)
# C = np.multiply.outer(I, c.T).reshape(10, -1)
# C = np.einsum(‘ab, cd->abcd‘, I, c.T).reshape(10, -1)

new_result = X.dot(C.dot(q))

print("变换是否等价", np.allclose(result, new_result, rtol=1e-4))

论文中矩阵的各种trick

原文:https://www.cnblogs.com/DemonHunter/p/12815618.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!