سؤال

أود تنفيذ تحلل القيمة المفرد (SVD) في PHP. أعلم أن هناك العديد من المكتبات الخارجية التي يمكن أن تفعل هذا بالنسبة لي. ولكن لدي سؤالان يتعلق ب PHP، على الرغم من: 1) هل تعتقد أنه ممكن و / أو معقول لرمز SVD في PHP؟ 2) إذا كان (1) نعم: هل يمكنك مساعدتي في كوده في PHP؟

لقد ترمز بالفعل بعض أجزاء SVD بنفسي. إليك الرمز التي قدمتها تعليقات على مسار العمل فيها. بعض أجزاء هذا الرمز ليست صحيحة تماما.

سيكون رائعا إذا كنت تستطيع مساعدتي. شكرا جزيلا لك مقدما!

هل كانت مفيدة؟

المحلول

SVD-Python هو تطبيق واضح للغاية ومخلل من SVD. إنه عمليا PSEDocode وينبغي أن يكون من السهل إلى حد ما فهم ومقارنة / تعلق لتنفيذ PHP الخاص بك، حتى لو كنت لا تعرف الكثير من الثعبان.

SVD-Python.

ومع ذلك، كما ذكر آخرون أنني لن أتوقع أن أكون قادرا على القيام ب LSA شديد التحمل مع تنفيذ PHP ما يبدو وكأنه مضيف ويب محدود جدا.

هتافات

تحرير: الوحدة أعلاه لا تفعل أي شيء في حد ذاته، ولكن هناك مثال مضمن في التعليقات الافتتاحية. على افتراض أنك قمت بتنزيل وحدة بيثون، وتمكن من الوصول (على سبيل المثال في نفس المجلد)، يمكنك تنفيذ مثال تافهة على النحو التالي،

#!/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" تحتوي على قائمة القيم المفردة الخاصة بك.
بالطبع هذا يجعلك فقط جزءا من الطريق إلى التحليل الدلالي الكامن وأقاربها. عادة ما تريد تقليل عدد القيم المفرد، ثم استخدم بعض المقياس المسافة المناسبة لقياس التشابه بين المستندات أو الكلمات أو الوثائق والكلمات، إلخ.

رسم الخرائط الدلالية الكامنة (PDF)

هو أقرب ورقة أوضح وأكثر إيجازا و إعلامة قرأت على الخطوات المتبقية التي تحتاجها للعمل بعد SVD.

Edit2: لاحظ أيضا أنه إذا كنت تعمل مع مصفوفات وثيقة كبيرة جدا (أفترض أن هذا هو ما تفعله)، فسيكون من المؤكد أنه سيكون أكثر فعالية تقريبا لأداء التحلل في وضع دون اتصال، ثم أداء فقط المقارنات بطريقة حية استجابة للطلبات. في حين أن SVD-Python رائع للتعلم، فإن SVDLIBC أكثر ما تريده لهذه الحسابات الثقيلة.

أخيرا كما ذكر في ورق Bellegarda أعلاه، تذكر أنك لست مضطرا لتعزيز SVD كل مرة تحصل على وثيقة أو طلب جديد. اعتمادا على ما تحاوله القيام به ربما يمكنك الابتعاد عن أداء SVD مرة واحدة كل أسبوع أو نحو ذلك، في وضع غير متصل بالإنترنت، آلة محلية، ثم قم بتحميل النتائج (المسيح / المشغل النطاق الترددي على الرغم من ذلك).

حظا سعيدا على أي حال!

نصائح أخرى

كن حذرا عندما تقول "لا يهمني ما هي الحدود الزمنية". SVD هو O(N^3) العملية (أو O(MN^2) إذا كان مستطيلا m*n Matrix) مما يعني أنه يمكنك بسهولة أن تكون في موقف يمكن أن تستغرق مشكلتك وقتا طويلا جدا. إذا استغرقت الحالة 100 * 100 دقيقة واحدة، فستكون القضية 1000 * 1000 من 10 ^ 3 دقائق، أو ما يقرب من 17 ساعة (وربما أسوأ، من غير المحتمل أن تكون خارج ذاكرة التخزين المؤقت). مع شيء مثل PHP، المساواة - الرقم يتضاعف N^3 من أجل حساب عدد التغذية المطلوب، يمكن أن يكون كبير جدا جدا.

بعد القول، بالطبع من الممكن إدراجها في PHP - اللغة لديها هياكل البيانات والعمليات المطلوبة.

أعلم أن هذا سؤال قديم، لكن ها 2 بت:

1) SVD حقيقي أبطأ بكثير من التقديرات المستوحاة من حساب التفاضل والتكامل المستخدمة، على سبيل المثال، في جائزة Netflix. يرى: http://www.sifter.org/~simon/journal/20061211.html.

هناك تنفيذ (في ج) هنا:http://www.timelydevelopment.com/demos/netflixprize.aspx.

2) C سيكون أسرع ولكن PHP يمكن أن تفعل ذلك بالتأكيد.

PHP Architect Cook Cal Evans: "PHP هي لغة نصية ويب ... [ولكن] استخدمت PHP ككلغة نصية لكتابة DOS المكافئ لملفات الدفعات أو ما يعادل Linux من البرامج النصية Shell. لقد وجدت أن معظم ما أحتاج إليه يمكن تحقيقه من داخل PHP. هناك حتى مشروع يسمح لك ببناء تطبيقات سطح المكتب عبر PHP، مشروع PHP-GTK. "

فيما يتعلق بالسؤال 1: بالتأكيد ممكن. سواء كان ذلك معقولا يعتمد على السيناريو الخاص بك: ما حجم المصفوفات الخاصة بك؟ كم مرة تنوي تشغيل الكود؟ هل يعمل في موقع ويب أو من سطر الأوامر؟ إذا كنت تهتم بالسرعة، أود أن أقترح كتابة امتداد بسيط أن يلتف يدعو إلى مكتبة جنو العلمية.

نعم إنه من الممثل، لكن تنفيذ SVD في PHP ليس له النهج الأمثل. كما ترى هنا PHP أبطأ من C وأيضا أبطأ من C ++، لذلك ربما كان من الأفضل أن تفعل ذلك في إحدى هذه اللغات واتصل بها كدالة للحصول على نتائجك. يمكنك العثور على تنفيذ الخوارزمية هنا, ، لذلك يمكنك توجيه نفسك من خلال الحوض.

حول الدالة استدعاء يمكن استخدامها:

  • وظيفة exec ()

وظيفة النظام مفيدة للغاية وقوية للغاية، ولكن واحدة من أكبر المشكلات معها هي أن جميع النص الناتج من البرنامج يذهب مباشرة إلى دفق الإخراج. ستكون هناك مواقف حيث قد ترغب في تهيئة النص الناتج وعرضها بطريقة مختلفة، أو لا تعرضها على الإطلاق.

  • النظام () وظيفة

تأخذ وظيفة النظام في PHP وسيطة سلسلة مع الأمر لتنفيذ وكذلك أي حجج ترغب في تمريرها إلى هذا الأمر. تنفذ هذه الوظيفة الأمر المحدد، ومخلص من أي نص ناتج إلى دفق الإخراج (إما إخراج HTTP في موقف خادم الويب، أو وحدة التحكم إذا كنت تقوم بتشغيل PHP كأداة لسطر الأوامر). يعد عودة هذه الوظيفة هو السطر الأخير من الإخراج من البرنامج، إذا كان ينبعث من إخراج النص.

  • وظيفة passthru ()

وظيفة رائعة واحدة توفر PHP مشابهة لتلك التي رأيناها حتى الآن هي وظيفة Passthru. هذه الوظيفة، مثل الآخرين، تنفذ البرنامج الذي تخبره به. ومع ذلك، فإنه يتبع بعد إرسال الإخراج الخام على الفور من هذا البرنامج إلى دفق الإخراج الذي يعمل به PHP حاليا (أي إما HTTP في سيناريو خادم الويب، أو Shell في إصدار سطر الأوامر من PHP).

  1. نعم. هذا ممكن تماما أن تنفذ في PHP. لا أعرف ما هو الإطار الزمني المعقول للتنفيذ وكيف يمكن أن يحسب حجمه. ربما يجب أن أقوم بتنفيذ الخوارزمية للحصول على فكرة مشقوقة.

  2. نعم يمكنني مساعدتك في كوده. ولكن لماذا تحتاج إلى مساعدة؟ لا الكود الذي كتبته العمل؟

فقط سؤال جانبا. ما هو إصدار PHP الذي تستخدمه؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top