private static float[][] Map(float[][] records, float error, int maxIter, int resultDimensions) { var n = records.Length; var dDistances = JaggedArray.Init <float>(n, n); var yDistances = JaggedArray.Init <float>(n, n); var dedy = JaggedArray.Init <float>(n, resultDimensions); var d2edy2 = JaggedArray.Init <float>(n, resultDimensions); var deltas = JaggedArray.Init <float>(n, resultDimensions); var ys = CalculateInitialConfiguration(n: records.Length, d: resultDimensions); var alpha = 0.3f; var iteration = 0; var e = 0.0f; do { CalculateDistances(dDistances, yDistances, records, ys); CalculatePartialDerivatives(dedy, d2edy2, dDistances, yDistances, ys); CalculateDeltas(deltas, dedy, d2edy2); CalculateNewConfiguration(ys, deltas, alpha); e = CalculateError(dDistances, yDistances); } while(e > error || iteration++ < maxIter); return(ys); }
public static float[][] RandomPartitioning(float[][] records, int k) { Debug.Assert(k > 0); var rng = new Random((int)DateTime.Now.Ticks); var centroids = JaggedArray.Init <float>(k, records[0].Length); var labels = new int[records.Length]; // Assign each record to random cluster for (var i = 0; i < records.Length; ++i) { labels[i] = rng.Next(k); } Compute(centroids, records, labels); return(centroids); }