PHP の特異値分解 (SVD)
-
12-09-2019 - |
質問
PHP で特異値分解 (SVD) を実装したいと考えています。これを行うことができる外部ライブラリがいくつかあることはわかっています。ただし、PHP に関して 2 つの質問があります。1) PHP で SVD をコーディングすることは可能および/または合理的だと思いますか?2) (1) が「はい」の場合:PHPでコーディングするのを手伝ってくれませんか?
私はすでに SVD の一部を自分でコーディングしました。 コードは次のとおりです 私はその中で行動方針についてコメントしました。このコードの一部は完全には正しくありません。
助けていただければ幸いです。事前にどうもありがとうございました!
解決
SVD-pythonの SVDの非常に明確な、倹約的な実装です。 それは実質的に擬似コードだと理解するのはかなり簡単なはずです そしてあなたは多くのpythonを知らない場合でも、あなたのPHP実装のために描き/コンペアます。
他の人が私はかなり限定されたウェブホストのように聞こえる何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
ここで「W」の特異値のリストが含まれています。
もちろん、これは唯一のあなたに意味解析とその親戚を潜在する方法の一部を取得します。
あなたは、通常、いくつかの適切な距離を採用し、その後、特異値の数を減らしたいです
などあなたの文書、または単語、または文書と単語の間の類似性を測定するメトリック
あなたの結果のベクトル間の角度の余弦はかなり人気があります。
これまでで、私は残りのステップであなたを読んだ明確な、最も簡潔で有益な紙であります SVD以下のワークアウトする必要があります。
EDIT2:また、あなたは非常に大規模な用語-文書行列で作業している場合には(私はこれを仮定していることに注意してください ほぼ確実に分解を実行するためにはるかに効率的になるだろう)、あなたがやっていることです オフラインモードでは、その後、要求に応じて、ライブ形式でのみ比較を行います。 SVD-pythonの学習に最適ですながら、svdlibcは、あなたがそのような重いために望む多くのものです 計算ます。
上記bellegarda論文で述べたように、最後に、あなたが再計算する必要がないことを覚えておいてください 新しい文書やリクエストを取得SVD毎回。あなたは、あなたは可能性がやろうとしているかに応じて、 おそらく、オフラインモードでは、毎週かそこらに一度SVDを実行すると、ローカルマシンに逃げます そしてその結果を(サイズ/帯域幅の問題にもかかわらず)アップロードします。
とにかく幸運!
他のヒント
注意してください。あなたは非常に簡単にあなたの問題が非常に長い時間がかかることが状況になり得ることを意味している(それは長方形のO(N^3)
行列かどうかO(MN^2)
)SVDはm*n
操作です。 100×100の場合は1分かかる場合(あなたがキャッシュ外である可能性が高いですと、現実的に、そしておそらくより悪い)1000×1000の場合は10 ^ 3分、またはほぼ17時間だろう。 PHP、前因子のようなもので - 。必要なFLOP数を計算するためにN^3
を掛ける数、非常に、非常に大きな可能性があります。
もちろん、それはPHPでそれをコーディングすることも可能だ、と言った - 言語が必要なデータ構造と事業を展開しています。
私は、これは古いQですけど、ここに私の2ビットがあります:
1)真のSVDは、Netflixの賞で、例えば、使用微積分にインスピレーションを得た近似よりもはるかに遅いです。参照してください: http://www.sifter.org/~simon/journal/20061211.html の
ここで(Cで)実装があります: http://www.timelydevelopment.com/demos/NetflixPrize.aspxする
2)Cは速くなりますが、PHPは確かにそれを行うことができます。
PHPアーキテクトの作者カル・エヴァンス:「PHPは、私がしました... [しかし]私はバッチファイルのDOSと同等またはシェルスクリプトのLinuxの同等物を記述するためのスクリプト言語としてPHPを使用していたWebスクリプト言語であります私は何をする必要があるかのほとんどは、PHP内から行うことができることを見出した。あなたはPHP、PHP-GTKプロジェクトを経由してデスクトップアプリケーションを構築できるようにしてもプロジェクトがあります。 "
について質問1:それは間違いなく可能です。それは合理的だかどうかは、あなたのシナリオによって異なります。あなたの行列がどのくらいありますか?どのくらいの頻度でコードを実行するつもりですか?それは、ウェブサイトまたはコマンドラインから実行されていますか? あなたが速さを気にした場合は、私はそのラップの単純な拡張を書いを示唆しています GNU科学ライブラリのに呼び出します。
はい、可能ですが、php で SVD を実装するのは最適なアプローチではありません。ここでわかるように、PHP は C よりも遅く、C++ よりも遅いため、この言語のいずれかで実行し、結果を取得する関数として呼び出すことができればより良いかもしれません。アルゴリズムの実装を見つけることができます ここ, 、それであなたはそれを乗り越えることができます。
関数呼び出しについては、次のものが使用できます。
- exec() 関数
このシステム関数は非常に便利で強力ですが、最大の問題の 1 つは、プログラムから得られるテキストがすべて出力ストリームに直接送られることです。結果のテキストを書式設定して別の方法で表示したり、まったく表示したくない場合があります。
- system() 関数
PHP のシステム関数は、実行するコマンドの文字列引数と、そのコマンドに渡す引数を受け取ります。この関数は、指定されたコマンドを実行し、結果のテキストを出力ストリーム (Web サーバーの場合は HTTP 出力、コマンド ライン ツールとして PHP を実行している場合はコンソール) にダンプします。この関数の戻り値は、プログラムがテキスト出力を発行する場合、プログラムからの出力の最後の行です。
- passthru() 関数
これまで見てきたものと同様に、PHP が提供する魅力的な関数の 1 つは、パススルー関数です。この関数は、他の関数と同様に、指定されたプログラムを実行します。ただし、その後、このプログラムからの生の出力を、PHP が現在動作している出力ストリーム (つまり、Web サーバー シナリオの HTTP、または PHP のコマンド ライン バージョンのシェルのいずれか)。
はい。これは PHP で実装することが完全に可能です。実行にかかる妥当な時間枠と、計算できるサイズがどれくらいかわかりません。大まかなアイデアを得るには、おそらくアルゴリズムを実装する必要があるでしょう。
はい、コーディングをお手伝いします。しかし、なぜ助けが必要なのでしょうか?あなたが書いたコードは機能しませんか?
余談ですが。PHPのどのバージョンを使用していますか?