2012-01-09 10 views
6

Her satırın virgülle ayrılmış değerler listesi içerdiği, veri vektörlerini içeren bir dosyam var. Mahout kullanarak bu verilere k-aracı kümelemenin nasıl yapıldığını merak ediyorum. Wiki'de verilen örnek, sequenceFiles'i oluşturduğundan bahseder, ancak aksi takdirde bu sequenceFiles'ı elde etmek için bir tür dönüşüm yapmam gerekip gerekmediğinden emin değilim.Postalamada k-aracı kümeleme CSV olarak depolanan vektör verileriyle nasıl gerçekleştirilir?

+0

Bunun için mahout kullanmak gerekir ya da bir şey yapacak mı mahout formatında vektörleri yazmak için Fil Bird kullanabilir? Bunu kolayca yapabilecek çok sayıda küme apihi, araç, örnek kod vb. Var. Tek bir dosyanız varsa, veri noktalarınız oldukça küçük olabilir, Mahout teoride büyük ölçekli problemler içindir. – Steve

+0

Kümeleme veri kümelerine buradan bakıyorum: http://www.grouplens.org/node/73 En büyük veri kümesi potansiyel olarak 10,000 ila 72.000 veri noktası içeriyor. Bu yüzden mahout en iyi olabileceğini düşündüm, WEKA küçük veri kümelerini yüklemeye çalıştığımda çöküyor –

+0

http://glaros.dtc.umn.edu/gkhome/software'i deneyin, Weka'nın da bir SDK'si var. k-araçlar çoğu dilde uygulamak için oldukça düz ileri, bu yüzden ben google – Steve

cevap

8

CSV dosyasındaki girişleri el ile okumanızı, onlardan NamedVectors oluşturmayı ve ardından bir sıra dosyasında vektörleri yazmak için bir sıra dosyası yazıcısı kullanmayı öneririm. Oradan, KMeansDriver çalıştırma yöntemi bu dosyaların nasıl ele alınacağını bilmelidir.

Sıralama dosyaları anahtar/değer çiftlerini kodlar; bu nedenle anahtar örnekte bir kimlik olur (bir dize olmalı) ve değer vektörlerin etrafında VectorWritable bir sarıcıdır. Ayrıca

 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(); 

Ben Mahout in Action bölüm 8 okuma öneriyoruz:

İşte bunun nasıl basit bir kod örneğidir. Mahout'daki veri temsili hakkında daha fazla ayrıntı verir.

+2

bazı kod parçacıkları bulabilirsiniz emin bölüm 8 ücretsiz bir örnek! http://manning.com/owen/MiA_SampleCh08.pdf –

+0

Vektör adlarını kümeleme sonuçlarından nasıl geri alabileceğimi biliyor musunuz? Bkz. Http://stackoverflow.com/questions/14476706/dumping-clustering-result-with-vectors-names – exic

+1

Örneğinizde küçük bir hata var (bunu yayınladığınız için teşekkürler, BTW). "Writer.append (yeni Metin (v.getName()), v) yerine"; "Write.append (yeni Text (v.getName()), vec) olması gerektiğini düşünüyorum." Aksi takdirde "java.io.IOException: yanlış değer sınıfı: org.apache.mahout.math.NamedVector sınıf org.apache.mahout.math.VectorWritable değil" şeklinde bir istisna alırsınız. – user311121

İlgili konular