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