public VecteurChanson Selectionne(VecteurChanson vecteurPrecedent, List <VecteurChanson> vecteursRestant, CalculData data) { /* Récupère les distances avec les vecteurs restants. */ var distanceMap = vecteursRestant.ToDictionary(v => v, v => data.MatriceSimilarite[vecteurPrecedent, v]); /* Groupe par distance décroissante */ var groupByDistance = distanceMap.GroupBy(t => t.Value, t => t.Key).OrderByDescending(t => t.Key).ToList(); /* Prend le groupe des plus éloignés. */ var group = groupByDistance.First(); Console.WriteLine($"Distance du groupe le plus éloigné : {group.Key}"); /* Pour chaque vecteur du groupe, calcule celui qui a le plus de voisins proches */ var localDistanceSumMap = group.ToDictionary(v => v, v => vecteursRestant.Sum(w => data.MatriceSimilarite[v, w])); foreach (var t in localDistanceSumMap) { Console.WriteLine($"Somme distance : {t.Value}"); } /* Sélectionne celui qui a le plus de voisin proche = celui avec la plus petite somme de distance. */ var minSum = localDistanceSumMap.Min(t => t.Value); var prochainVecteur = localDistanceSumMap.First(t => t.Value == minSum).Key; return(prochainVecteur); }
public VecteurChanson Selectionne(VecteurChanson vecteurPrecedent, List <VecteurChanson> vecteursRestant, CalculData data) { /* Récupère les distances avec les vecteurs restants. */ var distanceMap = vecteursRestant.ToDictionary(v => v, v => data.MatriceSimilarite[vecteurPrecedent, v]); /* Trie par distance */ var vecteursRestantTries = distanceMap.OrderBy(t => t.Value).Select(t => t.Key).ToList(); /* Choisie le prochain vecteur comme étant le médian. */ return(vecteursRestantTries.Last()); }
public decimal this [VecteurChanson x, VecteurChanson y] { get { return(_map[new Tuple <int, int>(x.Id, y.Id)]); } set { _map[new Tuple <int, int>(x.Id, y.Id)] = value; } }
public decimal Calcule(VecteurChanson a, VecteurChanson b) { decimal buffer = 0; /* Parcourt les champs */ var fieldIdxList = a.Keys.ToList(); foreach (int fieldIdx in fieldIdxList) { /* Ajoute la distance : 0 ou 1. */ buffer += CalculeDistance(fieldIdx, a[fieldIdx], b[fieldIdx]); } return(buffer); }
public decimal Calcule(VecteurChanson a, VecteurChanson b) { double buffer = 0; /* Parcourt les champs */ var fieldIdxList = a.Keys.ToList(); foreach (int fieldIdx in fieldIdxList) { buffer += Math.Pow((double)(b[fieldIdx] - a[fieldIdx]), 2); } buffer = Math.Sqrt(buffer); return((decimal)buffer); }
public VecteurChanson Selectionne(VecteurChanson vecteurPrecedent, List <VecteurChanson> vecteursRestant, CalculData data) { /* Pour chaque vecteur restant, calcule celui qui a le plus de voisins proches */ var localDistanceSumMap = vecteursRestant.ToDictionary(v => v, v => vecteursRestant.Sum(w => data.MatriceSimilarite[v, w])); /* Groupe par somme croissante */ var groupByDistance = localDistanceSumMap.GroupBy(t => t.Value, t => t.Key).OrderBy(t => t.Key).ToList(); /* Prend le groupe avec les voisins les plus proches. */ var group = groupByDistance.First(); /* Prend l'élément le plus éloigné du vecteur précédent. */ var prochainVecteur = group.OrderBy(v => data.MatriceSimilarite[vecteurPrecedent, v]).Last(); return(prochainVecteur); }
public VecteurChanson CalculVecteurChanson(Chanson chanson) { if (chanson == null) { throw new ArgumentNullException(nameof(chanson)); } var vecteur = new VecteurChanson { Chanson = chanson }; vecteur[VecteurChanson.TempoKey] = chanson.Tempo; vecteur[VecteurChanson.GenreKey] = _genreMap[chanson.Genre]; vecteur[VecteurChanson.TypeKey] = _typeMap[chanson.Type]; vecteur[VecteurChanson.FrequenceKey] = _frequenceMap[chanson.Frequence]; return(vecteur); }