سسيبي-كيفية زيادة تحسين كود المصفوفة المتفرقة لنزول التدرج العشوائي
-
21-12-2019 - |
سؤال
أنا أعمل على تنفيذ خوارزمية النسب التدرج العشوائية لأنظمة المزكي باستخدام المصفوفات متفرق مع سسيبي.
هذه هي الطريقة التي يبدو بها التنفيذ الأساسي الأول:
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، يمكنك إحضار الصف والعمود المحدد إلى ذاكرة الوصول العشوائي في كل خطوة ثم القيام بحسابك.