मैं सहयोगी फ़िल्टरिंग में SVD का उपयोग कैसे करूँ?


30

मैं थोड़ा उलझन में हूँ कि एसवीडी को सहयोगी फ़िल्टरिंग में कैसे उपयोग किया जाता है। मान लीजिए कि मेरे पास एक सामाजिक ग्राफ है, और मैं किनारों से एक आसन्न मैट्रिक्स का निर्माण करता हूं, तो एक एसवीडी ले लो (चलो नियमितीकरण, सीखने की दरों, दुर्लभता अनुकूलन आदि के बारे में भूल जाएं), मैं अपनी सिफारिशों को बेहतर बनाने के लिए इस एसवीडी का उपयोग कैसे करूं?

मान लीजिए कि मेरा सोशल ग्राफ इंस्टाग्राम के अनुरूप है, और मुझे सेवा में उपयोगकर्ताओं की सिफारिश करने की जिम्मेदारी सौंपी गई, जो केवल सामाजिक ग्राफ पर आधारित है। मैं सबसे पहले एक आसन्न मैट्रिक्स निर्माण करूँगा , SVD, , पहले eigenvalues ​​चुनें, फिर क्या? ( m × m ) A = U s V k (मीटर×मीटर)=यूरोंवीकश्मीर

मैं निश्चित रूप से एक नया सेट : फिर कोई क्या करता है?

यूnw~मीटर×कश्मीररोंnw~कश्मीर×कश्मीरवीnw~कश्मीर×मीटर

मैंने वेब पर देखा है, और अधिकांश लिंक एसवीडी की गणना पर ध्यान केंद्रित करते हैं, लेकिन कोई भी आपको यह नहीं बताता है कि इसके साथ क्या करना है। तो मुझे क्या करना चाहिए?


1
यह आपके प्रश्न का उत्तर दे सकता है: datascience.stackexchange.com/a/16523
avli

जवाबों:


7

हालांकि: शुद्ध वेनिला एसवीडी के साथ आपको मूल मैट्रिक्स को फिर से बनाने में समस्या हो सकती है, लापता वस्तुओं के लिए मूल्यों की भविष्यवाणी करने दें। इस क्षेत्र में उपयोगी नियम-प्रति-अंगूठे प्रति मूवी की औसत रेटिंग की गणना कर रहा है, और प्रत्येक उपयोगकर्ता / मूवी संयोजन के लिए इस औसत को घटा रहा है, अर्थात प्रत्येक उपयोगकर्ता से मूवी पूर्वाग्रह घटा रहा है। फिर यह अनुशंसा की जाती है कि आप एसवीडी चलाएं, और निश्चित रूप से, आपको इन पूर्वाग्रह मानों को कहीं न कहीं रिकॉर्ड करना होगा, ताकि रेटिंगों को फिर से बनाया जा सके या अज्ञात मूल्यों की भविष्यवाणी की जा सके। मैं सिफारिशों के लिए SVD पर साइमन फंक की पोस्ट पढ़ूंगा - उन्होंने Netflix प्रतियोगिता के दौरान एक वृद्धिशील SVD दृष्टिकोण का आविष्कार किया।

http://sifter.org/~simon/journal/20061211.html

मुझे लगता है कि SVD से पहले मैट्रिक्स A को गिराने से समझ में आता है, क्योंकि SVD के करीबी चचेरे भाई PCA भी इसी तरह से काम करते हैं। वृद्धिशील संगणना के संदर्भ में, फंक ने मुझे बताया कि यदि आप अवनत नहीं करते हैं, तो पहले ढाल दिशा शेष अभिकलन पर हावी है। मैंने इस फर्स्टहैंड को देखा है, मूल रूप से बिना चीजों को गिराए काम नहीं करता है।


24

मैं असहमतिपूर्ण राय देना चाहूंगा:

लापता मूल्यों के रूप में लापता किनारों

एक सहयोगी फ़िल्टरिंग समस्या में, जो कनेक्शन मौजूद नहीं हैं (उपयोगकर्ता ने आइटम j का मूल्यांकन नहीं किया है , व्यक्ति x ने व्यक्ति y को मित्र नहीं बनाया है ) को आम तौर पर शून्य मानने के बजाय, गायब होने वाले मानों के रूप में माना जाता है । यही है, अगर उपयोगकर्ता i ने आइटम j रेट नहीं किया है, तो हम यह अनुमान लगाना चाहते हैं कि यदि उसने रेट किया था तो वह उसे क्या रेट कर सकता है। यदि व्यक्ति x ने y को मित्र नहीं बनाया है , तो हम अनुमान लगाना चाहते हैं कि यह कितनी संभावना है कि वह उसे मित्र बनाना चाहेगा । सिफारिशें पुनर्गठित मूल्यों पर आधारित हैं।मैंjएक्सyमैंjएक्सy

जब आप सामाजिक ग्राफ का SVD लेते हैं (उदाहरण के लिए, इसे प्लग इन करें svd()), तो आप मूल रूप से उन सभी गायब स्थानों में शून्य लगा रहे हैं। सहयोगी फ़िल्टरिंग के लिए उपयोगकर्ता-आइटम-रेटिंग सेटअप में यह अधिक स्पष्ट है। यदि मेरे पास लापता प्रविष्टियों को मज़बूती से भरने का एक तरीका है, तो मुझे एसवीडी का उपयोग करने की आवश्यकता नहीं होगी। मैं सिर्फ प्रविष्टियों में भरे के आधार पर सिफारिशें दूंगा। यदि मेरे पास ऐसा करने का कोई तरीका नहीं है, तो मुझे SVD करने से पहले उन्हें नहीं भरना चाहिए। *

लापता मान के साथ एसवीडी

बेशक, svd()फ़ंक्शन लापता मूल्यों के साथ सामना करने का तरीका नहीं जानता है। तो, वास्तव में आप क्या करने वाले हैं? खैर, समस्या को फिर से समझने का एक तरीका है

"रैंक का मैट्रिक्स खोजें जो मूल मैट्रिक्स के सबसे करीब है"कश्मीर

यह वास्तव में समस्या है जिसे आप हल करने की कोशिश कर रहे हैं, और आप svd()इसे हल करने के लिए उपयोग नहीं करने जा रहे हैं । मेरे लिए (नेटफ्लिक्स पुरस्कार डेटा पर) काम करने का एक तरीका यह था:

  • , एक साधारण मॉडल के साथ प्रविष्टियों फिट करने के लिए प्रयास करें एक्स मैं , जे = μ + α मैं + β जे । यह वास्तव में एक अच्छा काम करता है।एक्स^मैं,j=μ+αमैं+βj

  • प्रत्येक उपयोगकर्ता निर्दिष्ट करें एक कश्मीर -vector यू मैं और प्रत्येक आइटम जे एक कश्मीर -vector वी जे । (आपके मामले में, प्रत्येक व्यक्ति को एक दाएं और बाएं हो जाता है कश्मीर -vector)। आप अंततः डॉट उत्पादों के रूप में बच भविष्यवाणी कर दिया जाएगा: Σ यू मैं हूँ वी जे मीटरमैंकश्मीरयूमैंjकश्मीरvjकश्मीरΣयूमैंमीटरvjमीटर

  • वैक्टर को खोजने के लिए कुछ एल्गोरिदम का उपयोग करें जो मूल मैट्रिक्स की दूरी को कम करते हैं। उदाहरण के लिए, इस कागज का उपयोग करें

शुभकामनाएँ!

*: तेनाली जो सिफारिश कर रहा है वह मूल रूप से निकटतम पड़ोसी है। आप उन उपयोगकर्ताओं को खोजने का प्रयास करते हैं जो समान हैं और उस पर सिफारिशें करते हैं। दुर्भाग्य से, स्पार्सिटी की समस्या (मैट्रिक्स का ~ 99% मूल्य गायब है) को कोसाइन दूरी या जैक्सकार्ड समानता या जो भी हो, का उपयोग करके निकटतम पड़ोसियों को ढूंढना मुश्किल बनाता है । इसलिए, वह मैट्रिक्स के एक SVD (लापता मूल्यों पर लगाए गए शून्य के साथ) करने की सलाह दे रहा है ताकि पहले उपयोगकर्ताओं को एक छोटे फीचर स्पेस में संपीड़ित किया जा सके और फिर वहाँ तुलना की जा सके। एसवीडी-निकटतम-पड़ोसी करना ठीक है, लेकिन मैं अभी भी एसवीडी को सही तरीके से करने की सलाह दूंगा (मेरा मतलब है ... मेरा तरीका)। निरर्थक मूल्य प्रतिरूपण करने की आवश्यकता नहीं है!


यह वास्तव में प्रतिक्रिया थी जिसे मैं ढूंढ रहा था, और सुनना चाहता था :) बहुत बहुत धन्यवाद!
विशाल

अजीब तरह से पूछे गए सवाल "मैंने वेब पर देखा है, और अधिकांश लिंक एसवीडी की गणना करने पर ध्यान केंद्रित करते हैं, लेकिन कोई भी आपको बताता है कि इसके साथ क्या करना है। तो मुझे क्या करना चाहिए?" या उस बात के लिए शीर्षक कहता है, "मैं सहयोगी फ़िल्टरिंग में SVD का उपयोग कैसे करूँ?"
तेनालीरामन

हां, और मेरे जवाब ने संक्षेप में बताया कि मैं इसे सहयोगी फ़िल्टरिंग में कैसे उपयोग करता हूं।
स्टम्पी जो पीट

1
+1, जैसा कि मैं समझता हूं, आप SVD का उपयोग करके निम्न रैंक मैट्रिक्स की गणना नहीं कर रहे हैं, लेकिन चुकता त्रुटि को कम करने के लिए एक पुनरावृत्ति विधि है, है ना? हालांकि, अगर मैं SVD का उपयोग करना चाहता हूं, तो मुझे मैट्रिक्स फैक्टराइजेशन करने से पहले कुछ मूल्यों के साथ लापता प्रविष्टियों को भरना चाहिए, है ना?
एवोकैडो

1
रोंv()

14

कारण कोई भी आपको नहीं बताता है कि इसके साथ क्या करना है क्योंकि यदि आप जानते हैं कि एसवीडी क्या करता है, तो यह थोड़ा स्पष्ट है कि इसके साथ क्या करना है :-)।

चूँकि आपकी पंक्तियाँ और स्तंभ समान हैं, इसलिए मैं इसे एक भिन्न मैट्रिक्स A के माध्यम से समझाऊंगा। मैट्रिक्स A को ऐसा होने दें कि पंक्तियाँ उपयोगकर्ता हैं और स्तंभ वे आइटम हैं जिन्हें उपयोगकर्ता पसंद करता है। ध्यान दें कि इस मैट्रिक्स को सममित होने की आवश्यकता नहीं है, लेकिन आपके मामले में, मुझे लगता है कि यह सममित निकला है। एसवीडी के बारे में सोचने का एक तरीका इस प्रकार है: एसवीडी एक छिपी हुई सुविधा स्थान पाता है जहां उपयोगकर्ता और उनके द्वारा पसंद किए जाने वाले आइटम में फीचर वैक्टर होते हैं जो बारीकी से संरेखित होते हैं।

A=U×s×VUवी

अब, यदि मैं आपको एक ही सुविधा स्थान से दो वैक्टर देता हूं और आपको यह पता लगाने के लिए कहता हूं कि क्या वे समान हैं, तो सबसे सरल बात क्या है जिसे आप पूरा करने के लिए सोच सकते हैं? डॉट उत्पाद।

मैंjमैंयूj


दो प्रश्न: 1) क्या आप एसवीडी चलाने से पहले जीरो के साथ लापता मान (उपयोगकर्ता द्वारा समीक्षा नहीं की गई आई) को भरते हैं? 2) आप कैसे गणना करते हैं कि कोई नया उपयोगकर्ता आइटम j को पसंद करेगा?
B_Miner

1
@B_Miner हाय, विलंबित प्रतिक्रिया के लिए खेद है। जवाब: 1) हां, हां, हम आमतौर पर एसवीडी चलाने से पहले लापता मानों को शून्य से भरते हैं। हालांकि, मैं आमतौर पर इसे गैर-शून्य रेटिंग के साथ भरने की सलाह देता हूं - उदाहरण के लिए, आप औसत रेटिंग द्वारा लापता मूल्यों को भर सकते हैं जो उपयोगकर्ता ने अब तक दिया है। 2) SVD- आधारित दृष्टिकोण केवल ज्ञात उपयोगकर्ताओं और ज्ञात वस्तुओं के लिए है। यह नए उपयोगकर्ताओं या नई वस्तुओं को संभाल नहीं सकता है। और यह कैसे हो सकता है, अगर कोई नया उपयोगकर्ता आता है, तो हम इस रूपरेखा के बारे में भविष्यवाणी करने के लिए उसके बारे में कुछ भी नहीं जानते हैं।
तेनालीरमन

1
@B_Miner यदि आप नए उपयोगकर्ता / आइटम के साथ काम करना चाहते हैं, तो हमें यह मान लेना होगा कि हमारे पास कुछ उपयोगकर्ता सुविधाओं और आइटम सुविधाओं तक पहुंच है। फिर, आप PDLF (प्रेडिक्टिव डिसक्रीट लेंट फैक्टर मॉडल) जैसे अधिक परिष्कृत मॉडल का उपयोग कर सकते हैं। यह आपको नए उपयोगकर्ताओं / वस्तुओं को संभालने की अनुमति देगा क्योंकि यह एक ज्ञात सुविधा स्थान के साथ काम करता है।
तेनालीरमन

@TenaliRaman यकीन नहीं है कि आप इसे देखेंगे, लेकिन यहाँ जाता है। इसलिए मैं विषय मॉडल (LDA) का उपयोग उन उपयोगकर्ताओं (शाब्दिक उपयोगकर्ताओं) के लिए फीचर बनाने के लिए कर रहा हूँ जो उन्होंने पढ़े हैं। मैं केवल "उपयोगकर्ता-विषय वेक्टर" प्राप्त करने के लिए विषय वैक्टर औसत करता हूं। मैं एसवीडी (या एएलएस संभवतः) के साथ कुछ ऐसा ही करना चाहता हूं। मान लें कि मैं ज्ञात उपयोगकर्ता-आइटम डेटा का उपयोग करके एसवीडी की गणना करता हूं, और फिर मेरे पास नए उपयोगकर्ता हैं जो कई ज्ञात वस्तुओं को "विज़िट" करते हैं। इस मामले में आइटम वैक्टर ज्ञात हैं लेकिन उपयोगकर्ता वैक्टर अज्ञात हैं। क्या मैं उपयोगकर्ता वेक्टर की गणना करने के लिए आइटम वैक्टर का उपयोग कर सकता हूं या क्या मुझे सभी डेटा का उपयोग करके एसवीडी को फिर से गणना करने की आवश्यकता है?
thecity2

महान जवाब तेनाली। अवधारणा को समझने के लिए बहुत उपयोगी है
निहल

3

यह उन लोगों के लिए "कैसे" सवाल का हिस्सा है, जो व्यावहारिक रूप से विरल-एसवीडी सिफारिशों को लागू करना चाहते हैं या विवरण के लिए स्रोत कोड का निरीक्षण करना चाहते हैं। आप विरल-एसवीडी को मॉडल करने के लिए एक ऑफ-द-शेल्फ FOSS सॉफ्टवेयर का उपयोग कर सकते हैं। उदाहरण के लिए, vowpal wabbit, libFM, या redsvd

vowpal wabbit"एसवीडी-जैसे" एल्गोरिदम के 3 कार्यान्वयन हैं (प्रत्येक 3 कमांड लाइन विकल्पों में से एक का चयन करने योग्य)। स्पष्ट रूप से इन्हें बोलने वाले को शुद्ध "क्लासिक" एसवीडी के बजाय "अनुमानित, पुनरावृत्ति, मैट्रिक्स का कारक" कहा जाना चाहिए, लेकिन वे एसवीडी से निकटता से संबंधित हैं। आप शायद ही कभी एक विरल के बहुत कम्प्यूटेशनल-कुशल अनुमानित एसवीडी-कारक के रूप में सोच सकते हैं। शून्य) मैट्रिक्स।

यहां नेटफ्लिक्स स्टाइल मूवी की सिफारिशों के साथ काम करने के लिए एक पूर्ण, नुस्खा है vowpal wabbitऔर इसके "कम रैंक वाले क्वाड्रेटिक" ( --lrq) विकल्प जो मेरे लिए सबसे अच्छा काम करते हैं:

डेटा सेट प्रारूप फ़ाइल ratings.vw(उपयोगकर्ता और फिल्म द्वारा एक पंक्ति पर प्रत्येक रेटिंग):

5 |user 1 |movie 37
3 |user 2 |movie 1019
4 |user 1 |movie 25
1 |user 3 |movie 238
...

जहां 1 नंबर रेटिंग (1 से 5 स्टार) है, जिसके बाद रेट करने वाले यूजर की आईडी और मूवी आईडी को रेट किया गया है।

परीक्षण डेटा एक ही प्रारूप में है, लेकिन (वैकल्पिक रूप से) रेटिंग कॉलम को छोड़ सकते हैं:

 |user 1 |movie 234
 |user 12 |movie 1019
...

वैकल्पिक रूप से क्योंकि भविष्यवाणियों का मूल्यांकन / परीक्षण करने के लिए हमें भविष्यवाणियों की तुलना करने के लिए रेटिंग की आवश्यकता होती है। यदि हम रेटिंग्स को छोड़ देते हैं, तब vowpal wabbitभी रेटिंग का अनुमान लगा लेंगे , लेकिन भविष्यवाणी की त्रुटि (डेटा में वास्तविक मान बनाम भविष्यवाणी की गई) का अनुमान लगाने में सक्षम नहीं होंगे।

प्रशिक्षित करने के लिए हम उपयोगकर्ताओं और उनकी पसंद (या नापसंद) के बीच अव्यक्त अंतःक्रियात्मक कारकों vowpal wabbitका एक समूह खोजने के लिए कहते हैं N। आप इसके बारे में सामान्य विषयों को खोजने के बारे में सोच सकते हैं जहां समान उपयोगकर्ता समान तरीके से फिल्मों का एक सबसेट रेट करते हैं और इन सामान्य विषयों का उपयोग करके यह अनुमान लगाते हैं कि उपयोगकर्ता किसी फिल्म को कैसे रेट करेगा जो उसने अभी तक रेट नहीं किया है।

vw विकल्प और तर्क जिनका हमें उपयोग करने की आवश्यकता है:

  • --lrq <x><y><N> "कम रैंक वाले द्विघात" अव्यक्त-कारकों को ढूँढता है।
  • <x><y>: "um" का अर्थ है डेटा सेट में u [sers] और m [ovie] नाम-रिक्त स्थान को पार करना। ध्यान दें कि प्रत्येक नाम-स्थान में केवल 1 अक्षर का उपयोग --lrqविकल्प के साथ किया जाता है ।
  • <N>: N=14नीचे अव्यक्त कारकों की संख्या है जिसे हम खोजना चाहते हैं
  • -f model_filename: फाइनल मॉडल में लिखें model_filename

तो एक सरल पूर्ण प्रशिक्षण कमान होगी:

    vw --lrq um14 -d ratings.vw -f ratings.model

एक बार हमारे पास ratings.modelमॉडल फ़ाइल होने के बाद, हम इसका उपयोग नए डेटा-सेट पर अतिरिक्त रेटिंग की भविष्यवाणी करने के लिए कर सकते हैं more_ratings.vw:

    vw -i ratings.model -d more_ratings.vw -p more_ratings.predicted

भविष्यवाणियों को फ़ाइल में लिखा जाएगा more_ratings.predicted

स्रोत ट्री demo/movielensमें उपयोग करते हुए vowpalwabbit, मुझे ml-1m.ratings.train.vw14 अव्यक्त-कारकों (जिसका अर्थ है कि SVD मध्य मैट्रिक्स एक 14x14 पंक्तियों x कॉलम मैट्रिक्स है) और स्वतंत्र पर परीक्षण के साथ 1 मिलियन उपयोगकर्ता / मूवी रेटिंग पर प्रशिक्षण के बाद ~ 0.693 MAE (मतलब निरपेक्ष त्रुटि) मिलता है। परीक्षण-सेट ml-1m.ratings.test.vw। 0.69 MAE कितना अच्छा है? संभावित भविष्यवाणियों की पूरी श्रृंखला के लिए, जिसमें अनरेटेड (0) केस [0 से 5] शामिल है, 0.69 त्रुटि पूर्ण रेंज की ~ 13.8% (0.69 / 5.0) है, यानी लगभग 86.2% सटीकता (1 - 0.138)।

आप उदाहरण और एक समान डेटा-सेट (movielens) के लिए एक पूर्ण डेमो जीथब vowpal wabbitपर स्रोत के पेड़ में प्रलेखन के साथ पा सकते हैं :

टिप्पणियाँ:

  • movielensडेमो कई विकल्प मैं छोड़े गए (सादगी के लिए) मेरे उदाहरण से उपयोग करता है: विशेष रूप से --loss_function quantile, --adaptiveहै, और--invariant
  • --lrqमें कार्यान्वयन vwबहुत तेजी से है --rankजब भंडारण और मॉडल लोड हो रहा है, विशेष रूप से।

क्रेडिट:

  • --rank vw विकल्प जेक हॉफमैन द्वारा लागू किया गया था
  • --lrq vw विकल्प (वैकल्पिक ड्रॉपआउट के साथ) पॉल मिनेरो द्वारा लागू किया गया था
  • vowpal wabbit (उर्फ vw) जॉन लैंगफोर्ड का मस्तिष्क बच्चा है

1

मैं कहूंगा कि नाम SVDभ्रामक है। वास्तव में, SVDसिफारिश प्रणाली में विधि सीधे एसवीडी कारक का उपयोग नहीं करती है। इसके बजाय, यह गैसों और कारक वैक्टर को प्रशिक्षित करने के लिए स्टोकेस्टिक ग्रेडिएंट वंश का उपयोग करता है।

सिफारिश प्रणाली के लिए SVDऔर SVD++एल्गोरिदम का विवरण अनुभागों 5.3.1और 5.3.2पुस्तक में पाया जा सकता है Francesco Ricci, Lior Rokach, Bracha Shapira, and Paul B. Kantor. Recommender Systems Handbook. 1st edition, 2010

पायथन में, इन एल्गोरिदम नाम के एक अच्छी तरह से स्थापित पैकेज को लागू किया गया है surprise। अपने प्रलेखन में , वे इन एल्गोरिदम के विवरण का भी उल्लेख करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.