【问题标题】:Single Value Decomposition algorithm not working单值分解算法不起作用
【发布时间】: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


【解决方案1】:

我认为您对 eig(ATA) 和 eig(AAT) 返回的特征对的顺序有疑问。 np.linalg.eig 的文档告诉我们不能保证任何顺序。将 eig 替换为 eigh,以升序返回特征对,应该会有所帮助。也不要重新排列值。

顺便说一句,eigh 特定于对称矩阵,例如您传递的矩阵,如果原始矩阵是实数,则不会返回复数。

【讨论】:

    猜你喜欢
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多