public void Aggregate(IDataPointCollection data, int index) { DataPointCollection concreteData = (DataPointCollection)(data); // Always aggregate density statistics GaussianAggregator2d.Aggregate(data, index); // Only aggregate histogram statistics for those data points that have class labels if (concreteData.GetIntegerLabel((int)(index)) != DataPointCollection.UnknownClassLabel) { HistogramAggregator.Aggregate(data, index); } }
public static Bitmap Visualize <F>( Forest <F, HistogramAggregator> forest, DataPointCollection trainingData, Size PlotSize, PointF PlotDilation) where F : IFeatureResponse { // Size PlotSize = new Size(300, 300), PointF PlotDilation = new PointF(0.1f, 0.1f) // Generate some test samples in a grid pattern (a useful basis for creating visualization images) PlotCanvas plotCanvas = new PlotCanvas(trainingData.GetRange(0), trainingData.GetRange(1), PlotSize, PlotDilation); DataPointCollection testData = DataPointCollection.Generate2dGrid(plotCanvas.plotRangeX, PlotSize.Width, plotCanvas.plotRangeY, PlotSize.Height); Console.WriteLine("\nApplying the forest to test data..."); int[][] leafNodeIndices = forest.Apply(testData); // Form a palette of random colors, one per class Color[] colors = new Color[Math.Max(trainingData.CountClasses(), 4)]; // First few colours are same as those in the book, remainder are random. colors[0] = Color.FromArgb(183, 170, 8); colors[1] = Color.FromArgb(194, 32, 14); colors[2] = Color.FromArgb(4, 154, 10); colors[3] = Color.FromArgb(13, 26, 188); Color grey = Color.FromArgb(255, 127, 127, 127); System.Random r = new Random(0); // same seed every time so colours will be consistent for (int c = 4; c < colors.Length; c++) { colors[c] = Color.FromArgb(255, r.Next(0, 255), r.Next(0, 255), r.Next(0, 255)); } // Create a visualization image Bitmap result = new Bitmap(PlotSize.Width, PlotSize.Height); // For each pixel... int index = 0; for (int j = 0; j < PlotSize.Height; j++) { for (int i = 0; i < PlotSize.Width; i++) { // Aggregate statistics for this sample over all leaf nodes reached HistogramAggregator h = new HistogramAggregator(trainingData.CountClasses()); for (int t = 0; t < forest.TreeCount; t++) { int leafIndex = leafNodeIndices[t][index]; h.Aggregate(forest.GetTree(t).GetNode(leafIndex).TrainingDataStatistics); } // Let's muddy the colors with grey where the entropy is high. float mudiness = 0.5f * (float)(h.Entropy()); float R = 0.0f, G = 0.0f, B = 0.0f; for (int b = 0; b < trainingData.CountClasses(); b++) { float p = (1.0f - mudiness) * h.GetProbability(b); // NB probabilities sum to 1.0 over the classes R += colors[b].R * p; G += colors[b].G * p; B += colors[b].B * p; } R += grey.R * mudiness; G += grey.G * mudiness; B += grey.B * mudiness; Color c = Color.FromArgb(255, (byte)(R), (byte)(G), (byte)(B)); result.SetPixel(i, j, c); // painfully slow but safe index++; } } // Also draw the original training data using (Graphics g = Graphics.FromImage(result)) { g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; for (int s = 0; s < trainingData.Count(); s++) { PointF x = new PointF( (trainingData.GetDataPoint(s)[0] - plotCanvas.plotRangeX.Item1) / plotCanvas.stepX, (trainingData.GetDataPoint(s)[1] - plotCanvas.plotRangeY.Item1) / plotCanvas.stepY); RectangleF rectangle = new RectangleF(x.X - 3.0f, x.Y - 3.0f, 6.0f, 6.0f); g.FillRectangle(new SolidBrush(colors[trainingData.GetIntegerLabel(s)]), rectangle); g.DrawRectangle(new Pen(Color.Black), rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); } } return(result); }
public static Bitmap VisualizeLabels(Forest <LinearFeatureResponse2d, SemiSupervisedClassificationStatisticsAggregator> forest, DataPointCollection trainingData, Size PlotSize, PointF PlotDilation) { // Generate some test samples in a grid pattern (a useful basis for creating visualization images) PlotCanvas plotCanvas = new PlotCanvas(trainingData.GetRange(0), trainingData.GetRange(1), PlotSize, PlotDilation); // Apply the trained forest to the test data Console.WriteLine("\nApplying the forest to test data..."); DataPointCollection testData = DataPointCollection.Generate2dGrid(plotCanvas.plotRangeX, PlotSize.Width, plotCanvas.plotRangeY, PlotSize.Height); int[][] leafNodeIndices = forest.Apply(testData); Bitmap result = new Bitmap(PlotSize.Width, PlotSize.Height); // Paint the test data GaussianPdf2d[][] leafDistributions = new GaussianPdf2d[forest.TreeCount][]; for (int t = 0; t < forest.TreeCount; t++) { leafDistributions[t] = new GaussianPdf2d[forest.GetTree(t).NodeCount]; for (int i = 0; i < forest.GetTree(t).NodeCount; i++) { Node <LinearFeatureResponse2d, SemiSupervisedClassificationStatisticsAggregator> nodeCopy = forest.GetTree(t).GetNode(i); if (nodeCopy.IsLeaf) { leafDistributions[t][i] = nodeCopy.TrainingDataStatistics.GaussianAggregator2d.GetPdf(); } } } // Form a palette of random colors, one per class Color[] colors = new Color[Math.Max(trainingData.CountClasses(), 4)]; // First few colours are same as those in the book, remainder are random. colors[0] = Color.FromArgb(183, 170, 8); colors[1] = Color.FromArgb(194, 32, 14); colors[2] = Color.FromArgb(4, 154, 10); colors[3] = Color.FromArgb(13, 26, 188); Color grey = Color.FromArgb(255, 127, 127, 127); System.Random r = new Random(0); // same seed every time so colours will be consistent for (int c = 4; c < colors.Length; c++) { colors[c] = Color.FromArgb(255, r.Next(0, 255), r.Next(0, 255), r.Next(0, 255)); } int index = 0; for (int j = 0; j < PlotSize.Height; j++) { for (int i = 0; i < PlotSize.Width; i++) { // Aggregate statistics for this sample over all leaf nodes reached HistogramAggregator h = new HistogramAggregator(trainingData.CountClasses()); for (int t = 0; t < forest.TreeCount; t++) { int leafIndex = leafNodeIndices[t][index]; SemiSupervisedClassificationStatisticsAggregator a = forest.GetTree(t).GetNode(leafIndex).TrainingDataStatistics; h.Aggregate(a.HistogramAggregator); } // Let's muddy the colors with a little grey where entropy is high. float mudiness = 0.5f * (float)(h.Entropy()); float R = 0.0f, G = 0.0f, B = 0.0f; for (int b = 0; b < trainingData.CountClasses(); b++) { float p = (1.0f - mudiness) * h.GetProbability(b); // NB probabilities sum to 1.0 over the classes R += colors[b].R * p; G += colors[b].G * p; B += colors[b].B * p; } R += grey.R * mudiness; G += grey.G * mudiness; B += grey.B * mudiness; Color c = Color.FromArgb(255, (byte)(R), (byte)(G), (byte)(B)); result.SetPixel(i, j, c); index++; } } PaintTrainingData(trainingData, plotCanvas, result); return(result); }