static void Knn() { IPoints points = Dataset.LoadDataset(@"c:\temp\points.csv"); // Used for testing K nearest neighbor IPointsKnn dataset = new PointsKnn(); dataset.Data.AddRange(points.Data.Select(i => i as IPKnn)); // Used for testing K nearest neighbor var rect = new SingleDetectLibrary.Code.Data.Rectangle { XMin = -180, XMax = 180, YMin = -90, YMax = 90, MaxDistance = 20, }; rect.Validate(); const int k = 3; IAlgorithm algo = new Algorithm(dataset, rect, StrategyType.Grid); var origin = new SingleDetectLibrary.Code.Data.P { X = 0, Y = 0 }; algo.UpdateIndex(origin); var duration = algo.UpdateKnn(origin, new KnnConfiguration { K = k }); // Print result CW(string.Format("{0} msec. {1}:", algo.Strategy.Name, duration)); CW("K Nearest Neighbors:"); CW(string.Format("Origin: {0}", origin)); CW(string.Format("Distance sum: {0}", algo.Knn.GetDistanceSum())); algo.Knn.NNs.OrderBy(i => i.Distance).ToList().ForEach(CW); // Update strategy algo.SetAlgorithmStrategy(new NaiveStrategy()); // Use algo duration = algo.UpdateKnn(origin, new KnnConfiguration { K = k }); // Print result CW(string.Format("\n{0} msec. {1}:", algo.Strategy.Name, duration)); CW("K Nearest Neighbors:"); CW(string.Format("Distance sum: {0}", algo.Knn.GetDistanceSum())); algo.Knn.NNs.OrderBy(i => i.Distance).ToList().ForEach(CW); }
// Example of usage: // Get 3 nearest -> /AreaGMC/gmc.svc/Knn/lat=8_5;lon=10_25;k=3 // Get 3 nearest type 1 -> /AreaGMC/gmc.svc/Knn/lat=8_5;lon=10_25;k=3;type=1 // Get nearest within 1 km -> /AreaGMC/gmc.svc/Knn/lat=8_5;lon=10_25;k=1000000;dist=1 public JsonKnnReply Knn(string s) { var sw = new Stopwatch(); sw.Start(); var invalid = new JsonKnnReply {}; if (string.IsNullOrEmpty(s)) { invalid.EMsg = "param is empty"; return invalid; } var arr = s.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries); if (arr.Length < 3) { invalid.EMsg = string.Format("param length is not valid: {0}",arr.Length); return invalid; } var nvc = new NameValueCollection(); foreach (var a in arr) { var kv = a.Split(new[] { "=" }, StringSplitOptions.RemoveEmptyEntries); if (kv.Length != 2) continue; nvc.Add(kv[0], kv[1]); } foreach (var key in Ajax.KnnReq) { if (nvc[key] != null) continue; invalid.EMsg = string.Format("param {0} is missing", key); return invalid; } try { var y = nvc[Ajax.lat].Replace("_", ".").ToDouble(); var x = nvc[Ajax.lon].Replace("_", ".").ToDouble(); var k = int.Parse(nvc[Ajax.k]); var type = nvc[Ajax.type] == null ? -1 : int.Parse(nvc[Ajax.type]); double? dist = null; if(! string.IsNullOrEmpty(nvc[Ajax.dist])) dist = nvc[Ajax.dist].Replace("_", ".").ToDouble(); // knn algo var algo = MemoryDatabase.Data as IKnnAlgorithm; if (algo == null) { invalid.EMsg = "algorithm is not available"; return invalid; } // Use algo var origin = new SingleDetectLibrary.Code.Data.P { X = x, Y = y, Type = type }; var knnSameTypeOnly = type != -1; var conf = new KnnConfiguration {K = k, SameTypeOnly = knnSameTypeOnly, MaxDistance = dist}; var duration = algo.UpdateKnn(origin, conf); var nns = algo.Knn.NNs.Select(p => p as PDist).ToList(); var gmsNns = new List<GmcPDist>(); foreach (var i in nns) { //i.Distance = Math.Round(i.Distance, 7); var pdist = new GmcPDist { Id = i.Point.Uid.ToString(), Point = i.Point, Distance = Math.Round(i.Distance, 7) }; gmsNns.Add(pdist); } var result = new JsonKnnReply { Data = string.Format("Distance in km, x: {0}; y: {1}; k: {2}; sameTypeOnly: {3}, algo msec: {4}", x.DoubleToString(), y.DoubleToString(), k, knnSameTypeOnly, duration), Nns = gmsNns, // cannot be interface, thus casting Msec = Sw(sw), }; return result; } catch (Exception ex) { invalid.EMsg = string.Format("Parsing error param: {0}", ex.Message); return invalid; } }
static void Knn() { IPoints points = Dataset.LoadDataset(@"c:\temp\points.csv"); // Used for testing K nearest neighbor IPointsKnn dataset = new PointsKnn(); dataset.Data.AddRange(points.Data.Select(i => i as IPKnn)); // Used for testing K nearest neighbor var rect = new SingleDetectLibrary.Code.Data.Rectangle { XMin = -180, XMax = 180, YMin = -90, YMax = 90, MaxDistance = 20, }; rect.Validate(); const int k = 3; IAlgorithm algo = new Algorithm(dataset, rect, StrategyType.Grid); var origin = new SingleDetectLibrary.Code.Data.P { X = 0, Y = 0 }; algo.UpdateIndex(origin); var duration = algo.UpdateKnn(origin, new KnnConfiguration{K = k}); // Print result CW(string.Format("{0} msec. {1}:", algo.Strategy.Name, duration)); CW("K Nearest Neighbors:"); CW(string.Format("Origin: {0}", origin)); CW(string.Format("Distance sum: {0}", algo.Knn.GetDistanceSum())); algo.Knn.NNs.OrderBy(i => i.Distance).ToList().ForEach(CW); // Update strategy algo.SetAlgorithmStrategy(new NaiveStrategy()); // Use algo duration = algo.UpdateKnn(origin, new KnnConfiguration{K = k}); // Print result CW(string.Format("\n{0} msec. {1}:", algo.Strategy.Name, duration)); CW("K Nearest Neighbors:"); CW(string.Format("Distance sum: {0}", algo.Knn.GetDistanceSum())); algo.Knn.NNs.OrderBy(i => i.Distance).ToList().ForEach(CW); }
// Example of usage: // Get 3 nearest -> /AreaGMC/gmc.svc/Knn/lat=8_5;lon=10_25;k=3 // Get 3 nearest type 1 -> /AreaGMC/gmc.svc/Knn/lat=8_5;lon=10_25;k=3;type=1 // Get nearest within 1 km -> /AreaGMC/gmc.svc/Knn/lat=8_5;lon=10_25;k=1000000;dist=1 public JsonKnnReply Knn(string s) { var sw = new Stopwatch(); sw.Start(); var invalid = new JsonKnnReply { }; if (string.IsNullOrEmpty(s)) { invalid.EMsg = "param is empty"; return(invalid); } var arr = s.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries); if (arr.Length < 3) { invalid.EMsg = string.Format("param length is not valid: {0}", arr.Length); return(invalid); } var nvc = new NameValueCollection(); foreach (var a in arr) { var kv = a.Split(new[] { "=" }, StringSplitOptions.RemoveEmptyEntries); if (kv.Length != 2) { continue; } nvc.Add(kv[0], kv[1]); } foreach (var key in Ajax.KnnReq) { if (nvc[key] != null) { continue; } invalid.EMsg = string.Format("param {0} is missing", key); return(invalid); } try { var y = nvc[Ajax.lat].Replace("_", ".").ToDouble(); var x = nvc[Ajax.lon].Replace("_", ".").ToDouble(); var k = int.Parse(nvc[Ajax.k]); var type = nvc[Ajax.type] == null ? -1 : int.Parse(nvc[Ajax.type]); double?dist = null; if (!string.IsNullOrEmpty(nvc[Ajax.dist])) { dist = nvc[Ajax.dist].Replace("_", ".").ToDouble(); } // knn algo var algo = MemoryDatabase.Data as IKnnAlgorithm; if (algo == null) { invalid.EMsg = "algorithm is not available"; return(invalid); } // Use algo var origin = new SingleDetectLibrary.Code.Data.P { X = x, Y = y, Type = type }; var knnSameTypeOnly = type != -1; var conf = new KnnConfiguration { K = k, SameTypeOnly = knnSameTypeOnly, MaxDistance = dist }; var duration = algo.UpdateKnn(origin, conf); var nns = algo.Knn.NNs.Select(p => p as PDist).ToList(); var gmsNns = new List <GmcPDist>(); foreach (var i in nns) { //i.Distance = Math.Round(i.Distance, 7); var pdist = new GmcPDist { Id = i.Point.Uid.ToString(), Point = i.Point, Distance = Math.Round(i.Distance, 7) }; gmsNns.Add(pdist); } var result = new JsonKnnReply { Data = string.Format("Distance in km, x: {0}; y: {1}; k: {2}; sameTypeOnly: {3}, algo msec: {4}", x.DoubleToString(), y.DoubleToString(), k, knnSameTypeOnly, duration), Nns = gmsNns, // cannot be interface, thus casting Msec = Sw(sw), }; return(result); } catch (Exception ex) { invalid.EMsg = string.Format("Parsing error param: {0}", ex.Message); return(invalid); } }