KMeans.cc 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "KMeans.h"
  3. #include <dlib/clustering.h>
  4. void KMeans::train(const std::vector<DSample> &Samples, size_t MaxIterations) {
  5. MinDist = std::numeric_limits<CalculatedNumber>::max();
  6. MaxDist = std::numeric_limits<CalculatedNumber>::min();
  7. ClusterCenters.clear();
  8. dlib::pick_initial_centers(NumClusters, ClusterCenters, Samples);
  9. dlib::find_clusters_using_kmeans(Samples, ClusterCenters, MaxIterations);
  10. for (const auto &S : Samples) {
  11. CalculatedNumber MeanDist = 0.0;
  12. for (const auto &KMCenter : ClusterCenters)
  13. MeanDist += dlib::length(KMCenter - S);
  14. MeanDist /= NumClusters;
  15. if (MeanDist < MinDist)
  16. MinDist = MeanDist;
  17. if (MeanDist > MaxDist)
  18. MaxDist = MeanDist;
  19. }
  20. }
  21. CalculatedNumber KMeans::anomalyScore(const DSample &Sample) const {
  22. CalculatedNumber MeanDist = 0.0;
  23. for (const auto &CC: ClusterCenters)
  24. MeanDist += dlib::length(CC - Sample);
  25. MeanDist /= NumClusters;
  26. if (MaxDist == MinDist)
  27. return 0.0;
  28. CalculatedNumber AnomalyScore = 100.0 * std::abs((MeanDist - MinDist) / (MaxDist - MinDist));
  29. return (AnomalyScore > 100.0) ? 100.0 : AnomalyScore;
  30. }