code: @Override
  	public void assign(double[] point, double[] fit) {
  		Arrays.fill(fit,0);
  
  		// compute and save distance to each cluster
  		double max = 0;
  		for (int i = 0; i < clusters.size(); i++) {
  			double d = StandardKMeans_F64.distanceSq(point,clusters.get(i));
  			fit[i] = d;
  			if( d > max ) {
  				max = d;
  			}
  		}
  
  		// normalize to reduce overflow
  		double total = 0;
  		for (int i = 0; i < clusters.size(); i++) {
  			total += fit[i] /= max;
  		}
  
  		// ensure that the closer clusters are weighted more
  		double total2 = 0;
  		for (int i = 0; i < clusters.size(); i++) {
  			total2 += fit[i] = total - fit[i];
  		}
  
  		// normalize so that the sum is 1
  		for (int i = 0; i < clusters.size(); i++) {
  			fit[i] /= total2;
  		}
  
  	}
docs: <p>Soft assignment is done by summing the total distance of the point from each cluster. Then for each cluster
  its value is set to total minus its distance.  The output array is then normalized by dividing each element
  by the sum.</p>
  
  <p>
  When all clusters are approximately the same distance or one is clearly the closest this produces reasonable
  results.  When multiple clusters are much closer than at least on other cluster then it effectively ignores
  the relative difference in distances between the closest points.  There are several obvious heuristic "fixes"
  to this issue, but the best way to solve it is to simply use {@link org.ddogleg.clustering.gmm.AssignGmm_F64}
  instead.
  </p>