/**Compute the median of the pairwise distance. The distance is * |mu_p - mu_q|^2 where mu_p is the mean embedding. */ public static double MedianPairwise <D>( List <D> dists, double[] embedSquaredWidths) where D : IKEPDist { KEGaussian <D> ke = new KEGaussian <D>(embedSquaredWidths); int n = dists.Count; double[] selfKers = dists.Select(di => ke.Eval(di, di)).ToArray(); List <double> pairDists = new List <double>(); for (int i = 0; i < n; i++) { D p = dists[i]; double pp = selfKers[i]; for (int j = i; j < n; j++) // include j=i just like in Matlab { D q = dists[j]; double qq = selfKers[j]; double dist2 = pp - 2 * ke.Eval(p, q) + qq; Debug.Assert(dist2 >= 0); pairDists.Add(dist2); } } double med = MatrixUtils.Median(pairDists.ToArray()); return(med); }
public override double Eval(T p, T q) { double dist2 = keGauss.Eval(p, p) - 2 * keGauss.Eval(p, q) + keGauss.Eval(q, q); double eval = Math.Exp(-0.5 * dist2 / squaredWidth); return(eval); }