问题描述
我想近似给定的 n x m
矩阵 A
与 n >> m
作为一些 W
行 k
的加权和 B
(理想情况下从 A
中选择,但也可以是任意的)。权重总和必须为 1,并且必须为正数。
import numpy as np
n = 1000 # rows
m = 3 # columns
k = 2 # hidden rank
# create random matrix with rank k
A = np.random.rand(n,k).dot(np.random.rand(k,m))
# estimate hidden rank
u,s,vt = np.linalg.svd(A,full_matrices=False,compute_uv=True)
k_est = np.count_nonzero(~np.isclose(s,0))
# truncate to k_est
B = np.diag(s[:k_est]) @ vt[...,:k_est,:]
W = u[...,:k_est]
# do some magic with B and W to come up with
assert np.all(W >= 0)
assert np.all(np.isclose(W.sum(1),1))
assert np.all(np.isclose(A,W @ B))
我尝试使用 SVD,它能够通过 W @ B 重现 A,但权重为负且不等于 1。
根据我的直觉,我似乎在寻找 A
的凸包,但只有 k_est
点。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)