Exemplo n.º 1
0
        private double CalculeDistInterClasse(Classe c1, Classe c2)
        {
            double bestdist = 1000;

            foreach (Neurone n1 in c1.GetNeurones())
            {
                foreach (Neurone n2 in c2.GetNeurones())
                {
                    double dist = n1.DistInterNeurone(n2);
                    if (dist < bestdist)
                    {
                        bestdist = dist;
                    }
                }
            }
            return(bestdist);
        }
Exemplo n.º 2
0
        public void regroupement(List <Observation> lobs, int nbclasses)
        {
            // Recherche des neurones qui ne gagnent jamais ou presque jamais
            int[,] comptage = new int[nblignes, nbcol];
            for (int i = 0; i < nblignes; i++)
            {
                for (int j = 0; j < nbcol; j++)
                {
                    comptage[i, j] = 0;
                }
            }

            foreach (Observation obs in lobs)
            {
                double minerreur = 100000;
                int    besti = 0; int bestj = 0;
                for (int i = 0; i < nblignes; i++)
                {
                    for (int j = 0; j < nbcol; j++)
                    {
                        double erreur = tab[i, j].CalculeErreur(obs);
                        if (erreur < minerreur)
                        {
                            besti     = i; bestj = j;
                            minerreur = erreur;
                        }
                    }
                }
                comptage[besti, bestj]++;
            }


            // Initialisation des classes
            for (int i = 0; i < nblignes; i++)
            {
                for (int j = 0; j < nbcol; j++)
                {
                    if (comptage[i, j] > 5)
                    {
                        Form1.listclasses.Add(new Classe(tab[i, j]));
                    }
                }
            }


            // Fusion des classes; critère le plus simple : distance interclasse
            do
            {
                Classe bestc1  = Form1.listclasses[0];
                Classe bestc2  = Form1.listclasses[1];
                double distmin = 1000000;
                foreach (Classe c1 in Form1.listclasses)
                {
                    foreach (Classe c2 in Form1.listclasses)
                    {
                        if (c1 != c2)
                        {
                            double dist = CalculeDistInterClasse(c1, c2);
                            if (dist < distmin)
                            {
                                distmin = dist;
                                bestc1  = c1;
                                bestc2  = c2;
                            }
                        }
                    }
                }
                // Fusion des 2 classes les plus proches
                bestc1.FusionAvec(bestc2);
                Form1.listclasses.Remove(bestc2);
            }while (Form1.listclasses.Count > nbclasses);
        }