Context-detection API for Android developed as a university project
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

Classifier.java 1.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*
  2. * To change this template, choose Tools | Templates
  3. * and open the template in the editor.
  4. */
  5. package uk.co.md87.android.common;
  6. import java.util.Map;
  7. import java.util.Map.Entry;
  8. import java.util.Set;
  9. /**
  10. *
  11. * @author chris
  12. */
  13. public class Classifier {
  14. private final Set<Map.Entry<Float[], String>> model;
  15. public Classifier(final Set<Entry<Float[], String>> model) {
  16. this.model = model;
  17. }
  18. public String classify(final float[] data) {
  19. float oddTotal = 0, evenTotal = 0;
  20. float oddMin = Float.MAX_VALUE, oddMax = Float.MIN_VALUE;
  21. float evenMin = Float.MAX_VALUE, evenMax = Float.MIN_VALUE;
  22. for (int i = 0; i < 128; i++) {
  23. evenTotal += data[i * 2];
  24. oddTotal += data[i * 2 + 1];
  25. evenMin = Math.min(evenMin, data[i * 2]);
  26. oddMin = Math.min(oddMin, data[i * 2 + 1]);
  27. evenMax = Math.max(evenMax, data[i * 2]);
  28. oddMax = Math.max(oddMax, data[i * 2 + 1]);
  29. }
  30. final float[] points = {
  31. Math.abs(evenTotal / 128),
  32. Math.abs(oddTotal / 128),
  33. evenMax - evenMin,
  34. oddMax - oddMin
  35. };
  36. float bestDistance = Float.MAX_VALUE;
  37. String bestActivity = "UNCLASSIFIED/UNKNOWN";
  38. for (Map.Entry<Float[], String> entry : model) {
  39. float distance = 0;
  40. for (int i = 0; i < points.length; i++) {
  41. distance += Math.pow(points[i] - entry.getKey()[i], 2);
  42. }
  43. if (distance < bestDistance) {
  44. bestDistance = distance;
  45. bestActivity = entry.getValue();
  46. }
  47. }
  48. return bestActivity;
  49. }
  50. }