2009-06-06 67 views
9

Tôi muốn triển khai Phân tích giá trị số ít (SVD) trong PHP. Tôi biết rằng có một số thư viện bên ngoài có thể làm điều này cho tôi. Nhưng tôi có hai câu hỏi liên quan đến PHP, mặc dù: 1) Bạn có nghĩ rằng nó có thể và/hoặc hợp lý để mã SVD trong PHP? 2) Nếu (1) là có: Bạn có thể giúp tôi viết mã bằng PHP không?Phân tách giá trị số ít (SVD) trong PHP

Tôi đã tự mã hóa một số phần của SVD. Here's the code mà tôi đã đưa ra nhận xét về quá trình hành động. Một số phần của mã này không hoàn toàn chính xác.

Sẽ rất tuyệt nếu bạn có thể giúp tôi. Cảm ơn bạn rất nhiều trước!

+3

Nhận xét của bạn bằng tiếng Đức rất hữu ích. Tại sao bạn cần phải thực hiện các thuật toán phức tạp như vậy trong PHP? –

+0

Nếu ai đó cần ý kiến ​​bằng tiếng Anh, tôi có thể dịch chúng, tất nhiên. Tôi phải thực hiện nó trong PHP vì tôi không thể cài đặt các thư viện bên ngoài trên webspace của tôi. – caw

+0

có mùi giống như bài tập về nhà – VVS

Trả lời

9

SVD-python Thực hiện rất rõ ràng, phân tích cú pháp SVD. Đó là thực tế psuedocode và nên được khá dễ hiểu và so sánh/vẽ trên cho thực hiện php của bạn, ngay cả khi bạn không biết nhiều python.

SVD-python

Điều đó nói rằng, như những người khác đã đề cập đến tôi sẽ không mong đợi để có thể làm LSA rất nặng với thực hiện php gì nghe có vẻ giống như một web-host khá hạn chế.

Cheers

Edit: Các module trên không làm bất cứ điều gì cả bởi chính nó, nhưng có một ví dụ bao gồm trong ý kiến ​​khai mạc. Giả sử bạn đã tải về các mô-đun python, và nó đã truy cập (ví dụ trong cùng một thư mục), bạn có thể thực hiện một ví dụ nhỏ như sau,

#!/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 

đây 'w' chứa danh sách các giá trị duy nhất.
Tất nhiên điều này chỉ giúp bạn trở thành một phần của cách phân tích ngữ nghĩa tiềm ẩn và người thân của nó. Bạn thường muốn giảm số lượng giá trị số ít, sau đó sử dụng một số khoảng cách thích hợp để đo lường sự tương tự giữa tài liệu hoặc từ hoặc tài liệu và từ, v.v. Cosin của góc giữa các vectơ kết quả của bạn khá phổ biến .

Latent Semantic Mapping (pdf)

đến nay là ngắn gọn và thông tin hầu hết giấy rõ ràng, tôi đã đọc trên các bước còn lại bạn cần phải làm việc ra sau SVD.

Chỉnh sửa2: cũng lưu ý rằng nếu bạn đang làm việc với các ma trận tài liệu có độ dài rất lớn (tôi giả định đây là là những gì bạn đang làm) gần như chắc chắn sẽ hiệu quả hơn để thực hiện phân tích một chế độ ngoại tuyến, và sau đó chỉ thực hiện các so sánh theo kiểu sống theo yêu cầu. trong khi svd-python là tuyệt vời cho việc học tập, svdlibc là nhiều hơn những gì bạn sẽ muốn cho tính toán nặng như vậy .

cuối cùng như đã đề cập trong giấy bellegarda ở trên, hãy nhớ rằng bạn không cần phải tính toán lại mỗi lần bạn nhận được tài liệu hoặc yêu cầu mới. tùy thuộc vào những gì bạn đang cố gắng để làm bạn có thể có thể thoát khỏi việc thực hiện svd một lần mỗi tuần hoặc lâu hơn, trong chế độ ngoại tuyến, máy cục bộ, và sau đó tải lên kết quả (kích thước/băng thông quan tâm mặc dù).

dù sao thì may mắn!

+0

Cảm ơn bạn rất nhiều !!! :) Nó sẽ là tuyệt vời nếu điều này sẽ làm việc kết hợp với hàm passthru() của PHP (thx ljyanes). Nhưng kịch bản này không đưa ra bất kỳ đầu ra nào. Tôi phải làm gì? Tôi đã nhận xét điều này: http://paste.bradleygill.com/index.php?paste_id=10389 – caw

+0

Tôi đã thêm một số thông tin khác, bao gồm ví dụ hoạt động từ các nhận xét trong mô-đun python. – si28719e

+0

Cảm ơn bạn lần nữa vì đã chỉnh sửa. Mã của bạn là chính xác những gì tôi đã làm, phải không? ;) Nhìn vào trang web codepaste nơi tôi đã viết mã. Tôi nghĩ tôi đã lấy nhầm gói. Tôi chỉ tải xuống tệp svd.py mà bạn đã liên kết ở trên. Tôi có phải tải cái gì khác không? – caw

2

Về câu hỏi 1: Chắc chắn là có thể. Cho dù đó là hợp lý phụ thuộc vào kịch bản của bạn: Làm thế nào lớn là ma trận của bạn? Bạn định chạy mã này bao lâu một lần? Là nó chạy trong một trang web hoặc từ dòng lệnh? Nếu bạn quan tâm đến tốc độ, tôi sẽ đề xuất writing a simple extension kết thúc cuộc gọi đến GNU Scientific Library.

+0

Cảm ơn bạn đã trả lời câu hỏi này. Tôi muốn chạy nó trên một trang web và kịch bản nên được gọi bởi một cronjob. Tôi không quan tâm nhiều về tốc độ. Nó sẽ là đủ nếu kịch bản sẽ luôn luôn làm SVD cho 1 văn bản duy nhất. Ma trận khổng lồ mà tôi luôn cần cũng có thể được lưu trữ. Viết một phần mở rộng cho Thư viện khoa học GNU là một vấn đề bởi vì tôi không thể cài đặt các thư viện trên webspace của tôi thông qua dòng lệnh. – caw

+0

Nếu bạn có quyền truy cập trình bao và có thể cài đặt các tệp nhị phân và sử dụng cron, bạn có thể nghĩ đến việc viết nhị phân độc lập (có thể, được liên kết tĩnh), không phải là tập lệnh PHP. Ngay cả đối với cùng một thuật toán này sẽ có nhiều CPU và bộ nhớ hiệu quả hơn. – drdaeman

0
  1. Có. điều này hoàn toàn có thể được thực hiện trong PHP. Tôi không biết khung thời gian hợp lý để thực thi là gì và nó có thể tính toán bao nhiêu. Tôi có lẽ sẽ phải thực hiện các thuật toán để có được một ý tưởng rought.

  2. Có tôi có thể giúp bạn viết mã. Nhưng tại sao bạn cần giúp đỡ? Không phải mã bạn đã viết có hoạt động không?

Cũng giống như một câu hỏi sang một bên. Bạn sử dụng phiên bản PHP nào?

+0

Cảm ơn bạn rất nhiều! Rất nhiều người tôi đã nói với tôi rằng PHP hoàn toàn không phù hợp với SVD. Tôi không quan tâm giới hạn thời gian là gì, tôi chỉ muốn thực hiện nó. Mã của tôi không hoạt động vì nó không nhận được giá trị riêng. Tôi đã thử một số thủ tục xấp xỉ nhưng chúng không hoạt động tốt. Nó sẽ là tuyệt vời nếu bạn có thể giúp tôi. Tôi sử dụng PHP 5. – caw

5

Hãy cẩn thận khi bạn nói "Tôi không quan tâm đến giới hạn thời gian". SVD là hoạt động O(N^3) (hoặc O(MN^2) nếu đó là ma trận m*n hình chữ nhật) có nghĩa là bạn có thể dễ dàng ở trong tình huống mà sự cố của bạn có thể mất nhiều thời gian. Nếu trường hợp 100 * 100 mất một phút, trường hợp 1000 * 1000 sẽ là 10^3 phút hoặc gần 17 giờ (và có thể tồi tệ hơn, thực tế, vì bạn có khả năng thoát ra khỏi bộ nhớ cache). Với một cái gì đó như PHP, các prefactor - số nhân N^3 để tính toán số lượng FLOP yêu cầu, có thể rất, rất lớn.

Có nói rằng, tất nhiên có thể viết mã bằng PHP - ngôn ngữ có cấu trúc và hoạt động dữ liệu cần thiết.

+0

Cảm ơn bạn rất nhiều vì điều này! Vì vậy, bạn nghĩ rằng nó có thể mã nó với PHP nhưng PHP không phải là rất phù hợp, phải không? – caw

+0

Vâng, PHP không phải là lý tưởng cho đại số tuyến tính số, nhưng liệu bạn có thể làm cho nó hoạt động trong trường hợp của bạn hay không phụ thuộc vào các chi tiết. Làm thế nào lớn là ma trận bạn sẽ chạy nó trên? Những gì, chính xác, bạn cần phải làm gì? Bạn có thể muốn tham khảo sách như Công thức số để biết thông tin về triển khai. –

+0

Tôi muốn sử dụng SVD cho Phân tích ngữ nghĩa tiềm ẩn. Vì vậy, 100x100 sẽ không đủ cho ma trận, chúng sẽ rất lớn ... – caw

1

Có thể thực hiện được, nhưng việc triển khai SVD trong php không phải là cách tiếp cận tối ưu. Như bạn có thể thấy ở đây PHP chậm hơn C và cũng chậm hơn so với C++, vì vậy có lẽ tốt hơn nếu bạn có thể làm điều đó bằng một trong những ngôn ngữ này và gọi chúng như là một hàm để lấy kết quả của bạn. Bạn có thể tìm thấy việc thực hiện thuật toán here, vì vậy bạn có thể tự mình hướng dẫn.

Về sự kêu gọi chức năng có thể sử dụng:

  • exec() Chức năng

Chức năng hệ thống là khá hữu ích và mạnh mẽ, nhưng một trong những vấn đề lớn nhất với nó là tất cả các văn bản kết quả từ chương trình đi trực tiếp đến luồng đầu ra. Sẽ có những tình huống mà bạn có thể muốn định dạng văn bản kết quả và hiển thị văn bản theo một cách khác hoặc hoàn toàn không hiển thị nó.

  • Hệ thống() Chức năng

Chức năng hệ thống trong PHP có một đối số chuỗi với lệnh để thực hiện cũng như bất kỳ đối số bạn chúc các truyền cho lệnh đó. Hàm này thực hiện lệnh được chỉ định và đổ bất kỳ văn bản kết quả nào đến luồng đầu ra (hoặc đầu ra HTTP trong tình huống máy chủ web hoặc bảng điều khiển nếu bạn đang chạy PHP dưới dạng công cụ dòng lệnh). Sự trở lại của hàm này là dòng đầu ra cuối cùng từ chương trình, nếu nó phát ra đầu ra văn bản.

  • Các passthru() Chức năng

Một chức năng hấp dẫn mà PHP cung cấp tương tự như chúng ta đã thấy cho đến nay là chức năng passthru. Chức năng này, giống như các chức năng khác, thực hiện chương trình bạn yêu cầu. Tuy nhiên, sau đó, nó tiếp tục gửi ngay đầu ra thô từ chương trình này đến luồng đầu ra mà PHP hiện đang làm việc (tức là HTTP trong kịch bản máy chủ web hoặc trình bao trong phiên bản dòng lệnh của PHP).

+0

Cảm ơn bạn rất nhiều! :) – caw

+0

Bạn nên đề cập rằng bạn đã sao chép mô tả chức năng trực tiếp từ [ChipmunkNinja] (http://chipmunkninja.com/Program-Execution-in-PHP%[email protected]). – TachyonVortex

2

Tôi biết đây là một tuổi Q, nhưng đây là của tôi 2-bit:

1) Một SVD đúng là chậm hơn nhiều so với xấp xỉ calculus lấy cảm hứng từ được sử dụng, ví dụ, trong giải thưởng Netflix. Xem: http://www.sifter.org/~simon/journal/20061211.html

Có một thực hiện (trong C) ở đây: http://www.timelydevelopment.com/demos/NetflixPrize.aspx

2) C sẽ nhanh hơn nhưng PHP chắc chắn có thể làm điều đó.

Tác giả kiến ​​trúc sư PHP Cal Evans: "PHP là ngôn ngữ kịch bản web ... [nhưng] Tôi đã sử dụng PHP làm ngôn ngữ kịch bản để viết DOS tương đương với các tệp BATCH hoặc tương đương với các tập lệnh shell của Linux. đã thấy rằng hầu hết những gì tôi cần làm có thể được thực hiện từ bên trong PHP. Thậm chí còn có một dự án cho phép bạn xây dựng các ứng dụng máy tính để bàn thông qua PHP, dự án PHP-GTK. "

+0

Cảm ơn bạn rất nhiều! Thông tin và liên kết thú vị. – caw