2011-12-20 10 views
5

मैं के-मतलब क्लस्टरिंग चलाने के लिए महॉट का उपयोग कर रहा हूं, और क्लस्टरिंग के दौरान मुझे डेटा प्रविष्टि की पहचान करने में समस्या आई है, उदाहरण के लिए मेरे पास 100 डेटा प्रविष्टियां हैंमहॉट के में डेटा एंट्री आईडी को बनाए रखने का तरीका है- क्लस्टरिंग

id  data 
0  0.1 0.2 0.3 0.4 
1  0.2 0.3 0.4 0.5 
...  ... 
100  0.2 0.4 0.4 0.5 

क्लस्टरिंग के बाद, मुझे क्लस्टर परिणाम से आईडी वापस प्राप्त करने की आवश्यकता है यह देखने के लिए कि कौन सा बिंदु क्लस्टर से संबंधित है, लेकिन आईडी को बनाए रखने के लिए कोई विधि नहीं है।

सिंथेटिक नियंत्रण डाटा क्लस्टरिंग की आधिकारिक महावत उदाहरण में, केवल डेटा की तरह

28.7812 34.4632 31.3381 31.2834 28.9207 ... 
... 
24.8923 25.741 27.5532 32.8217 27.8789 ... 

और आईडी के बिना महावत को inputted गया क्लस्टर परिणाम केवल क्लस्टर-आईडी और बिन्दु मान है:

VL-539{n=38 c=[29.950, 30.459, ... 
    Weight: Point: 
    1.0: [28.974, 29.026, 31.404, 27.894, 35.985... 
    2.0: [24.214, 33.150, 31.521, 31.986, 29.064 

लेकिन कोई बिंदु-आईडी मौजूद नहीं है, इसलिए, क्या किसी को यह पता चल सकता है कि महोत्सव क्लस्टरिंग करते समय पॉइंट-आईडी को कैसे बनाए रखना है? आपका बहुत बहुत धन्यवाद!

उत्तर

0

आपका अनुरोध प्रायः प्रोग्रामर द्वारा अनदेखा किया जाता है जो स्वयं चिकित्सक नहीं हैं ... दुर्भाग्य से। मुझे नहीं पता कि यह कैसे करें महाउट (अब तक), लेकिन मैंने अपाचे-कॉमन्स-गणित के साथ शुरुआत की, जिसमें एक ही दोष के साथ के-साधन शामिल हैं। मैंने इसे अनुकूलित किया है कि आपका अनुरोध संतुष्ट है। आपको यह यहां मिलेगा: http://code.google.com/p/noolabsimplecluster/ इसके अतिरिक्त, अंतराल पर डेटा को सामान्य रूप से (रैखिक रूप से) सामान्य करना न भूलें [0..1], अन्यथा कोई भी क्लस्टरिंग अलगो कचरा पैदा करेगा!

0

क्लस्टरर्ड पॉइंट्स निर्देशिका जो कि केमैन द्वारा उत्पादित की जाती है, में यह मैपिंग शामिल है। कृपया ध्यान दें कि आपको यह डेटा प्राप्त करने के लिए -cl विकल्प का उपयोग करना चाहिए था।

2

यह प्राप्त करने के लिए कि मैं नामांकित वेक्टर का उपयोग करता हूं।

जैसा कि आप जानते हैं, आपके डेटा के साथ क्लस्टरेशन करने से पहले, आपको इसे सदिश बनाना होगा।

इसका मतलब है कि आपको अपने डेटा को महाउट वैक्टर में बदलना है, क्योंकि यह डेटा है जो क्लस्टरराइजेशन एल्गोरिदम काम करता है।

वेक्टरेशन प्रक्रिया आपके डेटा की प्रकृति पर निर्भर करेगी, यानी वेक्टरिंग टेक्स्ट वेक्टरिज संख्यात्मक मानों के समान नहीं है।

आपका डेटा आसानी से वेक्टरिज़ेबल लगता है, क्योंकि इसमें केवल आईडी और 4 संख्यात्मक मान हैं।

आप एक हैडोप जॉब लिख सकते हैं जो आपके इनपुट डेटा लेता है, उदाहरण के लिए, एक CSV फ़ाइल, के रूप में और आपके डेटा के साथ पहले से ही वेक्टरनाइज़ किए गए अनुक्रम फ़ाइल को आउटपुट करता है।

फिर, आप इस इनपुट में महाउट क्लस्टरिंग एल्गोरिदम लागू करते हैं और आप क्लस्टरिंग परिणामों में प्रत्येक वेक्टर के आईडी (वेक्टर नाम) को रखेंगे।

एक उदाहरण काम vectorize के लिए अपने डेटा निम्न वर्गों के साथ लागू किया जा सकता:

public class DenseVectorizationDriver extends Configured implements Tool{ 

    @Override 
    public int run(String[] args) throws Exception { 
     if (args.length != 2) { 
      System.err.printf("Usage: %s [generic options] <input> <output>\n", getClass().getSimpleName()); 
      ToolRunner.printGenericCommandUsage(System.err); return -1; 
     } 
     Job job = new Job(getConf(), "Create Dense Vectors from CSV input"); 
     job.setJarByClass(DenseVectorizationDriver.class); 

     FileInputFormat.addInputPath(job, new Path(args[0])); 
     FileOutputFormat.setOutputPath(job, new Path(args[1])); 

     job.setMapperClass(DenseVectorizationMapper.class); 
     job.setReducerClass(DenseVectorizationReducer.class); 

     job.setOutputKeyClass(LongWritable.class); 
     job.setOutputValueClass(VectorWritable.class); 

     job.setOutputFormatClass(SequenceFileOutputFormat.class); 

     return job.waitForCompletion(true) ? 0 : 1; 
    } 
} 


public class DenseVectorizationMapper extends Mapper<LongWritable, Text, LongWritable, VectorWritable>{ 
/* 
* This mapper class takes the input from a CSV file whose fields are separated by TAB and emits 
* the same key it receives (useless in this case) and a NamedVector as value. 
* The "name" of the NamedVector is the ID of each row. 
*/ 
    @Override 
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 

     String line = value.toString(); 
     System.out.println("LINE: "+line); 
     String[] lineParts = line.split("\t", -1);  
     String id = lineParts[0]; 

     //you should do some checks here to assure that this piece of data is correct 

     Vector vector = new DenseVector(lineParts.length -1); 
     for (int i = 1; i < lineParts.length -1; i++){ 
      String strValue = lineParts[i]; 
      System.out.println("VALUE: "+strValue); 
      vector.set(i, Double.parseDouble(strValue)); 

     } 

     vector = new NamedVector(vector, id); 

     context.write(key, new VectorWritable(vector)); 
    } 
} 


public class DenseVectorizationReducer extends Reducer<LongWritable, VectorWritable, LongWritable, VectorWritable>{ 
/* 
* This reducer simply writes the output without doing any computation. 
* Maybe it would be better to define this hadoop job without reduce phase. 
*/ 
    @Override 
    public void reduce(LongWritable key, Iterable<VectorWritable> values, Context context) throws IOException, InterruptedException{ 

     VectorWritable writeValue = values.iterator().next(); 
     context.write(key, writeValue); 
    } 
} 
+0

मैं अपने कोड के सभी के माध्यम से जाना नहीं था, लेकिन पहली रेखा पर्याप्त था। "NamedVector"! –

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