2012-01-09 18 views
6

Ho un file contenente i vettori di dati, in cui ogni riga contiene un elenco di valori separati da virgole. Mi chiedo come eseguire k-means in clustering su questi dati usando il mahout. L'esempio fornito nel wiki menziona la creazione di sequenceFiles, ma in caso contrario non sono sicuro di dover eseguire qualche tipo di conversione per ottenere questi file sequenza.Come eseguire il clustering k-means in mahout con i dati vettoriali memorizzati come CSV?

+0

Avete bisogno di utilizzare mahout per questo o sarà niente fare? Ci sono un sacco di API, strumenti, codice di esempio ecc. Che lo farebbero facilmente. Se hai un singolo file i tuoi punti dati potrebbero essere piuttosto piccoli, in teoria Mahout è pensato per problemi su larga scala. – Steve

+0

Sto osservando i set di dati di clustering da qui: http://www.grouplens.org/node/73 Il set di dati più grande contiene potenzialmente 10.000 per 72.000 punti di dati. Ecco perché ho pensato che potrebbe essere meglio mahout, WEKA si blocca quando provo a caricare i set di dati più piccoli –

+0

Prova http://glaros.dtc.umn.edu/gkhome/software, Weka ha anche un SDK. k-means è abbastanza semplice da implementare nella maggior parte delle lingue quindi sono sicuro che puoi trovare alcuni frammenti di codice su google – Steve

risposta

8

Si consiglia di leggere manualmente le voci dal file CSV, creare NamedVectors da esse e quindi utilizzare un file writer di sequenza per scrivere i vettori in un file di sequenza. Da lì in poi, il metodo di esecuzione di KMeansDriver dovrebbe sapere come gestire questi file.

I file di sequenza codificano coppie chiave-valore, quindi la chiave sarebbe un ID del campione (dovrebbe essere una stringa) e il valore è un wrapper VectorWritable attorno ai vettori.

Ecco un esempio di codice semplice su come fare questo:

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

Inoltre, vorrei raccomandare la lettura del capitolo 8 Mahout in Action. Fornisce maggiori dettagli sulla rappresentazione dei dati in Mahout.

+2

il capitolo 8 è un campione gratuito! http://manning.com/owen/MiA_SampleCh08.pdf –

+0

Sai come posso recuperare i nomi dei vettori dai risultati del clustering? Vedi http://stackoverflow.com/questions/14476706/dumping-clustering-result-with-vectors-names – exic

+1

C'è un piccolo errore nel tuo esempio (grazie per averlo pubblicato, BTW). Invece di "writer.append (new Text (v.getName()), v);" Penso che debba essere "write.append (new Text (v.getName()), vec);". Altrimenti si ottiene un'eccezione dicendo "java.io.IOException: errata classe di valore: org.apache.mahout.math.NamedVector non è class org.apache.mahout.math.VectorWritable" – user311121

Problemi correlati