• qinggeouye
    2019-04-03
    import numpy as np
    from numpy import linalg as la

    # 文档集合 文档和词条关系矩阵 行表示文档 列表示词条
    x = np.mat([[1, 1, 1, 0, 0], [2, 2, 2, 0, 0],
                [1, 1, 1, 0, 0], [5, 5, 5, 0, 5],
                [0, 0, 0, 2, 2], [0, 0, 0, 3, 3],
                [0, 0, 0, 1, 1]])

    U, sigma, VT = la.svd(x)
    print(U, "\n")
    print(sigma, "\n")
    print(VT, "\n")

    S = np.zeros((7, 5)) # 奇异矩阵
    for i in range(len(sigma)):
        S[i, i] = sigma[i]

    print(" 与矩阵 x 一致? \n", U.dot(S).dot(VT.transpose()))

    这里计算出的左奇异矩阵、奇异值矩阵、右奇异值矩阵,以及它们的点乘,与本文中的都不太一样,不知哪里出问题了?
    展开

    作者回复: 你原来的代码里有两个误输入,
    1. x矩阵中的[5, 5, 5, 0, 5]应该是[5, 5, 5, 0, 0]
    2.print(" 与矩阵 x 一致? \n", U.dot(S).dot(VT.transpose()))应该是print(" 与矩阵 x 一致? \n", U.dot(S).dot(VT)),这里VT已经转置过了。

    这样得到的奇异值是[9.64365076e+00 5.29150262e+00 7.52989891e-16 0.00000000e+00
     0.00000000e+00],后面3个接近0,忽略不计

     1
     1
  • 南边
    2020-01-16
    把 V 的这 n 个特征向量进行标准化处理,那么对于每个特征向量 Vi​,就有 ∣∣Vi​∣∣2​=1,而这表示 V’i​Vi​=1,此时 V 的 n 个特征向量为标准正交基,满足 V’V=I , 也就是说 V 为酉矩阵

    对于V是酉矩阵这个推导还是不太理解

    作者回复: x1...xn标准化之后,就意味着数据的分布呈现标准正态分布,均值为0,标准差为1。所有就有(x1-0)^2+...+(xn-0)^2=1,也就是∣∣Vi​∣∣2​=1。所以V'iVi=1,而这个1正好是矩阵V'V对角线上的值,对角线上全部为1,其他值全为0,所以V'V = I(单位矩阵)

    
    
  • Paul Shan
    2019-10-11
    文档例子和svd分解有差别,svd是左右为方阵,中间为非方阵。文档例子是中间为方阵,左右为方阵,我感觉这里缺了一步,是不是文档的例子已经是降维后的结果了?

    作者回复: 你是指最后的文档集合的那个例子?对,这是分解后的结果

    
    
  • Paul Shan
    2019-10-11
    方阵分解成正交阵 x 对角阵 x 正交阵转置
    非方阵也可以做类似分解
    这里的对角阵参数的大小反映了重组后分量的信息量
    
    
我们在线,来聊聊吧