سسيبي-كيفية زيادة تحسين كود المصفوفة المتفرقة لنزول التدرج العشوائي

StackOverflow https://stackoverflow.com//questions/20032353

سؤال

أنا أعمل على تنفيذ خوارزمية النسب التدرج العشوائية لأنظمة المزكي باستخدام المصفوفات متفرق مع سسيبي.

هذه هي الطريقة التي يبدو بها التنفيذ الأساسي الأول:

    N = self.model.shape[0] #no of users
    M = self.model.shape[1] #no of items
    self.p = np.random.rand(N, K)
    self.q = np.random.rand(M, K)
    rows,cols = self.model.nonzero()        
    for step in xrange(steps):
        for u, i in zip(rows,cols):
            e=self.model-np.dot(self.p,self.q.T) #calculate error for gradient
            p_temp = learning_rate * ( e[u,i] * self.q[i,:] - regularization * self.p[u,:])
            self.q[i,:]+= learning_rate * ( e[u,i] * self.p[u,:] - regularization * self.q[i,:])
            self.p[u,:] += p_temp

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

هل لديك أي مؤشرات حول كيف يمكنني تجنب التكرار على صفوف وأعمدة المصفوفة المتفرقة بشكل صريح?

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

المحلول

لقد نسيت تقريبا كل شيء عن أنظمة التوصية ، لذلك قد أترجم شفرتك عن طريق الخطأ ، لكنك تعيد تقييمها self.model-np.dot(self.p,self.q.T) داخل كل حلقة ، بينما أنا مقتنع تقريبا أنه يجب تقييمها مرة واحدة في كل خطوة.

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

for step in xrange(steps):
    e = self.model - np.dot(self.p, self.q.T)
    p_temp = learning_rate * np.dot(e, self.q)
    self.q *= (1-regularization)
    self.q += learning_rate*(np.dot(e.T, self.p))
    self.p *= (1-regularization)
    self.p += p_temp

نصائح أخرى

هل أنت متأكد أنك تنفذ SGD؟لأنه في كل خطوة، يجب عليك حساب الخطأ في تصنيف مستخدم واحد واحد، وليس خطأ مصفوفة تصنيف جميع أو ربما لا أستطيع فهم هذا الخط من التعليمات البرمجية الخاصة بك:

giveacodicetagpre.

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

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