Ejemplo n.º 1
0
        /// <summary>
        /// Gets maximum of all gaussian distributions for specified song
        /// </summary>
        /// <param name="data">Song</param>
        public double GetGaussianValue(DataElement data)
        {
            if (!AfterLearning)
            {
                throw new NotSupportedException("Could not get GMM value before learning phase!");
            }
            if (!data.HasFeaturesExtracted())
            {
                data.GetFeatures();
            }
            double max = em.GetGaussianMixtureMax(data.MfccCoefficients);

            return(max);
        }
Ejemplo n.º 2
0
        public override SongGenre GetClass(DataElement testedData)
        {
            base.GetClass(testedData);
            if (!testedData.HasFeaturesExtracted())
            {
                testedData.GetFeatures();
            }

            for (int i = 0; i < TrainingData.Count; i++)
            {
                TrainingData[i].GetDistance(testedData);
            }
            TrainingData.Sort((data1, data2) => data1.NeighbourDistance.CompareTo(data2.NeighbourDistance));

            List <int>         labelHistogram    = new int[Enum.GetNames(typeof(SongGenre)).Length].ToList();
            List <DataElement> nearestNeighbours = TrainingData.GetRange(0, K);

            foreach (DataElement neighbour in nearestNeighbours)
            {
                SongGenre genre = neighbour.GetClass();
                labelHistogram[(int)genre]++;
            }

            int        max          = labelHistogram.Max();
            List <int> nearestGenre = new List <int>();

            for (int i = 0; i < labelHistogram.Count; i++)
            {
                if (labelHistogram[i] == max)
                {
                    nearestGenre.Add(i);
                }
            }
            nearestNeighbours.RemoveAll(data => !nearestGenre.Contains((int)data.GetClass()));
            Random r = new Random();

            testedData.Probability = 1.0;
            return(nearestNeighbours[r.Next(nearestNeighbours.Count)].GetClass());
        }