Podczas zajęć będziemy korzystali z funkcji biblioteki Weka wołanych programowo z kodu Java.
Prezentacja na YouTube [24.53]
Należy pobrać archiwum http://prdownloads.sourceforge.net/weka/optics_dbScan1.0.5.zip?download i dodać plik optics_dbScan.jar do projektu.
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);
cls.logDensityForInstance(data.get(i));
Może się przydać: Jak zapisać panel jako obrazek...