प्रश्न
स्पार्क में प्रशिक्षित एएलएस मॉडल में नए उपयोगकर्ता के लिए रेटिंग की भविष्यवाणी कैसे करूं? (प्रशिक्षण समय के दौरान नया नहीं देखा गया)
समस्या
मैं यहाँ आधिकारिक स्पार्क ए एल एस ट्यूटोरियल का अनुसरण कर रहा हूँ:
http://ampcamp.berkeley.edu/big-data-mini-course/movie-recommendation-with-mllib.html
मैं एक अच्छे MSE के साथ एक अच्छे रेंडर का निर्माण करने में सक्षम हूं, लेकिन मॉडल के नए डेटा को कैसे इनपुट करना है, इसके साथ संघर्ष कर रहा हूं। ट्यूटोरियल पहले उपयोगकर्ता की रेटिंग को प्रशिक्षण से पहले बदल देता है, लेकिन यह वास्तव में एक हैक है। वे निम्नलिखित संकेत देते हैं:
9.2। मैट्रिक्स कारक बढ़ाना:
इस ट्यूटोरियल में, हम आपकी रेटिंग को प्रशिक्षण सेट में जोड़ते हैं। आपके लिए सिफारिशें प्राप्त करने का एक बेहतर तरीका है कि पहले एक मैट्रिक्स फैक्टरलाइज़ेशन मॉडल को प्रशिक्षित किया जाए और फिर अपनी रेटिंग का उपयोग करके मॉडल को बढ़ाया जाए। यदि यह आपके लिए दिलचस्प लगता है, तो आप MatrixFactorizationModel के कार्यान्वयन पर एक नज़र डाल सकते हैं और देख सकते हैं कि नए उपयोगकर्ताओं और नई फिल्मों के लिए मॉडल को कैसे अपडेट किया जाए।
हालांकि कार्यान्वयन मुझे बिल्कुल मदद नहीं करता है। आदर्श रूप में, मैं कुछ इस तरह की तलाश में हूँ:
predictions = model.predictAllNew(newinput)
लेकिन ऐसी कोई विधि मौजूद नहीं है। मैं मूल आरडीडी को जा सकता था और संशोधित कर सकता था, लेकिन मुझे लगता है कि मुझे मॉडल को फिर से अपनाने की आवश्यकता होगी, इसलिए यह एक आदर्श समाधान भी नहीं होगा। निश्चित रूप से एक और अधिक सुंदर तरीका होना चाहिए?
मैं अभी कहाँ हूँ:
मुझे लगता है कि मुझे नए वेक्टर के अव्यक्त प्रतिनिधित्व को खोजने की आवश्यकता है। मूल कागज के अनुसार हम इसकी गणना इस तरह कर सकते हैं:
लेकिन जब मैं कागज में मूल्यों का उपयोग करके गणना करता हूं, तो यह मॉडल से मूल्यों से मेल नहीं खाता। मैं अल्फा और नियमितीकरण पैरामीटर को ठीक करता हूं, लेकिन मुझे लगता है कि एमएलएलआईबी निहितार्थ एक अलग हैकार्यान्वयन। इसे यहाँ परिभाषित किया गया है (पंक्ति 1304 देखें), लेकिन स्काला में निपुण नहीं होना, यह मेरे लिए रिवर्स इंजीनियर के लिए बहुत कठिन है ...
मेरा वर्तमान प्रयास:
V = model.productFeatures().map(lambda x: (x[1])).collect() #product latent matrix Y
Cui = alpha * np.abs(newinput)
Cui = (1. + Cui) / (Cui)
Cui[np.where(newinput == 0)] = 0
Cui = np.diag(Cui)
lambdaI = len(np.where(newinput!=0)) * regularization_parameter * np.eye(np.shape(V)[1]) #
term = np.dot(np.dot(Vt,Cui),V)+lambdaI
term = np.dot(np.linalg.inv(term),Vt)
term = np.dot(term,Cui)
term = np.dot(term,newinput)
latentinput = term
लेकिन यह मेल नहीं खाता।