एक स्थानीयता संवेदनशील हैप को प्रवर्तित करना


10

मैं एक cosine स्थानीयता संवेदनशील हैश बनाने की कोशिश कर रहा हूँ ताकि मैं हर संभव जोड़ी की तुलना किए बिना आइटम के समान जोड़े पा सकता हूं। मेरे पास यह मूल रूप से काम कर रहा है, लेकिन मेरे डेटा में अधिकांश जोड़े -0.2 से +0.2 रेंज में ब्रह्मांडीय समानता रखते हैं, इसलिए मैं इसे काफी बारीक करने और कोसाइन 0.1 और इसके बाद के संस्करण के साथ चीजों को लेने की कोशिश कर रहा हूं।

मैं माइनिंग मैसिव डेटासेट्स अध्याय 3 पढ़ रहा हूं। यह एक स्थानीयता-संवेदनशील परिवार को प्रवर्तित करके उम्मीदवार जोड़ी चयन की सटीकता को बढ़ाने के बारे में बात करता है। मुझे लगता है कि मैं केवल गणितीय स्पष्टीकरण को समझने के बारे में हूं, लेकिन मैं यह देखने के लिए संघर्ष कर रहा हूं कि मैं इसे व्यावहारिक रूप से कैसे लागू करता हूं।

मेरे पास अब तक इस प्रकार है

  1. मेरे पास 1M उपयोगकर्ताओं के कुछ चयन से रेटिंग के साथ 1000 फिल्में हैं। प्रत्येक फिल्म को उपयोगकर्ता स्कोर (पंक्ति संख्या = उपयोगकर्ता आईडी, मूल्य = उपयोगकर्ता के स्कोर) के विरल वेक्टर द्वारा दर्शाया जाता है
  2. मैं एन यादृच्छिक वैक्टर का निर्माण करता हूं। वेक्टर की लंबाई फिल्म वैक्टर (यानी उपयोगकर्ताओं की संख्या) की लंबाई से मेल खाती है। वेक्टर मान +1 या -1 हैं। मैं वास्तव में अंतरिक्ष को बचाने के लिए इन वैक्टरों को बाइनरी के रूप में एन्कोड करता हूं, +1 से 1 मैप किया गया और 0 से -1 मैप किया गया
  3. मैं प्रत्येक फिल्म के लिए स्केच वैक्टर्स का निर्माण करता हूं, मूवी के प्रत्येक उत्पाद और एन रैंडम वैक्टर (या यों कहें, यदि मैं एन यादृच्छिक वैक्टरों को क्षैतिज रूप से और एक दूसरे के शीर्ष पर लेटकर मैट्रिक्स R बनाता हूं तो स्केच मूवी m के लिए R * m) है, फिर परिणामी वेक्टर में प्रत्येक तत्व का संकेत ले रहा है, इसलिए मैं + 1s और -1s की प्रत्येक फिल्म के लिए एक स्केच वेक्टर के साथ समाप्त होता हूं, जिसे फिर से मैं बाइनरी के रूप में एन्कोड करता हूं। प्रत्येक वेक्टर लंबाई N बिट्स है।
  4. आगे मैं निम्नलिखित करके ऐसे ही रेखाचित्रों की तलाश करता हूं
    1. मैं आर बिट्स के बी बैंड में स्केच वेक्टर को विभाजित करता हूं
    2. आर बिट्स के प्रत्येक बैंड एक संख्या है। मैं उस नंबर को बैंड नंबर के साथ जोड़ देता हूं और उस नंबर के नीचे हैश बकेट में मूवी जोड़ देता हूं। प्रत्येक फिल्म को एक से अधिक बाल्टी में जोड़ा जा सकता है।
    3. मैं तब प्रत्येक बाल्टी में देखता हूं। जो भी फिल्में एक ही बाल्टी में होती हैं, वे उम्मीदवार जोड़ियां होती हैं।

इसकी तुलना में 3.6.3 मिमी की तुलना में, मेरा AND चरण तब होता है जब मैं r बिट्स के बैंड को देखता हूं - फिल्मों की एक जोड़ी AND चरण को पार कर लेती है यदि r बिट्स का मान समान है। मेरा या कदम बाल्टी में होता है: फिल्में उम्मीदवार जोड़े हैं यदि वे दोनों किसी भी बाल्टी में हैं।

पुस्तक से पता चलता है कि मैं और अधिक और या चरणों को जोड़कर अपने परिणामों को "बढ़ा" सकता हूं, लेकिन मुझे इस बात का नुकसान है कि यह कैसे करना है क्योंकि व्यावहारिक रूप से आगे की परतों के लिए निर्माण प्रक्रिया की व्याख्या जोड़ीदार समानता की जांच करने के बजाय है बाल्टी नंबर के साथ आ रहा है।

क्या कोई मुझे यह समझने में मदद कर सकता है कि यह कैसे करना है?

जवाबों:


4

मुझे लगता है कि मैंने कुछ काम किया है। मूल रूप से मैं एक दृष्टिकोण की तलाश कर रहा हूं जो कि मानचित्र में काम करता है / प्रकार के वातावरण को कम करता है और मुझे लगता है कि यह दृष्टिकोण इसे करता है।

इसलिए,

  • मान लें कि मेरे पास r पंक्तियों के b बैंड हैं और मैं एक और AND स्टेज जोड़ना चाहता हूं, एक और c ANDs कहता हूं।
  • इसलिए b * r बिट्स के बजाय मुझे b * r * c बिट्स की हैश चाहिए
  • और मैं अपनी पिछली प्रक्रिया c बार, b * r बिट्स पर चलाता हूं
  • यदि x और y को इनमें से किसी भी प्रक्रिया के द्वारा एक उम्मीदवार जोड़ी के रूप में पाया जाता है, तो यह कुंजी के मान और (मान (x, y), 1) की कुंजी के रूप में ID (x, y) के tuple के साथ कुंजी और मान 1 का उत्सर्जन करता है।
  • सी प्रक्रियाओं के अंत में मैं इन जोड़ों को कुंजी और योग द्वारा समूहित करता हूं
  • सी के बराबर राशि वाला कोई भी जोड़ा (x, y) प्रत्येक सी राउंड में एक उम्मीदवार जोड़ा था, और इसलिए पूरी प्रक्रिया का एक उम्मीदवार जोड़ा है।

तो अब मेरे पास एक व्यावहारिक समाधान है, और मुझे बस इतना करने की ज़रूरत है कि क्या इस तरह के 3 चरणों का उपयोग करने से वास्तव में मुझे कम समग्र हैश बिट्स या बेहतर समग्र प्रदर्शन के साथ बेहतर परिणाम प्राप्त करने में मदद मिलेगी ...


0

मैं सिर्फ टिप्पणी की होगी, लेकिन मैं नहीं कर सकता। मैं एलएसएच में प्रवर्धन के एक व्यावहारिक उपचार की तलाश में हूं और जो आपने प्रस्तुत किया है वह बहुत मायने रखता है। मैं जो इकट्ठा करता हूं, उससे प्राथमिक हैश फ़ंक्शन होता है

(एक्स,v)={0अगर sgn(एक्सv)<01अन्य
कुछ यादृच्छिक वेक्टर के लिए v, और यह बन जाता है '(एक्स,मैं)=((एक्स,vमैं+1),,(एक्स,vमैं+आर)), और अंत में OR के बाद, "(एक्स,जे)=('(एक्स,आरजे),जे) या
"(एक्स,y)={1अगर "(एक्स,जे)="(y,जे) किसी के लिए जे[0,)0अन्य
अब आप / या का उपयोग कर सकते हैं "(एक्स,y)जैसा कि आप वर्णन करते हैं। फिर आप केवल और / या तार्किक बयानों के आधार पर उम्मीदवारों का चयन करेंगे; अब आप वास्तव में हैशिंग नहीं हैं। हैशिंग जारी रखने के लिए इस बिंदु पर, आपको मैपिंग की आवश्यकता होगी^:एसएस' डिब्बे का ऐसा है कि प्रत्येक वेक्टर केवल एक बार में प्रकट होता है एस', लेकिन ऐसा करने से झूठी सकारात्मकता और / या नकारात्मकता का परिचय होगा। हैश के लिए एक विचार न्यूनतम है"(एक्स,जे) सबके लिए जे (या सभी में न्यूनतम जे और सभी प्रत्यक्ष और अप्रत्यक्ष रूप से जुड़े हैं y)। दोनों स्पष्ट रूप से पूर्वाग्रह का परिचय देंगे। मैं इनमें से एक का प्रयास कर सकता हूं, हालांकि मुझे यकीन नहीं है कि एक यादृच्छिक और / या से हैश अगली बार के आसपास सार्थक होगा। लेकिन यादृच्छिक के एक समान वितरण पर विचार करनाv और बड़ी संख्या में प्रतिकृति, शायद?
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.