public string ClassifyArticle(PreprocessedArticle article)
        {
            KnnArticle knnArticle = new KnnArticle {
                Label = article.Label, FeaturesVector = FeaturesVectorService.GetFeaturesVector(article)
            };
            List <(string, double)> neighbors = new List <(string, double)>();

            foreach (KnnArticle classifiedArticle in ClassifiedArticles)
            {
                neighbors.Add((classifiedArticle.PredictedLabel, Metric.CalculateDistance(classifiedArticle.FeaturesVector, knnArticle.FeaturesVector)));
            }

            var orderedNeighbors       = neighbors.OrderBy(t => t.Item2).Take(K).ToList();
            var distinctNeighborsCount = orderedNeighbors.GroupBy(t => t.Item1).Select(g => (g.Key, g.Count())).OrderByDescending(e => e.Item2).ToList();
            var neighborsWithSameCount =
                distinctNeighborsCount.Where(t => t.Item2 == distinctNeighborsCount[0].Item2).ToList();

            if (neighborsWithSameCount.Count != 1)
            {
                var orderedNeighborsWithSameCount =
                    orderedNeighbors.Where(c => neighborsWithSameCount.Select(d => d.Item1).Contains(c.Item1));
                var distinctNeighborsSum = orderedNeighborsWithSameCount.GroupBy(t => t.Item1).Select(g => (g.Key, g.Sum(t => t.Item2))).OrderBy(e => e.Item2).ToList();
                knnArticle.PredictedLabel = distinctNeighborsSum[0].Item1;
                ClassifiedArticles.Add(knnArticle);
                return(distinctNeighborsSum[0].Item1);
            }

            knnArticle.PredictedLabel = distinctNeighborsCount[0].Item1;
            ClassifiedArticles.Add(knnArticle);
            return(distinctNeighborsCount[0].Item1);
        }
 public void InitKnn(List <PreprocessedArticle> articles)
 {
     coldStartNumber    = articles.Count;
     ClassifiedArticles = articles.Select(t => new KnnArticle()
     {
         Label = t.Label, PredictedLabel = t.Label, FeaturesVector = FeaturesVectorService.GetFeaturesVector(t)
     }).ToList();
 }
 public KnnService(FeaturesVectorService featuresVectorService, IMetric metric, int k)
 {
     FeaturesVectorService = featuresVectorService;
     Metric = metric;
     K      = k;
 }