2012-01-09 13 views
6

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

+0

कुछ भी करेंगे तो आप इस के लिए महावत का उपयोग करने की जरूरत है या क्या में वैक्टर लिखने के लिए कर सकता है? बहुत सारे क्लस्टरिंग एपीआई, टूल्स, नमूना कोड इत्यादि हैं जो आसानी से ऐसा करेंगे। यदि आपके पास एक फ़ाइल है तो आपके डेटा पॉइंट काफी छोटे हो सकते हैं, सिद्धांत में महाउट बड़े पैमाने पर समस्याओं के लिए है। – Steve

+0

मैं यहां से क्लस्टरिंग डेटा सेट देख रहा हूं: http://www.grouplens.org/node/73 सबसे बड़ा डेटा सेट संभावित रूप से 72,000 डेटा पॉइंट्स में 10,000 है। यही कारण है कि मैंने सोचा था कि जब मैं छोटे डेटा सेट –

+0

http://glaros.dtc.umn.edu/gkhome/software प्रयास करें Weka भी एक SDK है, लोड करने का प्रयास महावत सबसे अच्छा, WEKA दुर्घटनाओं हो सकता है। के-माध्यम अधिकांश भाषाओं में लागू करने के लिए काफी आगे है इसलिए मुझे यकीन है कि आप Google – Steve

उत्तर

8

मैं मैन्युअल रूप से, CSV फ़ाइल से प्रविष्टियों में पढ़ने उन लोगों से NamedVectors बनाने, और फिर एक दृश्य फ़ाइल में वैक्टर लिखने के लिए एक दृश्य फ़ाइल लेखक का उपयोग कर की सिफारिश करेंगे। वहां से, KMeansDriver रन विधि को पता होना चाहिए कि इन फ़ाइलों को कैसे संभालना है।

अनुक्रम फ़ाइलें कुंजी-मूल्य जोड़े को एन्कोड करें, इसलिए कुंजी नमूना की एक आईडी होगी (यह एक स्ट्रिंग होनी चाहिए), और वैक्टर के चारों ओर एक वेक्टर वर्टिव रैपर है।

 List<NamedVector> vector = new LinkedList<NamedVector>(); 
    NamedVector v1; 
    v1 = new NamedVector(new DenseVector(new double[] {0.1, 0.2, 0.5}), "Item number one"); 
    vector.add(v1); 

    Configuration config = new Configuration(); 
    FileSystem fs = FileSystem.get(config); 

    Path path = new Path("datasamples/data"); 

    //write a SequenceFile form a Vector 
    SequenceFile.Writer writer = new SequenceFile.Writer(fs, config, path, Text.class, VectorWritable.class); 
    VectorWritable vec = new VectorWritable(); 
    for(NamedVector v:vector){ 
     vec.set(v); 
     writer.append(new Text(v.getName()), v); 
    } 
    writer.close(); 

इसके अलावा, मैं Mahout in Action के अध्याय 8 पढ़ने की सिफारिश करेंगे,:

यहां ऐसा करने के लिए पर एक साधारण कोड नमूना है। यह महौत में डेटा प्रतिनिधित्व पर अधिक जानकारी देता है।

+2

पर कुछ कोड स्निपेट पा सकते हैं अध्याय 8 एक निशुल्क नमूना है! http://manning.com/owen/MiA_SampleCh08.pdf आप –

+0

जानते हैं कि कैसे मैं वेक्टर नाम क्लस्टरिंग परिणामों से वापस मिल सकता है? http://stackoverflow.com/questions/14476706/dumping-clustering-result-with-vectors-names देखें – exic

+1

आपके उदाहरण में (यह पोस्ट करने के लिए धन्यवाद, BTW) एक छोटे से त्रुटि है। "लेखक.एपेंड (नया टेक्स्ट (v.getName()), v) के बजाय;" मुझे लगता है कि इसे "लिखना चाहिए।" (नया टेक्स्ट (v.getName()), vec); "। नहीं तो आप कह रही है एक अपवाद मिल ": गलत मान वर्ग: java.io.IOException org.apache.mahout.math.NamedVector वर्ग org.apache.mahout.math.VectorWritable नहीं है" – user311121

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