====== Metody Eksploracji Danych: Laboratorium 6 ======
Podczas zajęć będziemy korzystali z funkcji biblioteki Weka wołanych programowo z kodu Java.
{{:med:med-lab06.pdf|Opis zadań (PDF)}}
:!: [[https://youtu.be/Eu1b1zgzd9Q|Prezentacja na YouTube ]] [24.53]
===== Zbiory danych =====
[[http://home.agh.edu.pl/~pszwed/wiki/doku.php?id=med:datasetslaboratorium_6_grupowanie_klasyfikacja|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
Dodanie etykiet
int idx = newData.numAttributes()-1;
for(int i=0;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
DBSCAN
DBSCAN cls = new DBSCAN();
cls.setMinPoints(3);
cls.setEpsilon(0.1);
cls.buildClusterer(data);
Wyniki dla EM
System.out.println(cls);
*Aby obliczyć log-likehood: należy iterować po instancjach i zsumować ''cls.logDensityForInstance(data.get(i));''
Może się przydać: [[http://stackoverflow.com/questions/11272938/how-to-save-panel-as-image-in-swing|Jak zapisać panel jako obrazek...]]