PHP中的奇异值分解(SVD)

caw*_*caw 9 php eigenvalue svd eigenvector

我想在PHP中实现奇异值分解(SVD).我知道有几个外部库可以为我做这个.但是我有两个关于PHP的问题:1)你认为用PHP编写SVD是否可能和/或合理?2)如果(1)是肯定的:你能帮我用PHP编写代码吗?

我已经自己编写了SVD的一些部分.这是我对行动过程做出评论的代码.此代码的某些部分并不完全正确.

如果你能帮助我会很棒.非常感谢你提前!

si2*_*19e 9

SVD-python是一个非常清晰,简洁的SVD实现.它实际上是伪代码,并且应该相当容易理解和比较/绘制你的php实现,即使你不太了解python.

SVD-蟒蛇

也就是说,正如其他人所说,我不希望能够用php实现非常重型的LSA,这听起来像是一个非常有限的网络主机.

干杯

编辑:上面的模块本身并没有做任何事情,但是开场评论中包含一个例子.假设你下载了python模块,并且它是可访问的(例如在同一个文件夹中),你可以实现一个简单的例子如下,

#!/usr/bin/python
import svd
import math

a = [[22.,10., 2.,  3., 7.],
     [14., 7.,10.,  0., 8.],
     [-1.,13.,-1.,-11., 3.],
     [-3.,-2.,13., -2., 4.],
     [ 9., 8., 1., -2., 4.],
     [ 9., 1.,-7.,  5.,-1.],
     [ 2.,-6., 6.,  5., 1.],
     [ 4., 5., 0., -2., 2.]]

u,w,vt = svd.svd(a)
print w
Run Code Online (Sandbox Code Playgroud)

这里'w'包含您的奇异值列表.
当然,这只能让你成为潜在语义分析及其亲属的一部分.您通常希望减少奇异值的数量,然后使用一些适当的距离度量来衡量文档,文字或文档和单词等之间的相似性.合成矢量之间角度的余弦非常流行.

潜在语义映射(pdf)

到目前为止,我已经阅读了关于您在SVD之后需要解决的其余步骤的最清晰,最简洁和最丰富的论文.

Edit2:还要注意,如果你正在处理非常大的术语文档矩阵(我假设你正在做的事情),那么在离线模式下执行分解几乎肯定会更有效率,然后仅根据请求以实时方式执行比较.虽然svd-python非常适合学习,但svdlibc更适合你需要这么繁重的计算.

最后如上面的bellegarda论文所述,请记住,每次获得新文档或请求时都不必重新计算svd.取决于你想要做什么,你可能每周左右执行一次svd,在离线模式,本地机器,然后上传结果(尽管尺寸/带宽问题).

无论如何祝你好运!


And*_*ffe 5

当你说"我不在乎时间限制"时要小心.SVD是一种O(N^3)操作(或者O(MN^2)如果它是矩形m*n矩阵),这意味着您可能很容易遇到问题可能需要很长时间的情况.如果100*100的情况需要一分钟,1000*1000的情况将是10 ^ 3分钟,或接近17个小时(并且可能更糟,实际上,因为您可能没有缓存).对于类似PHP的东西,前因子 - N^3为了计算所需的FLOP计数而乘以的数字可能非常非常大.

话虽如此,当然可以用PHP编写代码 - 该语言具有所需的数据结构和操作.

  • Marco,我已经完成了LSA,我可以肯定地告诉你,PHP将为*任何*大小的矩阵提供不可接受的响应时间,更不用说巨大了.节省时间试图解决问题并找到与C接口的方法.Svdlibc对我很有帮助:http://tedlab.mit.edu/~dr/svdlibc/ (2认同)