2011-06-30 14 views
5

मेरे पास पहले से ही इलाके-संवेदनशील हैश बनाने के लिए एल्गोरिदम है, लेकिन मुझे उनकी विशेषताओं का लाभ उठाने के लिए उन्हें कैसे बाल्टी करना चाहिए (यानी इसी तरह के तत्वों के पास हैश (हैमिंग दूरी के साथ) है?इलाके-संवेदनशील हैश कैसे बाल्टी करें?

मैटलैब कोड में मैंने पाया कि वे कोड को सरल बनाने के लिए बिंदुओं के हैंश के बीच एक दूरी मैट्रिक्स बनाते हैं, ताकि कोड को सरल बनाने के लिए, एक वास्तव में अच्छे के लिए एक तथाकथित चरिकार विधि का संदर्भ देते हुए खोज विधि का कार्यान्वयन।

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

यह सवाल किसी भी तरह व्यापक है: http://www.eecs.berkeley.edu/~kulis/klsh/klsh.htm

+0

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

+0

यह सब एक स्पष्ट अनुकूलन को ध्यान में रखते हुए, जो बिट्स के बारे में बात कर रहा है, वे या तो 0 या 1 हैं, इसलिए आपको उन्हें दोनों को सूचीबद्ध करने की ज़रूरत नहीं है (यानी, यदि आप उन लोगों को सूचीबद्ध करते हैं जिनके पास बिट सेट है, इसका मतलब है कि अन्य सभी नहीं हैं)। – user823699

+0

यदि आपकी टिप्पणियां आपके स्वयं के प्रश्न का उत्तर देती हैं, तो क्या आप उन्हें एक उत्तर के रूप में पोस्ट कर सकते हैं और इसे स्वीकार कर सकते हैं (जो आप कर सकते हैं, मुझे लगता है, दो दिनों के बाद)? इस तरह अन्य लोग समस्या को आसानी से हल कर सकते हैं ... –

उत्तर

0

के आधार पर:: Search in locality sensitive hashing मैं इस कहेंगे, Similarity Estimation Techniques from Rounding Algorithms पढ़ने के बाद

इस बारे में मैं बात कर रहा हूँ matlab कोड के साथ पृष्ठ का लिंक है इसलिए मैं यहां एक न्यूनतम (सार) उदाहरण देने जा रहा हूं:

हमारे पास d बिट्स के साथ हमारे डेटासेट में 6 (= n) वैक्टर हैं। आइए मान लें कि हम 2 (= N) यादृच्छिक क्रमपरिवर्तन करते हैं।

1 यादृच्छिक क्रमपरिवर्तन शुरू करें! याद रखें कि हम बिट्स, वेक्टर के आदेश की अनुमति नहीं देते हैं। बिट्स permuting के बाद, वे उदाहरण के लिए एक व्यवस्था बनाए रखने,:

v1 
v5 
v0 
v3 
v2 
v4 

अब क्वेरी वेक्टर, q, आता है, लेकिन यह है (लगभग) संभावना नहीं है कि हमारे डेटासेट में वेक्टर के साथ ही होने जा रहा है (क्रमपरिवर्तन के बाद), इस प्रकार हम इसे बाइनरी खोज करके नहीं पाएंगे।

हालांकि, हम दो वैक्टरों के बीच समाप्त होने जा रहे हैं।

v1 
v5 
v0 <-- up pointer 
    <-- q lies here 
v3 <-- down pointer 
v2 
v4 

अब हम या तो vi वेक्टर उस के साथ सबसे बिट्स से मेल खाएगी के लिए मांग को ऊपर या नीचे सूचक ले जाते हैं,: तो अब हम परिदृश्य की कल्पना कर सकते इस तरह होना करने के लिए (उदाहरण के q के लिए V0 और v3 के बीच स्थित है । q। मान लें कि यह V0 था चलो

इसी तरह, हम दूसरे क्रमचय करते हैं और हम वेक्टर vi मिल जाए,, के v4 मान लीजिए। अब हम पहले क्रमचय और v4 से V0 तुलना है, जो एक q के सबसे करीब है को देखने के लिए यानी q के बराबर सबसे अधिक बिट्स हैं।


हालांकि, यदि आप एक तैयार कार्यान्वयन की मांग कर रहे हैं, तो आपको Software Recommendation में पूछना चाहिए। मैं यह देखने के लिए लिंक किए गए पेपर को भी देखूंगा कि क्या लेखक ने कोड सार्वजनिक किया है, या यदि वे उनसे संपर्क करने के बाद इसे साझा करना चाहते हैं।

+1

एल्गोरिदम का एक कार्यान्वयन मिला [यहां] (https://github.com/emchristiansen/CharikarLSH) – justHelloWorld

संबंधित मुद्दे