EMClustering.java 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package classifier;
  2. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Packet;
  3. import weka.clusterers.EM;
  4. import weka.core.Instance;
  5. import weka.core.Instances;
  6. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.simpleImplementation.BasicPacketClassifier;
  7. /**
  8. * Expectation Maximization Clustering Approach
  9. * @author Andreas T. Meyer-Berg
  10. */
  11. public class EMClustering extends BasicPacketClassifier {
  12. /**
  13. * EM cluster which is used
  14. */
  15. private EM clusterer;
  16. /**
  17. * Initialize the clusterer
  18. */
  19. public EMClustering() {
  20. clusterer = new EM();
  21. }
  22. @Override
  23. public void trainModel(Instances instances) {
  24. try {
  25. clusterer.buildClusterer(instances);
  26. } catch (Exception e) {
  27. // TODO Auto-generated catch block
  28. e.printStackTrace();
  29. }
  30. }
  31. @Override
  32. public double classifyInstance(Instance instance, Packet origin) throws Exception {
  33. /**
  34. * Id of the closest cluster
  35. */
  36. int x = clusterer.clusterInstance(instance);
  37. /*
  38. System.out.println(origin.getTextualRepresentation()+": cluster: "+x+" Dens: "+clusterer.logDensityForInstance(instance)+" joined: ");
  39. double[] joined = clusterer.logJointDensitiesForInstance(instance);
  40. for(int i = 0;i<joined.length;) {
  41. System.out.print(joined[i]);
  42. if(++i<joined.length)
  43. System.out.print(", ");
  44. else
  45. System.out.println("");
  46. }
  47. System.out.println("Distribution:");
  48. double[] distribution = clusterer.distributionForInstance(instance);
  49. for(int i = 0;i<distribution.length;) {
  50. System.out.print(distribution[i]);
  51. if(++i<distribution.length)
  52. System.out.print(", ");
  53. else
  54. System.out.println("");
  55. }
  56. double[] priors = clusterer.clusterPriors();
  57. System.out.println("Priors: ");
  58. for(int i = 0; i<priors.length; i++) {
  59. System.out.println("i="+i+": "+priors[i]);
  60. }
  61. double[][][] rest = clusterer.getClusterModelsNumericAtts();
  62. double[][] posteriori = rest[x];
  63. for(int i = 0; i<posteriori.length; i++) {
  64. System.out.println("Att "+i+": Mean: "+posteriori[i][0]+" Std: "+posteriori[i][1]+" ???: "+posteriori[i][2]+" Real: "+instance.value(i));
  65. }*/
  66. return (1-clusterer.distributionForInstance(instance)[x])*800;
  67. }
  68. @Override
  69. public long getClassificationStart() {
  70. return 3600000;
  71. }
  72. @Override
  73. public String getAlgoName() {
  74. return "EM";
  75. }
  76. }