2012-01-06 19 views
8

मैं मार्कोव क्लस्टरिंग एल्गोरिथ्म के विवरण के निम्न उदाहरण के माध्यम से काम कर रहा है:मार्कोव एल्गोरिथ्म क्लस्टरिंग

http://www.cs.ucsb.edu/~xyan/classes/CS595D-2009winter/MCL_Presentation2.pdf

मैं जैसे मैं सही ढंग से एल्गोरिथ्म का प्रतिनिधित्व किया है लग रहा है, लेकिन मैं एक ही परिणाम नहीं मिल रहा है कि कम से कम, यह गाइड उस इनपुट के लिए हो रहा था।

वर्तमान कोड है पर: मैं http://jsfiddle.net/methodin/CtGJ9/

यकीन नहीं करता है, तो शायद मैं सिर्फ एक छोटा सा तथ्य चूक कर रहा हूँ या सिर्फ इस बात के लिए कहीं न कहीं एक छोटे से ट्वीक जरूरत है, लेकिन मैं सहित कुछ रूपों की कोशिश की है:

  1. मुद्रास्फीति की दर/विस्तार
  2. एक सटीक
  3. सामान्य (के बाद से मूल गाइड यह आवश्यकता नहीं किया था निकाला जा रहा है के आधार पर समानता के लिए जाँच हो रही है गमागमन, हालांकि आधिकारिक एमसीएल घ ocumentation राज्य प्रत्येक पास पर मैट्रिक्स को सामान्य करने के लिए राज्यों)

इन सभी ने एक ही परिणाम लौटा दिया है - नोड केवल खुद को प्रभावित करता है।

मैं भी वीबी में एक समान एल्गोरिथ्म कार्यान्वयन पाया है: http://mcl.codeplex.com/SourceControl/changeset/changes/17748#MCL%2fMCL%2fMatrix.vb

और मेरे कोड उनकी नंबरिंग (600 - उदाहरण के लिए दूरी) के अपवाद के साथ मेल खाते हैं लगता है।

इस विस्तार समारोह

// Take the (power)th power of the matrix effectively multiplying it with 
// itself pow times 
this.matrixExpand = function(matrix, pow) { 
    var resultMatrix = []; 
    for(var row=0;row<matrix.length;row++) { 
     resultMatrix[row] = []; 
     for(var col=0;col<matrix.length;col++) { 
      var result = 0; 
      for(var c=0;c<matrix.length;c++) 
       result += matrix[row][c] * matrix[c][col]; 
      resultMatrix[row][col] = result; 
     } 
    } 
    return resultMatrix; 
}; 

है और यह मुद्रास्फीति समारोह

// Applies a power of X to each item in the matrix 
this.matrixInflate = function(matrix, pow) { 
    for(var row=0;row<matrix.length;row++) 
     for(var col=0;col<matrix.length;col++) 
      matrix[row][col] = Math.pow(matrix[row][col], pow); 
}; 

और अंत में मुख्य passthru समारोह है

// Girvan–Newman algorithm 
this.getMarkovCluster = function(power, inflation) { 
    var lastMatrix = []; 

    var currentMatrix = this.getAssociatedMatrix(); 
    this.print(currentMatrix);   
    this.normalize(currentMatrix); 

    currentMatrix = this.matrixExpand(currentMatrix, power);  
    this.matrixInflate(currentMatrix, inflation);        
    this.normalize(currentMatrix); 

    while(!this.equals(currentMatrix,lastMatrix)) { 
     lastMatrix = currentMatrix.slice(0); 

     currentMatrix = this.matrixExpand(currentMatrix, power);     
     this.matrixInflate(currentMatrix, inflation);   
     this.normalize(currentMatrix);    
    } 
    return currentMatrix; 
}; 
+0

jsfiddle लिंक टूटा हुआ प्रतीत होता है, क्या आपका कार्यान्वयन अभी भी कहीं भी उपलब्ध है? धन्यवाद! – skyork

+1

अजीब। मुझे आश्चर्य है कि यह कहाँ चला गया? यहां कोड के साथ एक गलती है: https://gist.github.com/methodin/1573728 – methodin

+0

यहां एक कोडपेन है: http://codepen.io/Xeoncross/pen/NqWqWe?editors=101 – Xeoncross

उत्तर

2

आपका कार्यान्वयन सही है। उदाहरण सिर्फ गलत है।

तीन परिणाम मैट्रिस "चरण 5 और 6 दोहराएं जब तक एक स्थिर स्थिति तक पहुंच न हो (अभिसरण)" स्लाइड केवल मुद्रास्फीति का परिणाम है।

एल्गोरिदम के बारे में कुछ बिंदुओं को स्पष्ट करने के लिए।

  1. तब मुद्रास्फीति का विस्तार।
  2. प्रेसिजन एक महत्वपूर्ण कारक है। समीकरण गणितीय रूप से अभिसरण का नेतृत्व नहीं कर सकते हैं। यह cpus पर फ़्लोटिंग पॉइंट ऑपरेशंस की सीमित सटीकता है जो मैट्रिक्स में कुछ आइटमों को शून्य रूप से छोटी संख्या के बजाय शून्य बनने का कारण बनती है।असल में आधिकारिक कार्यान्वयन अभिसरण को गति देने और एल्गोरिदम की समय जटिलता में सुधार करने के लिए प्रति कॉलम की एक निश्चित मात्रा को खत्म करने के लिए कटऑफ मूल्य का उपयोग करता है। मूल थीसिस में लेखक ने इसके प्रभाव को समझाया और निष्कर्ष निकाला कि कटऑफ मुद्रास्फीति पैरामीटर की मामूली वृद्धि के रूप में अभ्यास में एक ही परिणाम देता है।
  3. सामान्यीकरण मुद्रास्फीति चरण का एक अभिन्न अंग है, उस गाइड में समीकरण को फिर से पढ़ें।

अपने कोड के बारे में।

  1. array.slice एक उथली प्रतिलिपि बनाता है लेकिन यह आपके मामले में महत्वपूर्ण नहीं है क्योंकि आप matrixExpand में एक नई सरणी बनाते हैं।
  2. matrixExpand का आपका क्रियान्वयन पर ध्यान नहीं देता पॉव चर, और हमेशा एक ही में की 2.

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

+0

स्पष्टीकरण के लिए धन्यवाद - मुझे लगता है कि उदाहरण शायद कुछ और दिखा रहा था लेकिन यह पहचान नहीं सका कि यह क्या था। – methodin

0

एक मैट्रिक्स क्लोन करने के लिए currentMatrix.slice का उपयोग करना संदिग्ध लग रहा है। यह एक उथले क्लोन है, और चूंकि आप उत्परिवर्तित हो रहे हैं, जो परेशानी का जादू कर सकता है।

राउंड का उपयोग थोड़ा अजीब दिखता है, क्योंकि उस पावरपॉइंट प्रेजेंटेशन में सामान्यीकरण चरण के हिस्से के रूप में गोल करने का कोई उल्लेख नहीं है।

+0

एक कॉपी विधि जोड़ा गया पूर्ण प्रतिलिपि चलाएं लेकिन यह अभी भी एक ही परिणाम देता है। दौर को हटाने से एक अलग परिणाम मिलता है, हालांकि यह 0 के बजाय 0.999 99 99 877 और 0 के बजाय 0.00004 है, इसलिए प्रभावी परिणाम। मुझे यह अजीब लगता है कि पहले पुनरावृत्ति (थोड़ी देर पहले) के बाद मैट्रिस पावरपॉइंट के समान होते हैं लेकिन एक पुनरावृत्ति के बाद वे पूरी तरह अलग होते हैं। – methodin

+0

एल्गोरिदम पर अधिक बारीकी से देखे बिना और हाथ से काम करने के बिना, मैं केवल एक और चीज सोच सकता हूं, यह है कि आपके द्वारा लिखी गई बराबर() विधि बिल्कुल सही नहीं दिखती है। यह Math.abs की तुलना नहीं कर रहा है, जिसे मैंने देखा था। – dyoo

+0

प्रत्येक खंड और समग्र परिणाम पर एक पेट का प्रयास किया, जिसमें से दोनों ने परिणाम को प्रभावित नहीं किया। वास्तव में काफी अजीब! मैं सोच रहा हूं कि शायद मैं जिस उदाहरण से बाहर जा रहा था वह विभिन्न वर्गों में अलग-अलग डेटा का उपयोग कर रहा था। – methodin

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