View Javadoc
1 package edu.psu.geovista.classification; 2 3 /*** 4 * <p>Title: Studio applications</p> 5 * <p>Description: </p> 6 * <p>Copyright: Copyright (c) 2002</p> 7 * <p>Company: GeoVSITA Center</p> 8 * @author Xiping Dai 9 * @version 1.0 10 */ 11 12 import java.lang.Math; 13 import java.awt.Color; 14 import java.util.Vector; 15 import java.awt.event.ActionListener; 16 import java.awt.event.ActionEvent; 17 import javax.swing.*; 18 import javax.swing.event.*; 19 import edu.psu.geovista.ui.event.*; 20 import edu.psu.geovista.data.StatisticsVectors; 21 //import edu.psu.geovista.category.*; 22 import edu.psu.geovista.data.StatisticsVectors; 23 import edu.psu.geovista.app.matrix.*; 24 25 public class ClassifierMaximumLikelihood 26 { 27 private int[] classes; // each element indicates the class number of the corresponding state. 28 private double[][] classMeanVectors; // each row is a mean vector of a class. 29 private double[] classStandardDeviation; 30 private Object[] dataObject; //data with unknown class information 31 private Object[] trainingData; //training data set 32 private String[] attributesDisplay; 33 private double[][] dataArray; // array for classification, each row is a data vector of an observation, each collum is an attribute vector. 34 private Vector[] trainingDataVector; 35 private int classnumber = 5; // number of classes 36 private MultiGaussian[] multiGaussian; 37 private boolean visualDisplay = true; 38 // private DistributionGraph distribution; 39 private EventListenerList listenerListAction = new EventListenerList(); 40 transient private EventListenerList listenerList = new EventListenerList(); 41 42 public ClassifierMaximumLikelihood(){ 43 } 44 45 public void setDataObject(Object[] data){ 46 // remove string data 47 edu.psu.geovista.data.geog.DataSetForApps dataObjTransfer = new edu.psu.geovista.data.geog.DataSetForApps(); 48 dataObjTransfer.setDataObject(data); 49 this.dataObject = dataObjTransfer.getDataSetNumericAndSpatial(); 50 this.attributesDisplay = dataObjTransfer.getAttributeNamesNumeric(); 51 if(this.visualDisplay == true){ 52 //this.drawVisualDisplay(); 53 ActionEvent e = new ActionEvent(this,1,"variable name set"); 54 this.fireActionPerformed(e); 55 } 56 dataArray = new double[dataObjTransfer.getNumObservations()][attributesDisplay.length]; 57 // transfer data array to double array 58 for (int j=0;j<attributesDisplay.length;j++) 59 { 60 int t = 0; 61 if (dataObject[j+1] instanceof double[]) t=0; 62 else if (dataObject[j+1] instanceof int[]) t=1; 63 else if (dataObject[j+1] instanceof boolean[]) t=2; 64 for (int i=0;i<dataArray.length;i++) 65 { 66 switch (t) 67 { 68 case 0 : 69 dataArray[i][j]=((double[])dataObject[j+1])[i]; 70 break; 71 case 1 : 72 dataArray[i][j]=(double)((int[])dataObject[j+1])[i]; 73 break; 74 case 2 : 75 dataArray[i][j]=((boolean[])dataObject[j+1])[i]?1.0:0.0; 76 break; 77 } 78 } 79 } 80 maximumClassifier(); 81 } 82 83 public void setTrainingData(Object[] data){ 84 // remove string data 85 edu.psu.geovista.data.geog.DataSetForApps dataObjTransfer = new edu.psu.geovista.data.geog.DataSetForApps(); 86 dataObjTransfer.setDataObject(data); 87 this.trainingData = dataObjTransfer.getDataSetNumericAndSpatial(); 88 attributesDisplay = dataObjTransfer.getAttributeNamesNumeric(); 89 double[][] trainingDataArray = new double[dataObjTransfer.getNumObservations()][attributesDisplay.length-1];//last column for classificaiton info. 90 // transfer data array to double array 91 for (int j=0;j<dataObjTransfer.getNumberNumericAttributes()-1;j++){ 92 int t = 0; 93 if (trainingData[j+1] instanceof double[]) t=0; 94 else if (trainingData[j+1] instanceof int[]) t=1; 95 else if (trainingData[j+1] instanceof boolean[]) t=2; 96 for (int i=0;i<trainingDataArray.length;i++) 97 { 98 switch (t){ 99 case 0 : 100 trainingDataArray[i][j]=((double[])trainingData[j+1])[i]; 101 break; 102 case 1 : 103 trainingDataArray[i][j]=(double)((int[])trainingData[j+1])[i]; 104 break; 105 case 2 : 106 trainingDataArray[i][j]=((boolean[])trainingData[j+1])[i]?1.0:0.0; 107 break; 108 } 109 } 110 } 111 //get class label from training data 112 this.trainingDataVector = new Vector[this.classnumber]; 113 for (int i = 0; i < this.classnumber; i ++){ 114 this.trainingDataVector[i] = new Vector(); 115 } 116 int[] trainingClass = (int[]) trainingData[dataObjTransfer.getNumberNumericAttributes()];//last column reserved for classificaiton info. 117 for (int i=0;i<trainingDataArray.length;i++){ 118 for (int j = 0; j < this.classnumber; j ++){ 119 if (trainingClass [i] == j+1){ 120 this.trainingDataVector[j].add(trainingDataArray[i]); 121 continue; 122 } 123 } 124 } 125 if(this.visualDisplay == true){ 126 this.drawVisualDisplay(); 127 ActionEvent e = new ActionEvent(this,1,"training data set"); 128 this.fireActionPerformed(e); 129 } 130 } 131 132 public void setClassNumber(int classNumber){ 133 this.classnumber = classNumber; 134 } 135 136 public int[] getClassificaiton(){ 137 return this.classes; 138 } 139 140 public void setVisualDisplay(boolean visualDisplay){ 141 this.visualDisplay = visualDisplay; 142 } 143 144 public String[] getVariableNames(){ 145 return this.attributesDisplay; 146 } 147 148 public Vector[] getTrainingData(){ 149 return this.trainingDataVector; 150 } 151 152 private void maximumClassifier(){ 153 //find estimated mean and standard deviation for the underlying distribution of 154 //each class 155 this.classes = new int[this.dataArray.length]; 156 this.multiGaussian = new MultiGaussian[this.classnumber]; 157 158 for (int i = 0; i< this.classnumber; i ++){ 159 multiGaussian[i] = new MultiGaussian(); 160 multiGaussian[i].setTrainingData(this.trainingDataVector[i]); 161 } 162 163 //classify based on estimated class distributions 164 int tmpClass = 0; 165 double[] pdfs = new double[this.classnumber]; 166 for (int i = 0; i < this.dataArray.length; i ++){ 167 for (int j = 0; j < this.classnumber; j ++){ 168 pdfs[j] = multiGaussian[j].getPDF(dataArray[i]); 169 } 170 //find the biggest pdf using density function of each class 171 tmpClass = 0; 172 for (int j = 1; j < this.classnumber; j ++){ 173 174 if (pdfs[j] > pdfs[tmpClass]){ 175 tmpClass = j; 176 } 177 } 178 //assign the class information to each observation. 179 //this.classes[i] = tmpClass+1;//class 1-5, especially for Kioloa data. 180 this.classes[i] = tmpClass; 181 } 182 } 183 184 JFrame dummyFrame = new JFrame("Data Distribution"); 185 JDialog graph; 186 private void drawVisualDisplay(){ 187 //training data in classes, class 0 188 double[][] data; 189 int len = this.trainingDataVector[0].size(); 190 data = new double[len][1]; 191 for(int i = 0; i < len; i ++){ 192 data[i][0] = ((double[])this.trainingDataVector[0].get(i))[0]; 193 } 194 double[] dataGaussian = new double[len]; 195 //MultiGaussian dataGauss = new MultiGaussian(); 196 //dataGauss.setTrainingData(data); 197 //for(int i = 0; i < len; i ++){ 198 // dataGaussian[i] = multiGaussian[0].getPDF(data[i]); 199 //} 200 /* 201 double[] data1D = new double[len]; 202 for(int i = 0; i < len; i ++){ 203 data1D[i] = data[i][0]; 204 } 205 206 double mean = StatisticsVectors.mean(data1D); 207 //System.out.println("mean " + mean); 208 double variance = StatisticsVectors.variance(data1D); 209 //System.out.println("variance " + variance); 210 for(int i = 0; i < len; i ++){ 211 dataGaussian[i] = 1/Math.sqrt(2*Math.PI*variance) * Math.exp(-Math.pow(data1D[i]-mean, 2)/2/variance); 212 } 213 214 if(this.distribution == null){ 215 this.distribution = new DistributionGraph(); 216 } 217 218 distribution.setAxisOn(true); 219 distribution.setGaussianPDF(dataGaussian); 220 distribution.setData(data1D);*/ 221 222 //MultiClassDistributions2D distributions = new MultiClassDistributions2D(); 223 //distributions.setAxisOn(true); 224 //distributions.setGaussOn(true); 225 //distributions.setBackground(Color.white); 226 //distributions.setDisplayXVariableIndex(0); 227 //distributions.setDisplayYVariableIndex(2); 228 //distributions.setDataVector(this.trainingDataVector); 229 230 //graph = new JDialog(dummyFrame, "Data Distribution", true); 231 //dummyFrame.getContentPane().add(distributions); 232 DistributionMatrix distributions = new DistributionMatrix(); 233 distributions.setBackground(Color.white); 234 distributions.setVariableNames(this.attributesDisplay); 235 distributions.setDataVector(this.trainingDataVector); 236 237 //graph = new JDialog(dummyFrame, "Data Distribution", true); 238 dummyFrame.getContentPane().add(distributions); 239 240 dummyFrame.setSize(200, 200); 241 dummyFrame.setVisible(true); 242 dummyFrame.show(); 243 } 244 245 /*** 246 * adds an ActionListener to the button 247 */ 248 public void addActionListener (ActionListener l) { 249 listenerListAction.add(ActionListener.class, l); 250 } 251 252 /*** 253 * removes an ActionListener from the button 254 */ 255 public void removeActionListener (ActionListener l) { 256 listenerListAction.remove(ActionListener.class, l); 257 } 258 259 /*** 260 * Notify all listeners that have registered interest for 261 * notification on this event type. The event instance 262 * is lazily created using the parameters passed into 263 * the fire method. 264 * @see EventListenerList 265 */ 266 public void fireActionPerformed (ActionEvent e) { 267 // Guaranteed to return a non-null array 268 Object[] listeners = listenerListAction.getListenerList(); 269 // Process the listeners last to first, notifying 270 // those that are interested in this event 271 ActionEvent e2 = new ActionEvent(this,ActionEvent.ACTION_PERFORMED,"OK"); 272 for (int i = listeners.length - 2; i >= 0; i -= 2) { 273 if (listeners[i] == ActionListener.class) { 274 // Lazily create the event: 275 ((ActionListener)listeners[i + 1]).actionPerformed(e2); 276 } 277 } 278 } 279 }

This page was automatically generated by Maven