2015-04-25 5 views
6

का उपयोग करके समानता की गणना करने के बाद मैं आइटम-जोड़ी को पुनर्प्राप्त कैसे कर सकता हूं मुझे अपनी सिफारिश प्रणाली में "सभी जोड़ों की समानता" समस्या का सामना करना पड़ा है। this databricks blog के लिए धन्यवाद, ऐसा लगता है कि RowMatrix मदद करने के लिए आ सकता है।स्पार्क- RowMatrix

हालांकि, RowMatrix सार्थक पंक्ति सूचियों के बिना एक मैट्रिक्स प्रकार है, जिससे मैं नहीं जानता कि कैसे विशिष्ट आइटम मैं और जे

नीचे के लिए columnSimilarities(threshold) लागू करने के बाद समानता परिणाम पुनः प्राप्त करने के लिए क्या बारे में कुछ जानकारी है मैं कर रहा हूँ:

user::item::rating 

2) मैं एक RowMatrix जिसमें प्रत्येक का निर्माण:

1) मेरे डेटा फ़ाइल इस तरह प्रारूप के साथ Movielens से आता है विरल वेक्टर मैं इस आइटम मैं

val dataPath = ... 
val ratings: RDD[Rating] = sc.textFile(dataPath).map(_.split("::") match { 
    case Array(user, item, rate) => Rating(user.toInt, item.toInt, rate.toDouble) 
}) 
val rows = ratings.map(rating=>(rating.product, (rating.user, rating.rating))) 
    .groupByKey() 
    .map(p => Vectors.sparse(userAmount, p._2.map(r=>(r._1-1, r._2)).toSeq)) 

val mat = new RowMatrix(rows) 

val similarities = mat.columnSimilarities(0.5) 

अब मैं एक CoordinateMatrix similarities प्राप्त करने के लिए सभी उपयोगकर्ताओं की रेटिंग प्रतिनिधित्व करता है। मैं विशिष्ट आइटम i और j की समानता कैसे प्राप्त कर सकता हूं? हालांकि इसका उपयोग RDD[MatrixEntry] को पुनर्प्राप्त करने के लिए किया जा सकता है, मुझे यकीन नहीं है कि पंक्ति I और कॉलम jआइटम i और j से मेल खाता है या नहीं।

उत्तर

9

मुझे आपके जैसा ही समस्या आई है और इसे हल किया गया है।

  1. आपको नोट करना चाहिए कि कॉलम समरूपता() कॉलम वैक्टर की समानता को कॉल करना है। हालांकि, हमारी "पंक्तियां" हमेशा पंक्ति वैक्टर से बना है। तो आपको "पंक्तियों" का स्थानांतरण करना चाहिए, मान लें कि यह "tran_rows" है। फिर tran_rows.columnSimilarities की गणना करें()

  2. चीज़ तब आसान है। कॉलमसिमरिलिटीज(), इंडेक्स i और j के परिणामस्वरूप आइटम I और आइटम जे के अनुरूप है।

+0

एक चेतावनी यह है कि स्तंभ समानताएं() ऊपरी त्रिभुज कोऑर्डिनेट मैट्रिक्स देता है, इसलिए प्रविष्टियों में से केवल एक (i, j) या (j, i) मौजूद है। कौन सा मौजूद है इस पर निर्भर करता है कि मैं harthur

1

रोमैट्रिक्स कॉलम के बीच समानता की गणना कर सकता है। तो है कि आप ratings.map(rating=>(rating.user, (rating.product, rating.rating))).groupByKey() (और निम्नलिखित लाइनों तदनुसार)

निर्माण करने के लिए अपने दृष्टिकोण तो फिर तुम स्तंभों में उत्पादों की आईडी होगा पुनर्विचार करने के लिए और आप columnSimilarities().entries आह्वान product-from,product-to,score संरचना को पुनः प्राप्त कर सकते हैं।

यदि आपके पास उत्पाद आईडी में बड़े मूल्य हैं तो आपको शायद कृत्रिम सूचकांक मानों पर अपने मूल्यों को मैप करने की आवश्यकता होगी। जैसे यदि आपके पास ids: 1, 900000, 9000000 के साथ 3 उत्पाद हैं तो आपको इसे 0,1,2 पर मैप करने की आवश्यकता है और फिर समानताएं गणना करें। इस मैपिंग के बिना आप 0-9000000 उत्पादों के बीच समानता की गणना करेंगे, भले ही आपके पास बहुत कुछ न हो।

1

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