public static void DrawTSNE(Dictionary cluster_map, List faces) { double[][] t_snefit_vectors = faces.Select(f => f.Vector.Select(e => (double)e).ToArray()).ToArray(); TSNE tSNE = new TSNE() { NumberOfOutputs = 2, Perplexity = 100 }; // Transform to a reduced dimensionality space var embeddings = tSNE.Transform(t_snefit_vectors); var xmin = double.MaxValue; var xmax = double.MinValue; var ymin = double.MaxValue; var ymax = double.MinValue; for (int i = 0; i < embeddings.Length; i++) { var lxmin = embeddings[i][0]; var lxmax = embeddings[i][0]; if (lxmin < xmin) xmin = lxmin; if (lxmax > xmax) xmax = lxmax; var lymin = embeddings[i][1]; var lymax = embeddings[i][1]; if (lymin < ymin) ymin = lymin; if (lymax > ymax) ymax = lymax; } var norm_x_scale = 1.0f / (xmax - xmin); var norm_y_scale = 1.0f / (xmax - xmin); var xdiff = 0 - xmin; var ydiff = 0 - ymin; var centerx = (xmin + xmax) / 2.0f + xdiff; var centery = (ymin + ymax) / 2.0f + ydiff; var width = 2560; var height = 1440; var rnd = new Random((int)Environment.TickCount); var clusterIds = cluster_map.Values.Distinct().ToArray(); var cluster_colors = new Dictionary(); foreach (var cid in clusterIds) { var color = Color.FromRgb((byte)rnd.Next(0, 255), (byte)rnd.Next(0, 255), (byte)rnd.Next(0, 255)); cluster_colors[cid] = color; } using (var image = new Image(width, height)) { for (int i = 0; i < embeddings.Length; i++) { var cluster = cluster_map[i]; var color = cluster_colors[cluster]; var x = (int)((embeddings[i][0] + xdiff + centerx) * norm_x_scale * width) - width / 2; var y = (int)((embeddings[i][1] + ydiff + centery) * norm_y_scale * height) - height / 2; image.Mutate(im => im.DrawLines( color, 4, new PointF[] { new PointF(x - 1, y - 1), new PointF(x + 1, y - 1), new PointF(x + 1, y + 1), new PointF(x - 1, y + 1), new PointF(x - 1, y - 1) } )); } image.SaveAsJpeg(@"G:\FaceTest\tsne.jpeg"); } }