Python 潜空间与奇异值分解

Python 潜空间与奇异值分解,python,numpy,svd,Python,Numpy,Svd,我有一个相当大的数据集,我正在计算SVD,然后我想得到矩阵。我的矩阵形状是:(33388104),有很多列和行。我想要80%的能量,即k=51 当我在返回中返回矩阵时,我得到以下错误: 操作数无法与形状(33388,51)(51,51)一起广播 img是一个图像文件的numpy数组 k是要使用的奇异向量数 如何更正函数以修复此错误 def rank_k_approx(img, k): """Return a rank-k approximation img: an im

我有一个相当大的数据集,我正在计算SVD,然后我想得到矩阵。我的矩阵形状是:(33388104),有很多列和行。我想要80%的能量,即
k=51

当我在返回中返回矩阵时,我得到以下错误:


操作数无法与形状(33388,51)(51,51)一起广播


img是一个图像文件的numpy数组
k是要使用的奇异向量数

如何更正函数以修复此错误

def rank_k_approx(img, k):
    """Return a rank-k approximation

    img: an image (as a 2D grayscale array)
    k: number of singular vectors used"""
    u, sigma, vt = np.linalg.svd(img)
    energy = np.linalg.norm(sigma)**2
    approx_energy = np.linalg.norm(sigma[:k])**2
    percentage = approx_energy*100/energy
    print ("Energy retained = %4.2f"%percentage)
    return u[:,:k]*np.diag(sigma[:k])*vt[:k,:]

np.linalg.svd
的输出是
ndarray
对象,运算符
*
是元素乘法。要计算矩阵积,需要使用
np.dot()
@
运算符

乘法应为:

u[:, :k].dot(np.diag(sigma[:k])).dot(vt[:k])

事实上,我认为这并不能满足我的需要,形状仍然是(33388104),乘法后它是否应该更小?@codebase5000否。您正在对原始矩阵进行秩k近似,其中
k
是恢复原始矩阵80%方差所需的秩。这是原始矩阵的低阶近似值,但其大小与原始矩阵相同。只是,我刚意识到在我按下回车键后,我很抱歉。