【发布时间】:2018-10-26 16:22:14
【问题描述】:
我根据 Ian Goodfellow 等人的“深度学习书”第 45 页编写了以下函数来执行 SVD。
def SVD(A):
#A^T
AT = np.transpose(A)
#AA^T
AAT = A.dot(AT)
#A^TA
ATA = AT.dot(A)
#Left single values
LSV = np.linalg.eig(AAT)[1]
U = LSV #some values of U have the wrong sign
#Right single values
RSV = np.linalg.eig(ATA)[1]
V = RSV
V[:,0] = V[:,0] #V isnt arranged properly
values = np.sqrt(np.linalg.eig(ata)[0])
#descending order
values = np.sort(values)[::-1]
rows = A.shape[0]
columns = A.shape[1]
D = np.zeros((rows,columns))
np.fill_diagonal(D,values)
return U, D, V
但是对于任何给定的矩阵,结果都与使用不同
np.linalg.svd(A)
我不知道为什么。
我通过说测试了我的算法
abs(UDV^T - A) < 0.0001
检查它是否正确分解而没有。问题似乎出在 V 和 U 组件上,但我看不出出了什么问题。 D 似乎是正确的。
如果有人能看到问题,将不胜感激。
【问题讨论】:
-
问题实际上与
machine-learning无关 - 请不要向标签发送垃圾邮件(已删除)。 -
对不起。考虑到 SVD 用于 PCA 并且作为许多 ML 应用程序中的工具,它是相关的。几乎每本 ML 书籍中都有此内容
-
是的,但是您可能需要帮助调试随后将在宇宙飞船中使用的排序算法这一事实并不能将问题限定为关于
space-engineering... SVD正在用于 ML 之外的无数其他领域
标签: numpy linear-algebra svd