public void KMeansClusteringWorksOnTwoDimensions() { var dataSet = new IdentifiableDataPointCollection(); var p1 = new IdentifiableDataPoint(0, 2); var p2 = new IdentifiableDataPoint(1, 2); var p3 = new IdentifiableDataPoint(2, 2); var p4 = new IdentifiableDataPoint(3, 2); p1.AddAttribute("Gender", 1); p1.AddAttribute("Income", 1); p2.AddAttribute("Gender", 0); p2.AddAttribute("Income", 0.1429); p3.AddAttribute("Gender", 1); p3.AddAttribute("Income", 0.2858); p4.AddAttribute("Gender", 1); p4.AddAttribute("Income", 1); dataSet.AddItem(p1); dataSet.AddItem(p2); dataSet.AddItem(p3); dataSet.AddItem(p4); var kmeans2 = new KMeans(dataSet, new [] { 0, 1, 2 }, new EuclideanMetric()); var result2 = kmeans2.Calculate(); Assert.AreEqual(2, result2.Clusters[0].Members.Count); Assert.AreEqual(1, result2.Clusters[1].Members.Count); Assert.AreEqual(1, result2.Clusters[2].Members.Count); }
public void KMeansShouldCalculateCorrectCentroidsInOneDimension() { var dataSet = new IdentifiableDataPointCollection(); var p1 = new IdentifiableDataPoint(0, 1); var p2 = new IdentifiableDataPoint(1, 1); var p3 = new IdentifiableDataPoint(2, 1); var p4 = new IdentifiableDataPoint(3, 1); p1.AddAttribute("Gender", 1); p2.AddAttribute("Gender", 0); p3.AddAttribute("Gender", 1); p4.AddAttribute("Gender", 1); dataSet.AddItem(p1); dataSet.AddItem(p2); dataSet.AddItem(p3); dataSet.AddItem(p4); var kmeans2 = new KMeans(dataSet, new [] { 0, 1 }, new EuclideanMetric()); var result2 = kmeans2.Calculate(); double[] centroid1 = { 1 }; double[] centroid2 = { 0 }; Assert.AreEqual(centroid1, result2.Clusters[0].Centroid.Coordinates); Assert.AreEqual(centroid2, result2.Clusters[1].Centroid.Coordinates); }
public void KMeansShouldClusterDataPointsInOneDimensionCorrectly() { var dataSet = new IdentifiableDataPointCollection(); var p1 = new IdentifiableDataPoint(0, 1); var p2 = new IdentifiableDataPoint(1, 1); var p3 = new IdentifiableDataPoint(2, 1); var p4 = new IdentifiableDataPoint(3, 1); p1.AddAttribute("Gender", 1); p2.AddAttribute("Gender", 0); p3.AddAttribute("Gender", 1); p4.AddAttribute("Gender", 1); dataSet.AddItem(p1); dataSet.AddItem(p2); dataSet.AddItem(p3); dataSet.AddItem(p4); var kmeans2 = new KMeans(dataSet, new [] { 0, 1 }, new EuclideanMetric()); var result2 = kmeans2.Calculate(); var cluster1Members = result2.Clusters[0].Members.Select(e => e.Member).ToArray(); var cluster2Members = result2.Clusters[1].Members.Select(e => e.Member).ToArray(); Assert.AreEqual(3, cluster1Members.Length); Assert.Contains(p1, cluster1Members); Assert.Contains(p3, cluster1Members); Assert.Contains(p4, cluster1Members); Assert.AreEqual(1, cluster2Members.Length); Assert.Contains(p2, cluster2Members); }
static void RunProgram() { //Config string codeName = "Out-Cikade"; bool printKMeans = true; bool printKMeansMembers = false; bool distanceMatrix = true; bool multiDimensionalScaling = true; bool localOutlierFactor = true; IConfiguration configuration = (ConfigurationSectionHandler)ConfigurationManager.GetSection("csvDataImport"); var reader = new StreamReader("UserData.csv"); var importer = new CsvDataImporter(reader, configuration); var dataCollection = importer.Run(); //Algo// //KMeans var k = 5; var distanceMetric = new EuclideanMetric(); var kmeans = new KMeans(dataCollection, k, distanceMetric); var start = DateTime.Now; var result = kmeans.Calculate(); //Other alogs //File printing// var fileName = string.Format("{0}-{1:MM-dd_HH_mm_ss}.txt", codeName, DateTime.UtcNow); FileStream fs = new FileStream(fileName, FileMode.CreateNew); StreamWriter writer = new StreamWriter(fs); writer.Write("Testrun under CodeName {0}. \r\n\r\n", codeName, DateTime.UtcNow); if (printKMeans) { PrintKMeans(writer, result, printKMeansMembers); } if (distanceMatrix) { DistanceMatrix(writer, dataCollection, distanceMetric); } if (multiDimensionalScaling) { MultiDimensionalScaling(writer, dataCollection, distanceMetric); } if (localOutlierFactor) { LocalOutlierFactorD(4, dataCollection, distanceMetric); } writer.Close(); fs.Close(); }
public void KMeansCentroidsArePlacedRightInFiveDimensions() { var dataSet = new IdentifiableDataPointCollection(); var p1 = new IdentifiableDataPoint(0, 5); var p2 = new IdentifiableDataPoint(1, 5); var p3 = new IdentifiableDataPoint(2, 5); var p4 = new IdentifiableDataPoint(3, 5); p1.AddAttribute("Gender", 1); p1.AddAttribute("Income", 1); p1.AddAttribute("Age", 0.16); p1.AddAttribute("Purchase", 0.5); p1.AddAttribute("Control", 1); p2.AddAttribute("Gender", 0); p2.AddAttribute("Income", 0.1429); p2.AddAttribute("Age", 0.16); p2.AddAttribute("Purchase", 1); p2.AddAttribute("Control", 0); p3.AddAttribute("Gender", 1); p3.AddAttribute("Income", 0.2858); p3.AddAttribute("Age", 0.16); p3.AddAttribute("Purchase", 1); p3.AddAttribute("Control", 1); p4.AddAttribute("Gender", 1); p4.AddAttribute("Income", 1); p4.AddAttribute("Age", 0.16); p4.AddAttribute("Purchase", 1); p4.AddAttribute("Control", 0.5); dataSet.AddItem(p1); dataSet.AddItem(p2); dataSet.AddItem(p3); dataSet.AddItem(p4); var kmeans2 = new KMeans(dataSet, new [] { 0, 1, 2 }, new EuclideanMetric()); var result2 = kmeans2.Calculate(); double[] _centroid1 = { 1, 0.2858, 0.16, 1, 1 }; double[] _centroid2 = { 1, 1, 0.16, 0.75, 0.75 }; double[] _centroid3 = { 0, 0.1429, 0.16, 1, 0 }; Assert.AreEqual(_centroid2, result2.Clusters[0].Centroid.Coordinates); Assert.AreEqual(_centroid3, result2.Clusters[1].Centroid.Coordinates); Assert.AreEqual(_centroid1, result2.Clusters[2].Centroid.Coordinates); }
private ClusteringResult ClusterCalculate() { int inputClusterNumber = Convert.ToInt32(numberOfClusters.Value); string inputClusterAlgo = cbClusteringAlgo.Text; currentClusterNumber = inputClusterNumber; /* Choosing clustering algorithm without name filter */ switch (inputClusterAlgo) { case "K-means": currentClusterAlgorithm = inputClusterAlgo; kmeans = new KMeans(this.dataSet, currentClusterNumber, distanceMetric); return(kmeans.Calculate()); default: currentClusterAlgorithm = inputClusterAlgo; kmeans = new KMeans(this.dataSet, currentClusterNumber, distanceMetric); return(kmeans.Calculate()); } }
private void bw_DoWork(object sender, DoWorkEventArgs e) { bool changed; bool drawLine = checkBox1.Checked; uint currentIteration = 0; BackgroundWorker worker = sender as BackgroundWorker; KMeans kmeans = new KMeans(_maxmin._points, _maxmin._clusters); do { currentIteration++; label5.Invoke(new Action(delegate() { label5.Text = currentIteration.ToString(); label5.Update(); })); lock (_sync) { _graphicsBuffer.Graphics.Clear(BackColor); kmeans.DrawClusters(_graphicsBuffer.Graphics, drawLine); _graphicsBuffer.Render(); } if (_bw.CancellationPending == true) { button2.Invoke(new Action(delegate() { button2.Text = "Стоп"; button2.Update(); })); break; } changed = kmeans.Calculate(); } while (changed); }