PHP中的奇异值分解(SVD)

PHP中的奇异值分解(SVD),php,svd,eigenvector,eigenvalue,Php,Svd,Eigenvector,Eigenvalue,我想在PHP中实现奇异值分解(SVD)。我知道有几个外部库可以为我做到这一点。但是我有两个关于PHP的问题: 1) 您认为用PHP编写SVD是可能的和/或合理的吗? 2) 如果(1)是肯定的:你能帮我用PHP编写代码吗 我已经自己编写了SVD的一些部分。我在年对行动方针作了评论。这段代码的某些部分并不完全正确 如果你能帮助我,那就太好了。提前非常感谢 关于问题1:这绝对是可能的。它是否合理取决于您的场景:您的矩阵有多大?您打算多久运行一次代码?它是在网站上运行还是从命令行运行? 如果你真的关心速

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

我已经自己编写了SVD的一些部分。我在年对行动方针作了评论。这段代码的某些部分并不完全正确


如果你能帮助我,那就太好了。提前非常感谢

关于问题1:这绝对是可能的。它是否合理取决于您的场景:您的矩阵有多大?您打算多久运行一次代码?它是在网站上运行还是从命令行运行? 如果你真的关心速度,我建议你打电话到

  • 对。这完全可以在PHP中实现。 我不知道执行的合理时间框架是什么,它的计算量有多大。 我可能需要实现这个算法来获得一个粗略的想法

  • 是的,我可以帮你编码。但你为什么需要帮助?你写的代码不管用吗

  • 只是一个旁白。你使用什么版本的PHP?

    当你说“我不在乎时间限制是什么”时要小心。SVD是一种
    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()函数
    PHP中的系统函数接受要执行的命令的字符串参数以及希望传递给该命令的任何参数。此函数执行指定的命令,并将任何生成的文本转储到输出流(web服务器情况下的HTTP输出,或者作为命令行工具运行PHP时的控制台)。如果程序发出文本输出,则此函数的返回是程序输出的最后一行

    • passthru()函数
    PHP提供的一个有趣的函数与我们到目前为止看到的类似,就是passthru函数。与其他函数一样,此函数执行您告诉它的程序。但是,它随后会立即将此程序的原始输出发送到PHP当前使用的输出流(即web服务器场景中的HTTP或PHP命令行版本中的shell)。

    SVD python 是SVD的一个非常清晰、节约的实现。 它实际上是伪代码,应该很容易理解 并比较/利用php实现,即使您对python了解不多

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

    干杯

    编辑: 上面的模块本身并不做任何事情,但是在 开场白。假设您下载了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
    
    这里的“w”包含您的单数值列表。
    当然,这只是让你了解潜在语义分析及其相关关系的一部分。 通常需要减少奇异值的数量,然后使用适当的距离 度量文档、文字、文档和文字等之间的相似性。 合成向量之间夹角的余弦非常流行

    是迄今为止我读过的关于你们剩下的步骤的最清晰、最简洁、最有信息量的论文 需要按照SVD进行锻炼

    Edit2:还要注意,如果您使用的是非常大的术语文档矩阵(我假设是这样的) 是您正在做的)几乎可以肯定,执行分解的效率要高得多 在脱机模式下,然后响应请求以实时方式仅执行比较。 虽然svdpython非常适合学习,但是svdlibc更适合于这种繁重的任务 计算

    最后,正如上面bellegarda的文章所提到的,记住您不必重新计算 svd每次您收到新文档或请求时。取决于你想做什么,你可以 可能可以在脱机模式下,在本地机器上,每周左右执行一次svd, 然后上传结果(尽管存在大小/带宽问题)


    无论如何,祝你好运

    我知道这是一个老Q,但这是我的2位:

    1) 一个真正的SVD比微积分启发的近似要慢得多,例如在Netflix大奖中。s