Table of Contents

Metody Eksploracji Danych: Laboratorium 6

Podczas zajęć będziemy korzystali z funkcji biblioteki Weka wołanych programowo z kodu Java.

Opis zadań (PDF)

:!: Prezentacja na YouTube [24.53]

Zbiory danych

Dwuwymiarowe obserwacje

Weka

Należy pobrać archiwum http://prdownloads.sourceforge.net/weka/optics_dbScan1.0.5.zip?download i dodać plik optics_dbScan.jar do projektu.

Kod

Import

import weka.clusterers.SimpleKMeans;
import weka.clusterers.Clusterer;
import weka.clusterers.DBSCAN;
import weka.clusterers.EM;
import weka.core.Instances;
import weka.core.Utils;
import weka.core.converters.ConverterUtils;
import weka.filters.Filter;
import weka.filters.unsupervised.attribute.Add;
import weka.gui.visualize.VisualizePanel;

Załadowanie pliku

ConverterUtils.DataSource source = new ConverterUtils.DataSource("cl-001.arff");
Instances data = source.getDataSet();

Klasteryzacja

SimpleKMeans cls = new SimpleKMeans();
cls.setNumClusters(3);
cls.setPreserveInstancesOrder(true);
cls.buildClusterer(data);

Utworzenie nowego zbioru danych z atrybutem wyjściowym. W analogiczny sposób wołamy dowolny filtr Weka

            Add filter = new Add();
            filter.setAttributeIndex("last");
            int num  = cls.numberOfClusters();
            String labels = "cluster0";
            for(int i=1;i<num;i++){
                labels+=", cluster";
                labels+=i;
            }
            filter.setNominalLabels(labels);
            filter.setAttributeName("Cluster");
            filter.setInputFormat(data);
            Instances newData = Filter.useFilter(data, filter);

Dodanie etykiet

            int idx = newData.numAttributes()-1;
            for(int i=0;i<newData.numInstances();i++){
                newData.get(i).setValue(idx, cls.clusterInstance(data.get(i)));
            }

Wizualizacja

    void visualize(Instances data, String title){
        JFrame jf = new JFrame(title); 
        jf.getContentPane().setLayout(new BorderLayout()); 
        VisualizePanel vp = new VisualizePanel();
        vp.setShowClassPanel(true);
        jf.getContentPane().add(vp, BorderLayout.CENTER); 
        jf.addWindowListener(new java.awt.event.WindowAdapter() { 
            public void windowClosing(java.awt.event.WindowEvent e) { 
              jf.dispose(); 
              System.exit(0); 
            } 
         }); 
        jf.pack(); 
        jf.setSize(600, 450); 
        jf.setVisible(true); 
        vp.setInstances(data);         
    }

Wyniki dla k-means

        Instances centroids = cls.getClusterCentroids();
        for(int i=0;i<centroids.numAttributes();i++){
            System.out.print(centroids.attribute(i));
            System.out.print(",");
        }
 
        for(int i=0;i<centroids.numInstances();i++){
            System.out.println(centroids.get(i));
        }
        System.out.printf(Locale.US, "Error: %f",cls.getSquaredError());

DBSCAN

            DBSCAN cls = new DBSCAN();
            cls.setMinPoints(3);
            cls.setEpsilon(0.1);
            cls.buildClusterer(data);

Wyniki dla EM

        System.out.println(cls);

Może się przydać: Jak zapisać panel jako obrazek...