caw*_*caw 9 php eigenvalue svd eigenvector
我想在PHP中实现奇异值分解(SVD).我知道有几个外部库可以为我做这个.但是我有两个关于PHP的问题:1)你认为用PHP编写SVD是否可能和/或合理?2)如果(1)是肯定的:你能帮我用PHP编写代码吗?
我已经自己编写了SVD的一些部分.这是我对行动过程做出评论的代码.此代码的某些部分并不完全正确.
如果你能帮助我会很棒.非常感谢你提前!
SVD-python是一个非常清晰,简洁的SVD实现.它实际上是伪代码,并且应该相当容易理解和比较/绘制你的php实现,即使你不太了解python.
也就是说,正如其他人所说,我不希望能够用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'包含您的奇异值列表.
当然,这只能让你成为潜在语义分析及其亲属的一部分.您通常希望减少奇异值的数量,然后使用一些适当的距离度量来衡量文档,文字或文档和单词等之间的相似性.合成矢量之间角度的余弦非常流行.
到目前为止,我已经阅读了关于您在SVD之后需要解决的其余步骤的最清晰,最简洁和最丰富的论文.
Edit2:还要注意,如果你正在处理非常大的术语文档矩阵(我假设你正在做的事情),那么在离线模式下执行分解几乎肯定会更有效率,然后仅根据请求以实时方式执行比较.虽然svd-python非常适合学习,但svdlibc更适合你需要这么繁重的计算.
最后如上面的bellegarda论文所述,请记住,每次获得新文档或请求时都不必重新计算svd.取决于你想要做什么,你可能每周左右执行一次svd,在离线模式,本地机器,然后上传结果(尽管尺寸/带宽问题).
无论如何祝你好运!
当你说"我不在乎时间限制"时要小心.SVD是一种O(N^3)操作(或者O(MN^2)如果它是矩形m*n矩阵),这意味着您可能很容易遇到问题可能需要很长时间的情况.如果100*100的情况需要一分钟,1000*1000的情况将是10 ^ 3分钟,或接近17个小时(并且可能更糟,实际上,因为您可能没有缓存).对于类似PHP的东西,前因子 - N^3为了计算所需的FLOP计数而乘以的数字可能非常非常大.
话虽如此,当然可以用PHP编写代码 - 该语言具有所需的数据结构和操作.