//public static Int64 attributes_num; static void Main(string[] args) { MyCustomDatasetItem[] featureData = { }; List <MyCustomDatasetItem> testPoints = new List <MyCustomDatasetItem>(); //Dictionary<string, List<Tuple<string, double>>> testPoints = new Dictionary<string, List<Tuple<string, double>>>(); StreamReader lines = new StreamReader(@"B:\TrendQuery\output.txt");//Source\tTarget\tWeight string line; Int64 row = 22; List <Int64> columns = new List <Int64>(); List <double> data = new List <double>(); //attributes_num = 0; //set points //List<string> nodes = new List<string>(); while ((line = lines.ReadLine()) != null) { string[] tmp = line.Split('\t'); int indx = contains_MDS(testPoints, tmp[0]); if (indx == -1) { testPoints.Add(new MyCustomDatasetItem(tmp[0])); } else { testPoints[indx].Columns.Add(tmp[1], double.Parse(tmp[2])); } indx = contains_MDS(testPoints, tmp[1]); if (indx == -1) { testPoints.Add(new MyCustomDatasetItem(tmp[1])); } else { testPoints[indx].Columns.Add(tmp[0], double.Parse(tmp[2])); } } featureData = testPoints.ToArray(); HashSet <MyCustomDatasetItem[]> clusters; var dbs = new DbscanAlgorithm <MyCustomDatasetItem>(((x, y) => Distances.dist(x, y)));//Math.Sqrt(((x.X - y.X) * (x.X - y.X)) + ((x.Y - y.Y) * (x.Y - y.Y)))); dbs.ComputeClusterDbscan(allPoints: featureData, epsilon: 200, minPts: 10, clusters: out clusters); List <string> cluster_points = new List <string>(); int k = 1; foreach (var cluster in clusters) { for (int i = 0; i < cluster.Length; i++) { cluster_points.Add(cluster[i].Row.ToString() + "\t" + k.ToString()); } k++; } File.WriteAllLines(@"B:\TrendQuery\DBSClusters.txt", cluster_points.ToArray <string>()); }
static void Main(string[] args) { MyCustomDatasetItem[] featureData = { }; List <MyCustomDatasetItem> testPoints = new List <MyCustomDatasetItem>(); for (int i = 0; i < 1000; i++) { //points around (1,1) with most 1 distance testPoints.Add(new MyCustomDatasetItem(1, 1 + ((float)i / 1000))); testPoints.Add(new MyCustomDatasetItem(1, 1 - ((float)i / 1000))); testPoints.Add(new MyCustomDatasetItem(1 - ((float)i / 1000), 1)); testPoints.Add(new MyCustomDatasetItem(1 + ((float)i / 1000), 1)); //points around (5,5) with most 1 distance testPoints.Add(new MyCustomDatasetItem(5, 5 + ((float)i / 1000))); testPoints.Add(new MyCustomDatasetItem(5, 5 - ((float)i / 1000))); testPoints.Add(new MyCustomDatasetItem(5 - ((float)i / 1000), 5)); testPoints.Add(new MyCustomDatasetItem(5 + ((float)i / 1000), 5)); } featureData = testPoints.ToArray(); HashSet <MyCustomDatasetItem[]> clusters; var dbs = new DbscanAlgorithm <MyCustomDatasetItem>((x, y) => Math.Sqrt(((x.X - y.X) * (x.X - y.X)) + ((x.Y - y.Y) * (x.Y - y.Y)))); dbs.ComputeClusterDbscan(allPoints: featureData, epsilon: .01, minPts: 10, clusters: out clusters); }
// Called by LandMap.GetZones (), returns number of subregions public int ClusterLocationsDBSCAN(float epsilon, int minPts, MapPoint[,] points, TerrainVerticesDatabase vertDatabase) { // DBSCAN cluster algorithm to separate locations in the regions int regionId = 0; for (int isleId = 0; isleId < regions.Count; isleId++) { MapRegion region = regions[isleId]; List <TilePoint> tileLocations = new List <TilePoint> (); for (int i = 0; i < region.turf.Count; i++) { TerrainVertData vertData = vertDatabase.GetVertDataFromRegionTile(region.turf[i], isleId); if (vertData != null) { tileLocations.Add(new TilePoint(region.turf[i].x, vertData.inlandPosition, region.turf[i].y)); } else { LoggerTool.Post("Null from VertDB for " + region.turf[i].ToString()); } } HashSet <TilePoint[]> clusters; var dbscan = new DbscanImplementation.DbscanAlgorithm <TilePoint> ((t1, t2) => TilePoint.Dist(t1, t2)); dbscan.ComputeClusterDbscan(allPoints: tileLocations.ToArray(), epsilon: epsilon, minPts: minPts, clusters: out clusters); int k = clusters.Count; Debug.Log("Number of clusters = " + k); int clstCount = 0; foreach (var tiles in clusters) { for (int i = 0; i < tiles.Length; i++) { points[(int)tiles[i].X, (int)tiles[i].Z].areaValue = regionId + clstCount; } clstCount++; } regionId += k; } return(regionId); }