Exemple #1
0
 public DBSCAN(int MinPts, double radius)
 {
     _MinPts       = MinPts;
     _radius       = radius;
     GetDistance   = (a, b) => DistanceFunctions.HaversineDistance(a, b).DistanceInMeters;
     IsCloseEnough = (a, b, c) => (GetDistance(a, b) < (Math.Exp(-Math.Pow(c, 0.6) / 40) * _radius));
 }
Exemple #2
0
        public List <Cluster <T> > Cluster(List <Coord> points, List <T> data)
        {
            int n = points.Count();
            // we need n x c - many random numbers to initialize membership
            Random random = new Random(7);

            double[,] U = new double[n, _c];
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < _c; j++)
                {
                    U[i, j] = random.NextDouble();
                }
            }
            List <Coord> centers = new List <Coord>();

            double lowerLat = points.Min(x => x.Latitude);
            double lowerLon = points.Min(x => x.Longitude);

            double upperLat = points.Max(x => x.Latitude);
            double upperLon = points.Max(x => x.Longitude);

            for (int i = 0; i < _c; i++)
            {
                double RandomLat    = random.NextDouble() * (upperLat - lowerLat) + lowerLat;
                double RandomLon    = random.NextDouble() * (upperLon - lowerLon) + lowerLon;
                Coord  randomCenter = new Coord(RandomLat, RandomLon);

                centers.Add(randomCenter);
            }

            for (int p = 0; p < _maxiters; p++)
            {
                //update centers
                for (int i = 0; i < _c; i++)
                {
                    double firstvalue_lat = SumColumnExponentiatedAndMultiplyWithData_Latitude(U, points, i, _m);
                    double firstvalue_lon = SumColumnExponentiatedAndMultiplyWithData_Longitude(U, points, i, _m);
                    double secondvalue    = SumColumnExponentiated(U, i, _m); //sum over the n rows of U raised to power m
                    if (secondvalue < 0.00001)
                    {
                        secondvalue = 0.00001;
                    }
                    //putting this in to see what happens
                    double new_lat = firstvalue_lat / secondvalue;
                    double new_lon = firstvalue_lon / secondvalue;
                    if (!Double.IsNaN(new_lat) && !Double.IsNaN(new_lat))
                    {
                        centers[i].Latitude  = new_lat;
                        centers[i].Longitude = new_lon;
                    }
                    else
                    {
                        //Console.WriteLine("Paused");
                    }
                }

                //update membership matrix U
                for (int i = 0; i < n; i++)
                {
                    for (int j = 0; j < _c; j++)
                    {
                        //double theijconstantweneed = Math.Pow(DistanceFunctions.HaversineDistance(points[i], centers[j]).DistanceInMeters, 2 / (_m - 1));
                        double theijconstantweneed = Math.Pow(DistanceFunctions.HaversineDistance(points[i], centers[j]).DistanceInMeters, 2 / (_m - 1));
                        //double theijconstantweneed = Math.Pow(DistanceFunctions.LawOfCosinesDistance(points[i], centers[j]).DistanceInMeters, 2 / (_m - 1));
                        //double theijconstantweneed = Math.Pow(DistanceFunctions.ApproximateDistance(points[i], centers[j]).DistanceInMeters, 2 / (_m - 1));
                        double denominator = 0.0;
                        for (int k = 0; k < _c; k++)
                        {
                            //denominator += theijconstantweneed / Math.Pow(DistanceFunctions.HaversineDistance(points[i], centers[k]).DistanceInMeters, 2 / (_m - 1));
                            denominator += theijconstantweneed / Math.Pow(DistanceFunctions.HaversineDistance(points[i], centers[k]).DistanceInMeters, 2 / (_m - 1));
                            //denominator += theijconstantweneed / Math.Pow(DistanceFunctions.LawOfCosinesDistance(points[i], centers[k]).DistanceInMeters, 2 / (_m - 1));
                            //denominator += theijconstantweneed / Math.Pow(DistanceFunctions.ApproximateDistance(points[i], centers[k]).DistanceInMeters, 2 / (_m - 1));
                        }
                        //if (denominator == 0)
                        //{
                        //    denominator = 0.00001;
                        //}
                        U[i, j] = 1 / denominator;
                    }
                }
            }
            var asdsjhf = new List <T> [_c];

            for (int i = 0; i < _c; i++)
            {
                asdsjhf[i] = new List <T>();
            }
            for (int i = 0; i < n; i++)
            {
                int k            = 0;
                var not_smallest = U[i, k];
                for (int j = 0; j < _c; j++)
                {
                    if (U[i, j] > not_smallest)
                    {
                        not_smallest = U[i, j];
                        k            = j;
                    }
                }
                asdsjhf[k].Add(data[i]);
            }
            var retstuff = new List <Cluster <T> >();

            for (int j = 0; j < _c; j++)
            {
                var gjhh = new Cluster <T>(centers[j], asdsjhf[j]);
                retstuff.Add(gjhh);
            }

            return(retstuff);
        }