code: protected double expectation() {
  		double sumChiSq = 0;
  
  		for (int i = 0; i < info.size(); i++) {
  			PointInfo p = info.get(i);
  
  			// identify the best cluster match and save it's chi-square for convergence testing
  			double bestLikelihood = 0;
  			double bestChiSq = Double.MAX_VALUE;
  
  			double total = 0;
  			for (int j = 0; j < mixture.size; j++) {
  				GaussianLikelihoodManager.Likelihood g = likelihoodManager.getLikelihood(j);
  				double likelihood = g.likelihood(p.point);
  				total += p.weights.data[j] = likelihood;
  
  				if( likelihood > bestLikelihood ) {
  					bestLikelihood = likelihood;
  					bestChiSq = g.getChisq();
  				}
  			}
  
  			// make sure it sums up to 1
  			if( total > 0 ) {
  				for (int j = 0; j < mixture.size; j++) {
  					p.weights.data[j] /= total;
  				}
  			}
  
  			// only add the best chi-square since the other mixtures might be far away
  			// I guess I could use the weights to do this too.
  			sumChiSq += bestChiSq;
  		}
  
  		return sumChiSq;
  	}
docs: For each point compute the "responsibility" for each Gaussian
  
  @return The sum of chi-square.  Can be used to estimate the total error.