Python 如何在Sklearn中得到典型相关分析的基矩阵的变化?

Python 如何在Sklearn中得到典型相关分析的基矩阵的变化?,python,machine-learning,scikit-learn,statistics,linear-algebra,Python,Machine Learning,Scikit Learn,Statistics,Linear Algebra,一点背景:我正在尝试用python创建凝乳和乳清回归收缩算法的玩具示例。在标准多元回归中,该算法使用典型相关分析,根据输出与其他输出的协方差来缩小输出。我需要了解如何访问基矩阵的变化,该变化将原始矩阵转换为具有最佳协方差的CCA空间中的矩阵 简言之,鉴于: import numpy as np from sklearn.cross_decomposition import CCA n = 100 p = 5 X = np.random.randn(n,p) Y = np.random.ran

一点背景:我正在尝试用python创建凝乳和乳清回归收缩算法的玩具示例。在标准多元回归中,该算法使用典型相关分析,根据输出与其他输出的协方差来缩小输出。我需要了解如何访问基矩阵的变化,该变化将原始矩阵转换为具有最佳协方差的CCA空间中的矩阵

简言之,鉴于:

import numpy as np
from sklearn.cross_decomposition import CCA


n = 100
p = 5
X = np.random.randn(n,p)
Y = np.random.randn(n,p)

cca = CCA(n_components=p)
cca.fit(X, Y)
X_c, Y_c = cca.transform(X, Y)

如何找到基矩阵“T”的(p,p)变化,使得

Y @ T == Y_c # evaluates to True, or at least are very similar
Y_c @ np.linalg.inv(T) == Y # evaluates to True, or at least are very similar
我考虑过使用Y的伪逆。例如,如果Y*T=Y_c,那么T=Y_si*Y_c,其中Y_si是Y的伪逆。然而,这给出了数值上不稳定的结果:

T = np.linalg.pinv(Y) @ Y_c

(Y_c @ np.linalg.inv(T))[:3, :3] # Should equal Y
产出:

array([[-0.13289669,  1.76632671,  0.0270406 ],
       [-1.06494794,  1.73254813,  0.21299642],
       [ 0.44353485,  0.20963675,  1.16396743]])
array([[-0.28513006,  1.72073957,  0.13064754],
       [-1.19718898,  1.69294781,  0.30299698],
       [ 0.30245287,  0.16738896,  1.25998495]])

Y[:3, :3]
产出:

array([[-0.13289669,  1.76632671,  0.0270406 ],
       [-1.06494794,  1.73254813,  0.21299642],
       [ 0.44353485,  0.20963675,  1.16396743]])
array([[-0.28513006,  1.72073957,  0.13064754],
       [-1.19718898,  1.69294781,  0.30299698],
       [ 0.30245287,  0.16738896,  1.25998495]])
有什么建议吗?非常感谢您的帮助