我怎样才能将矩阵分解成特定的形状?

How can I factor matrices into specific shapes?

我有一个形状为 (30000, 10) 的矩阵。我想将其分解为形状为 (30000, 512) 和 (512, 10) 的矩阵。这可能吗?如果可以,我将如何在代码中这样做(最好是 python)?

例如,如果有这样一个矩阵:

c = np.array([[39, 21],
       [87 , 54],
       [135, 87],
       [183, 120]])

我希望能够在指定形状时得到两个相乘得到 c 的矩阵。假设我想找到两个形状为 (4,3)(3,2) 的矩阵,我会得到这些数组:

a = np.array([[1,2,3],
[4,5,6],
[7,8,9],
[10,11,12]])

b = np.array([[2,3],
          [5,6],
          [9,2]])

如果您的矩阵是非负的,您可以使用非负矩阵分解 (NMF) 来获得这样的解。可以参考sklearn's NMF implementation

示例:

import numpy as np 
from sklearn.decomposition import NMF

x = np.random.rand(30000,10)
model = NMF(n_components=512, init='random', random_state=0)
W = model.fit_transform(x) # W.shape = (30000,512)
H = model.components_ # W.shape = (512,10)