📄 kmeanclusteringengine.java
字号:
/**
* Copyright (C) 2006, Laboratorio di Valutazione delle Prestazioni - Politecnico di Milano
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package jmt.engine.jwat.workloadAnalysis.clustering.kMean;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Vector;
import jmt.engine.jwat.MatrixOsservazioni;
import jmt.engine.jwat.Observation;
import jmt.engine.jwat.TimeConsumingWorker;
import jmt.engine.jwat.VariableNumber;
import jmt.gui.jwat.input.ProgressShow;
//UPDATE 2/11/2006: - eliminazione Vector dclusArray contenente le distanze punti-centri perche' MAI utilizzato
// + inserimneto matrice di short delle appartenenze osservazioni ai cluster
public class KMeanClusteringEngine{
private TimeConsumingWorker worker;
private KMean clustering;
private MatrixOsservazioni m;
private Observation[] obsVal;
private VariableNumber[] listAllVar; //Puntatori a tutte le variabili
private VariableNumber[] listSelVar; //Puntatori a tutte le variabili
private int indexSelVar[];
private int numMaxClust; //Num.massimo di cluster da considerare
private int numMaxIter; //Num.massimo di iterazioni
private int numTotVar; //Numero totale delle variabili
private int numVarSel; //Numero totale delle variabili
private boolean[] isSelectedVar; //Marca le variabili coinvolte nel Clustering all'interno del totale delle variabili
public TempClusterStatistics[][] sum; //Contiene le statistiche dei vari cluster
private double[] omsr; //Rapporto totale di varianza per partizione
private int[] nn; //Usata per contenere il numero di oss.per
public String m_strKMLog; //Log da aggiungere al session log
//public Vector nclusArray; //Vector contenente un vector per ogni cluster //Array contenente il cluster attuale della variabile
public short[][] nclust; //Matrice contenente cluster attuale osservazione, per ogni n-clustering
NumberFormat Floatformatter = new DecimalFormat("###.###E0");
public class TempClusterStatistics
{
public double Coord; // 1 coordinata
public int numOs; // 2 # di osservazioni
public double Media; // 3 media
public double stdDv; // 4 std.deviation
public double minOs; // 5 minimum value
public double maxOs; // 6 maximum value
public double Skewn; // 7 skewness
public double Kurto; // 8 kurtosis
public double Varnz; // 9 varianza
public double SSDev; // 10 somma delle square deviations from centre of cluster
public double Somma; // 1 somma dei valori
public double SumQd; // 2 somma dei quadrati
public double SumTz; // 3 somma delle terze potenze
public double SumQt; // 4 somma delle quarte potenze
public double VVdi5; // 5
public double VVdi6; // 6
public double VVdi7; // 7
}
public KMeanClusteringEngine(KMean clustering,TimeConsumingWorker worker){
this.worker=worker;
this.clustering=clustering;
}
public boolean PrepClustering(MatrixOsservazioni m,
int numeroMassimoCluster,
int numeroMassimoIterazioni,
int variabiliSelezionate[])
{
int j=0,i = 0;
this.m=m;
/* Inserite per TEST */
numMaxClust = numeroMassimoCluster; // Num.massimo di clusters da considerare
numMaxIter = numeroMassimoIterazioni; // Num. max di iterazioni
/* Salvataggio del numero di variaibli totali */
numTotVar = m.getNumVariables(); //Numero totale delle variabili
numVarSel = variabiliSelezionate.length; //Numero totale delle variabili
obsVal=m.getVariables()[0].getCurObs();
/* Inizializzazione degli array variabili normalizzate e dei puntatori alle variabili */
listAllVar=m.getVariables();
listSelVar=new VariableNumber[numVarSel];
indexSelVar=variabiliSelezionate;
/* Settaggio delle variaibli che sono coinvolte nel clustering */
isSelectedVar=new boolean[numTotVar];
sum= new TempClusterStatistics[numTotVar][numMaxClust];
omsr=new double[numMaxClust];
nn=new int[numMaxClust];
for (i=0; i<numTotVar; i++) isSelectedVar[i]=false;
for (i=0; i<numTotVar; i++) {
if(variabiliSelezionate[j]==i){
isSelectedVar[i]=true;
listSelVar[j]=listAllVar[i];
j++;
if(j==numVarSel) break;
}
}
InitData();
return true;
}
private void InitData()
{
int i=0;
/* Inizializzazione del vettore delle statistiche delle variaibli */
for (i=0; i<numMaxClust; i++) {
for (int j=0; j<numVarSel; j++) {
sum[j][i]= new TempClusterStatistics();
sum[j][i].Coord=0;
sum[j][i].Kurto=0;
sum[j][i].maxOs=0;
sum[j][i].Media=listSelVar[j].getUniStats().getMinValue();
sum[j][i].minOs=0;
sum[j][i].numOs=0;
sum[j][i].Skewn=0;
sum[j][i].SSDev=0;
sum[j][i].stdDv=0;
sum[j][i].Varnz=0;
sum[j][i].Somma = 0;
sum[j][i].SumQd = 0;
sum[j][i].SumTz = 0;
sum[j][i].SumQt = 0;
sum[j][i].VVdi5 = 0;
sum[j][i].VVdi6 = 0;
sum[j][i].VVdi7 = 0;
}
/* Inizializzazione del vettore che contiene il numero di punti per cluster */
nn[i]=0;
/* Azzeramento dell'array del rapporto totale di varianza per partizione */
omsr[i]=0;
}
}
public boolean DoClustering()
{
/* Indica il cluster di partenza */
int endclust,startClust = 0;
//nclusArray= new Vector();
nclust = new short[numMaxClust][obsVal.length];
/* Richiama la funzione che effettua l clustering */
endclust=Build(startClust);
if(endclust!=-1){
clustering.setRatio( endclust+ 1);
return true;
}
else{
return false;
}
}
private int Build(int startClust)
{
//Costruisce effettivamente i vari cluster
//aggiorna lo stato dei calcoli sulla Status Bar
int km=0;
/* creazione variaibili di utilit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -