Browse Source

Updates K-Means Approach to use stdv for detection

Andreas T. Meyer-Berg 4 years ago
parent
commit
c73c4255b6

+ 31 - 3
examples/classifier/KMeansClustering.java

@@ -21,7 +21,8 @@ public class KMeansClustering extends BasicPacketClassifier {
 	 * Number of Clusters
 	 */
 	protected int NUMBER_OF_CLUSTERS = 16;
-	
+	protected double[] stdv = new double[NUMBER_OF_CLUSTERS];
+	private boolean test = true;
 	/**
 	 * Initializes the k means clusterer
 	 */
@@ -44,12 +45,33 @@ public class KMeansClustering extends BasicPacketClassifier {
 	public void trainModel(Instances instances) {
 		try {
 			clusterer.buildClusterer(instances);
+			double[] sumOfSquares = new double[NUMBER_OF_CLUSTERS];
+			for(Instance i: instances) {
+				/**
+				 * Id of the closest cluster centroid
+				 */
+				int x = clusterer.clusterInstance(i);
+				/**
+				 * centroid instance
+				 */
+				Instance center = clusterer.getClusterCentroids().get(x);
+				/**
+				 * Distance
+				 */
+				double dist = clusterer.getDistanceFunction().distance(center, i);
+				sumOfSquares[x] += dist*dist;
+			}
+			/**
+			 * Calculate Standard Deviations
+			 */
+			for(int i = 0; i<NUMBER_OF_CLUSTERS; i++)
+				this.stdv[i] = Math.sqrt(sumOfSquares[i]);
 		} catch (Exception e) {
 			System.out.println("Failed while training the classifier");
 			e.printStackTrace();
 		}
 	}
-
+	
 	@Override
 	public double classifyInstance(Instance instance, Packet origin) throws Exception {
 		/**
@@ -60,7 +82,13 @@ public class KMeansClustering extends BasicPacketClassifier {
 		 * centroid instance
 		 */
 		Instance center = clusterer.getClusterCentroids().get(x);
-		return clusterer.getDistanceFunction().distance(center, instance);
+		
+		double dist = clusterer.getDistanceFunction().distance(center, instance);
+		if(dist < stdv[x])
+			return 0;
+		else
+			return Double.MAX_VALUE;
+		
 	}
 
 	@Override

+ 10 - 10
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/view/menuBar/MenuBarNetworkExamples.java

@@ -640,22 +640,22 @@ public class MenuBarNetworkExamples extends JMenu{
 			 * Create collectors
 			 */
 			PacketCollector collectorKNN = new PacketCollector(snifferKNN);
-			PacketCollector collectorEM = new PacketCollector(snifferEM);
-			PacketCollector collectorHC = new PacketCollector(snifferHC);
+			//PacketCollector collectorEM = new PacketCollector(snifferEM);
+			//PacketCollector collectorHC = new PacketCollector(snifferHC);
 			
 			/*
 			 * Capture both links on all collectors
 			 */
 			PacketCaptureController captureController = controller.getSimulationController().getPacketCaptureController();
-			captureController.addLinkToCollector(collectorEM, zigbee);
-			captureController.addLinkToCollector(collectorEM, wifi);
+			//captureController.addLinkToCollector(collectorEM, zigbee);
+			//captureController.addLinkToCollector(collectorEM, wifi);
 			captureController.addLinkToCollector(collectorKNN, zigbee);
 			captureController.addLinkToCollector(collectorKNN, wifi);
-			captureController.addLinkToCollector(collectorHC, zigbee);
-			captureController.addLinkToCollector(collectorHC, wifi);
+			//captureController.addLinkToCollector(collectorHC, zigbee);
+			//captureController.addLinkToCollector(collectorHC, wifi);
 			captureController.addPacketCollector(collectorKNN);
-			captureController.addPacketCollector(collectorEM);
-			captureController.addPacketCollector(collectorHC);
+			//captureController.addPacketCollector(collectorEM);
+			//captureController.addPacketCollector(collectorHC);
 
 			System.out.println("Check 3: created Controller");//TODO
 			
@@ -673,8 +673,8 @@ public class MenuBarNetworkExamples extends JMenu{
 				sim.getSimulationManager().simulateTimeIntervall(15000*i, 15000);
 
 			collectorKNN.setMode(true);
-			collectorEM.setMode(true);
-			collectorHC.setMode(true);
+			//collectorEM.setMode(true);
+			//collectorHC.setMode(true);
 			
 			System.out.println("Check 4: Trained");//TODO