潜在 Space 和 SVD
Latent Space and SVD
我有一个相当大的数据集,我正在为其计算 SVD 然后我想取回矩阵。我的矩阵形状是:(33388, 104) 有很多列和行。我想要80%的能量,也就是k=51
.
当我转到 return 我在 return 中的矩阵时,出现以下错误:
operands could not be broadcast together with shapes (33388,51) (51,51)
img is a numpy array of an image file
k is the number of singular vectors to use
如何修正我的函数来修复这个错误?
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])
我有一个相当大的数据集,我正在为其计算 SVD 然后我想取回矩阵。我的矩阵形状是:(33388, 104) 有很多列和行。我想要80%的能量,也就是k=51
.
当我转到 return 我在 return 中的矩阵时,出现以下错误:
operands could not be broadcast together with shapes (33388,51) (51,51)
img is a numpy array of an image file
k is the number of singular vectors to use
如何修正我的函数来修复这个错误?
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])