版权声明:本文为博主原创文章,可以随便转载 https://blog.csdn.net/appleyuchi/article/details/82913217
文章针对以下代码重点研究:
xformedItems = dataMat.T * U[:,:4] * Sig4.I
首先是SVD分解的公式:
Mm⋅n=Um⋅m⋅Σm⋅n⋅(Vn⋅n)T
注意Σ在python代码中返回时,是一个向量,矩阵论中是一个对角矩阵。
对角线上都是各个奇异值,其余元素都是0.
并且Σ矩阵必定是从大到小排序过的。
其中
Um⋅m和
Vn⋅n是正交阵
正交矩阵的各行是单位向量且两两正交
正交矩阵的各列是单位向量且两两正交
对于正交阵A(特指方阵)有以下性质:
AT=A−1
如果从
Um⋅m中抽取k列,构成
Um⋅k,且
Uk⋅m=(Um⋅k)T
如果从
Vm⋅m中抽取k列,构成
Vm⋅k,且
Vk⋅m=(Vm⋅k)T
那么有:
Uk⋅m⋅Um⋅k=Ek⋅k①
Um⋅k⋅Uk⋅m̸=Em⋅m
Vk⋅m⋅Vm⋅k=Ek⋅k②
Vm⋅k⋅Vk⋅m̸=Em⋅m
上述等式的成立条件是:k≤m
注意上面①②的每个式子的顺序不能反,
接下来是SVD的近似公式:
Mm⋅n≈Um⋅k⋅Σk⋅k⋅(Vn⋅k)T③
下面根据该式进行推导,对于③中,等式左右两边乘以
Uk⋅m,得到:
Uk⋅m⋅Mm⋅n≈(Uk⋅m⋅Um⋅k)⋅Σk⋅k⋅(Vn⋅k)T
代入式①得到:
Uk⋅m⋅Mm⋅n≈Ek⋅k⋅Σk⋅k⋅(Vn⋅k)T④
两边乘以
(Σk⋅k)−1,得到:
(Σk⋅k)−1⋅Uk⋅m⋅Mm⋅n≈(Vn⋅k)T⑤
等式两边进行转置操作:
Vn⋅k≈((Σk⋅k)−1⋅Uk⋅m⋅Mm⋅n)T
对等式右边进行展开:
Vn⋅k≈(Mm⋅n)T⋅Um⋅k⋅((Σk⋅k)−1)T⑥
∵
(Σk⋅k)是对角阵,
∴
(Σk⋅k)−1也是对角阵
∴
(Σk⋅k)−1的转置矩阵等于
(Σk⋅k)−1⑦
将⑦中关系,代入⑥,得到
Vn⋅k≈(Mm⋅n)T⋅Um⋅k⋅(Σk⋅k)−1⑧
对比⑧和书上的这句代码进行比较:
xformedItems = dataMat.T * U[:,:4] * Sig4.I
我们会发现是一模一样的。
所以上述推导是这句代码的理论依据。
借助的在线公式编辑器链接为:
http://www.sciweavers.org/free-online-latex-equation-editor