private double mergeCentroid(double wSoFar, double k1, double w, double m, List<Double> newData) { double k2 = integratedLocation(wSoFar / totalWeight); if (k2 - k1 <= 1 || mergeWeight[lastUsedCell] == 0) { // merge into existing centroid mergeWeight[lastUsedCell] += w; mergeMean[lastUsedCell] = mergeMean[lastUsedCell] + (m - mergeMean[lastUsedCell]) * w / mergeWeight[lastUsedCell]; } else { // create new centroid lastUsedCell++; mergeMean[lastUsedCell] = m; mergeWeight[lastUsedCell] = w; k1 = integratedLocation((wSoFar - w) / totalWeight); } if (mergeData != null) { while (mergeData.size() <= lastUsedCell) { mergeData.add(new ArrayList<>()); } mergeData.get(lastUsedCell).addAll(newData); } return k1; }
private double mergeCentroid(double wSoFar, double k1, double w, double m, List<Double> newData) { double k2 = integratedLocation(wSoFar / totalWeight); if (k2 - k1 <= 1 || mergeWeight[lastUsedCell] == 0) { // merge into existing centroid mergeWeight[lastUsedCell] += w; mergeMean[lastUsedCell] = mergeMean[lastUsedCell] + (m - mergeMean[lastUsedCell]) * w / mergeWeight[lastUsedCell]; } else { // create new centroid lastUsedCell++; mergeMean[lastUsedCell] = m; mergeWeight[lastUsedCell] = w; k1 = integratedLocation((wSoFar - w) / totalWeight); } if (mergeData != null) { while (mergeData.size() <= lastUsedCell) { mergeData.add(new ArrayList<>()); } mergeData.get(lastUsedCell).addAll(newData); } return k1; }
private int checkWeights(double[] w, double total, int last) { int badCount = 0; int n = last; if (w[n] > 0) { n++; } double k1 = 0; double q = 0; for (int i = 0; i < n; i++) { double dq = w[i] / total; double k2 = integratedLocation(q + dq); if (k2 - k1 > 1 && w[i] != 1) { System.out.printf("Oversize centroid at %d, k0=%.2f, k1=%.2f, dk=%.2f, w=%.2f, q=%.4f\n", i, k1, k2, k2 - k1, w[i], q); badCount++; } if (k2 - k1 > 1.5 && w[i] != 1) { throw new IllegalStateException(String.format("Egregiously oversized centroid at %d, k0=%.2f, k1=%.2f, dk=%.2f, w=%.2f, q=%.4f\n", i, k1, k2, k2 - k1, w[i], q)); } q += dq; k1 = k2; } return badCount; }
private int checkWeights(double[] w, double total, int last) { int badCount = 0; int n = last; if (w[n] > 0) { n++; } double k1 = 0; double q = 0; for (int i = 0; i < n; i++) { double dq = w[i] / total; double k2 = integratedLocation(q + dq); if (k2 - k1 > 1 && w[i] != 1) { System.out.printf("Oversize centroid at %d, k0=%.2f, k1=%.2f, dk=%.2f, w=%.2f, q=%.4f\n", i, k1, k2, k2 - k1, w[i], q); badCount++; } if (k2 - k1 > 1.5 && w[i] != 1) { throw new IllegalStateException(String.format("Egregiously oversized centroid at %d, k0=%.2f, k1=%.2f, dk=%.2f, w=%.2f, q=%.4f\n", i, k1, k2, k2 - k1, w[i], q)); } q += dq; k1 = k2; } return badCount; }