PHP中的奇异值分解(SVD)
我想在PHP中实现奇异值分解(SVD)。我知道有几个外部库可以为我做到这一点。但是我有两个关于PHP的问题: 1) 您认为用PHP编写SVD是可能的和/或合理的吗? 2) 如果(1)是肯定的:你能帮我用PHP编写代码吗 我已经自己编写了SVD的一些部分。我在年对行动方针作了评论。这段代码的某些部分并不完全正确PHP中的奇异值分解(SVD),php,svd,eigenvector,eigenvalue,Php,Svd,Eigenvector,Eigenvalue,我想在PHP中实现奇异值分解(SVD)。我知道有几个外部库可以为我做到这一点。但是我有两个关于PHP的问题: 1) 您认为用PHP编写SVD是可能的和/或合理的吗? 2) 如果(1)是肯定的:你能帮我用PHP编写代码吗 我已经自己编写了SVD的一些部分。我在年对行动方针作了评论。这段代码的某些部分并不完全正确 如果你能帮助我,那就太好了。提前非常感谢 关于问题1:这绝对是可能的。它是否合理取决于您的场景:您的矩阵有多大?您打算多久运行一次代码?它是在网站上运行还是从命令行运行? 如果你真的关心速
如果你能帮助我,那就太好了。提前非常感谢 关于问题1:这绝对是可能的。它是否合理取决于您的场景:您的矩阵有多大?您打算多久运行一次代码?它是在网站上运行还是从命令行运行? 如果你真的关心速度,我建议你打电话到
O(N^3)
操作(或者O(MN^2)
如果它是一个矩形m*N
矩阵),这意味着您很容易陷入问题可能需要很长时间的情况。如果100*100案例需要一分钟,那么1000*1000案例需要10^3分钟,或者将近17个小时(实际上可能更糟,因为您可能没有缓存)。对于PHP之类的东西,预因子(prefactor)可以非常非常大,它是计算所需的触发器计数所需的N^3
的乘积
话虽如此,当然可以用PHP编写代码——该语言具有所需的数据结构和操作 是的,这是可行的,但在php中实现SVD并不是最佳方法。正如你所看到的,PHP比C慢,也比C++慢,所以如果你能用这种语言做一个函数,并调用它们作为函数来获得结果,那就更好了。您可以找到该算法的一个实现,这样您就可以通过它来指导自己 关于函数调用可以使用:
- exec()函数
- system()函数
- passthru()函数
#!/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
这里的“w”包含您的单数值列表。当然,这只是让你了解潜在语义分析及其相关关系的一部分。 通常需要减少奇异值的数量,然后使用适当的距离 度量文档、文字、文档和文字等之间的相似性。 合成向量之间夹角的余弦非常流行 是迄今为止我读过的关于你们剩下的步骤的最清晰、最简洁、最有信息量的论文 需要按照SVD进行锻炼 Edit2:还要注意,如果您使用的是非常大的术语文档矩阵(我假设是这样的) 是您正在做的)几乎可以肯定,执行分解的效率要高得多 在脱机模式下,然后响应请求以实时方式仅执行比较。 虽然svdpython非常适合学习,但是svdlibc更适合于这种繁重的任务 计算 最后,正如上面bellegarda的文章所提到的,记住您不必重新计算 svd每次您收到新文档或请求时。取决于你想做什么,你可以 可能可以在脱机模式下,在本地机器上,每周左右执行一次svd, 然后上传结果(尽管存在大小/带宽问题)
无论如何,祝你好运 我知道这是一个老Q,但这是我的2位: 1) 一个真正的SVD比微积分启发的近似要慢得多,例如在Netflix大奖中。s