@Override public double predict(T x) { double sum = 0.0, sumw = 0.0; for (int i = 0; i < rbf.length; i++) { double f = rbf[i].f(distance.d(x, centers[i])); sumw += w[i] * f; sum += f; } return normalized ? sumw / sum : sumw; } }
/** * Moves all the points in pointSet covered by (the ball of) newPoint * into newPointSet, based on the given scale/level. * * @param pointSet the supplied set of instances from which * all points covered by newPoint will be removed. * @param newPointSet the set in which all points covered by * newPoint will be put into. * @param newPoint the given new point. * @param maxScale the scale based on which distances are * judged (radius of cover ball is calculated). */ private void distSplit(ArrayList<DistanceSet> pointSet, ArrayList<DistanceSet> newPointSet, E newPoint, int maxScale) { double fmax = getCoverRadius(maxScale); ArrayList<DistanceSet> newSet = new ArrayList<>(); for (int i = 0; i < pointSet.size(); i++) { DistanceSet n = pointSet.get(i); double newDist = distance.d(newPoint, n.getObject()); if (newDist <= fmax) { pointSet.get(i).dist.add(newDist); newPointSet.add(n); } else { newSet.add(n); } } pointSet.clear(); pointSet.addAll(newSet); }
/** * Do a range search in the given subtree. * @param node the root of subtree. * @param q the query object. * @param k the range of query. * @param neighbors the returned results of which d(x, target) ≤ k. */ private void search(Node node, E q, int k, List<Neighbor<E, E>> neighbors) { int d = (int) distance.d(node.object, q); if (d <= k) { if (node.object != q || !identicalExcluded) { neighbors.add(new Neighbor<>(node.object, node.object, node.index, d)); } } if (node.children != null) { int start = Math.max(1, d-k); int end = Math.min(node.children.size(), d+k+1); for (int i = start; i < end; i++) { Node child = node.children.get(i); if (child != null) { search(child, q, k, neighbors); } } } }
/** * Builds the cover tree. */ private void buildCoverTree() { ArrayList<DistanceSet> pointSet = new ArrayList<>(); ArrayList<DistanceSet> consumedSet = new ArrayList<>(); E point = data[0]; int idx = 0; double maxDist = -1; for (int i = 1; i < data.length; i++) { DistanceSet set = new DistanceSet(i); double dist = distance.d(point, data[i]); set.dist.add(dist); pointSet.add(set); if (dist > maxDist) { maxDist = dist; } } root = batchInsert(idx, getScale(maxDist), getScale(maxDist), pointSet, consumedSet); }
double sum = 0.0; for (int j = 0; j < m; j++) { double r = rbf[j].f(distance.d(x[i], centers[j])); G.set(i, j, r); sum += r;
for (int i = 0; i < k; i++) { for (int j = 0; j < k; j++) { r[j] = distance.d(centers[i], centers[j]);
double f = rbf[i].f(distance.d(x, centers[i])); sum += f; for (int j = 0; j < k; j++) {
for (int i = 0; i < k; i++) { for (int j = 0; j < i; j++) { double d = distance.d(centers[i], centers[j]); if (r0 < d) { r0 = d;
double sum = 0.0; for (int j = 0; j < m; j++) { double r = rbf[j].f(distance.d(x[i], centers[j])); G.set(i, j, r); sum += r;