private GaussianGmm_F64 computeGaussian( int offset , List<double[]> points ) { GaussianGmm_F64 out = new GaussianGmm_F64(2); // compute the mean for (int i = offset; i < points.size(); i += 2) { double[] p = points.get(i); out.mean.data[0] += p[0]; out.mean.data[1] += p[1]; } CommonOps_DDRM.divide(out.mean,points.size()/2); // compute the covariance Equation eq = new Equation(); eq.alias(out.mean, "mu", out.covariance, "Q"); for (int i = offset; i < points.size(); i += 2) { double[] p = points.get(i); DMatrixRMaj x = DMatrixRMaj.wrap(2,1,p); eq.alias(x,"x"); eq.process("Q = Q + (x-mu)*(x-mu)'"); } CommonOps_DDRM.divide(out.covariance,points.size()/2-1); return out; }
private GaussianGmm_F64 computeGaussian( int which , List<PointInfo> points ) { int N = points.get(0).point.length; GaussianGmm_F64 out = new GaussianGmm_F64(N); // compute the mean double total = 0; for (int i = 0; i < points.size(); i++) { PointInfo p = points.get(i); double w = p.weights.data[which]; total += w; for (int j = 0; j < N; j++) { out.mean.data[j] += w*p.point[j]; } } CommonOps_DDRM.divide(out.mean,total); // compute the covariance Equation eq = new Equation(); eq.alias(out.mean, "mu", out.covariance, "Q"); for (int i = 0; i < points.size(); i++) { PointInfo p = points.get(i); double w = p.weights.data[which]; DMatrixRMaj x = DMatrixRMaj.wrap(N,1,p.point); eq.alias(x,"x",w,"w"); eq.process("Q = Q + w*(x-mu)*(x-mu)'"); } CommonOps_DDRM.divide(out.covariance,total); return out; }
private double computeChiSq( GaussianGmm_F64 g , double[] p ) { Equation eq = new Equation(); eq.alias(g.mean,"mu",g.covariance,"S"); eq.alias(DMatrixRMaj.wrap(p.length,1,p),"x"); eq.process("chisq = (x-mu)'*inv(S)*(x-mu)"); return eq.lookupDouble("chisq"); } }
public static double computeLikelihood( GaussianGmm_F64 g , double[] p ) { Equation eq = new Equation(); eq.alias(g.mean,"mu",g.covariance,"S",p.length,"D"); eq.alias(DMatrixRMaj.wrap(p.length,1,p),"x"); eq.process("left = 1.0/((2*pi)^(D/2.0)*sqrt(det(S)))"); eq.process("likelihood = left*exp(-0.5*(x-mu)'*inv(S)*(x-mu))"); return eq.lookupDouble("likelihood"); }