コード例 #1
0
 public bool IsFar(ZVector3d zVector, InitialCluster3d c)
 {
     double dif;
     for (int j = 0; j < c.ZVectors.Count; j++)
     {
         dif = Math.Abs(zVector.Num - c.ZVectors[j].Num);
         if (dif < dimension)
         {
             return false;
         }
     }
     return true;
 }
コード例 #2
0
        //Проверка на значимость
        private bool Check3(InitialCluster3d c)
        {
            int count = c.ZVectors.Count;
            double cur;
            for (int i = 0; i < count; i++)
            {
                for (int j = 0; j < count; j++)
                {
                    if (i == j) continue;

                    cur = Math.Abs(px[i] - px[j]);
                    if (cur >= h)
                    {
                        return true;
                    }
                }
            }
            return false;
        }
コード例 #3
0
        //For Vector3
        public IReadOnlyList<InitialCluster3d> Clusterize(IReadOnlyList<ZVector3d> zVectors)
        {
            Prepare3(zVectors);

            double e = 0.000001;
            clusters.Add(new InitialCluster3d());
            for (int i = 0; i < n; i++)
            {
                ZVector3d xi = x[i];

                List<double> Ui = BuildU3(i);//Строим вершины графа

                //находим номера l классов, которые содержат точки, с которыми связана xi
                List<int> l = new List<int>();
                for (int j = 0; j < Ui.Count; j++)
                {
                    if (Ui[j] > e) //xi связанна с xj
                    {
                        int wxj = w3(x[j]);
                        if (wxj != -1 && (!l.Contains(wxj)) && IsFar(xi, clusters[wxj]))
                        {
                            l.Add(wxj);
                        }
                    }
                }

                //(3.1)
                if (l.Count == 0)
                {
                    clusters.Add(new InitialCluster3d(xi));
                    continue;
                }
                //(3.2)
                if (l.Count == 1)
                {
                    if (clusters[l[0]].IsFormed)
                    {
                        clusters[0].Add(xi);
                    }
                    else
                    {
                        clusters[l[0]].Add(xi);
                    }
                    continue;
                }
                //(3.3)
                //проверяем сколько классов сформировано
                int tmp = 1;
                for (; tmp < clusters.Count; tmp++)
                {
                    if (!clusters[tmp].IsFormed)
                    { break; }
                }
                //(3.3.1)
                if (tmp == clusters.Count) //все классы сформированы
                {
                    clusters[0].Add(xi);
                    continue;
                }
                //(3.3.2)
                int zh = z3(l);
                l.Sort();
                //a)
                if (zh > 1 || l[0] == 0)
                {
                    clusters[0].Add(xi);

                    for (int j = clusters.Count - 1; j >= 1; j--)
                    {
                        InitialCluster3d c = clusters[j];
                        if (Check3(c))
                        {
                            c.IsFormed = true;
                        }
                        else
                        {
                            clusters[0].Add(c.ZVectors);
                            clusters.Remove(c);
                        }
                    }
                }
                else //b)
                {
                    for (int j = l.Count - 1; j > 0; j--)
                    {
                        clusters[l[0]].Add(clusters[l[j]].ZVectors);
                        clusters.Remove(clusters[l[j]]);
                    }
                    clusters[l[0]].Add(xi);
                }

            }

            clusters.Remove(clusters[0]);
            //foreach (var cluster in clusters)
            //{
            //    cluster.SetCentr();
            //}
            return clusters;
        }