protected void computeDistances(float[] fullQuery, BoundedPriorityQueue<IntFloatPair> queue, IntFloatPair wp) { final float[][] distances = new float[pq.assigners.length][]; for (int j = 0, from = 0; j < this.pq.assigners.length; j++) { final FloatNearestNeighbours nn = this.pq.assigners[j]; final int to = nn.numDimensions(); final int K = nn.size(); final float[][] qus = { Arrays.copyOfRange(fullQuery, from, from + to) }; final int[][] idx = new int[1][K]; final float[][] dst = new float[1][K]; nn.searchKNN(qus, K, idx, dst); distances[j] = new float[K]; for (int k = 0; k < K; k++) { distances[j][idx[0][k]] = dst[0][k]; } from += to; } for (int i = 0; i < data.length; i++) { wp.first = i; wp.second = 0; for (int j = 0; j < this.pq.assigners.length; j++) { final int centroid = this.data[i][j] + 128; wp.second += distances[j][centroid]; } wp = queue.offerItem(wp); } }
@Override public Boolean call() { try { int D = nno.numDimensions(); float [][] points = new float[stopRow-startRow][D]; ds.getData(startRow, stopRow, points); int [] argmins = new int[points.length]; float [] mins = new float[points.length]; nno.searchNN(points, argmins, mins); synchronized(centroids_accum){ for (int i=0; i < points.length; ++i) { int k = argmins[i]; for (int d=0; d < D; ++d) { centroids_accum[k][d] += points[i][d]; } counts[k] += 1; } } } catch(Exception e) { e.printStackTrace(); } return true; } }
@Override public void assignWeighted(float[][] data, int[][] assignments, float[][] weights) { nn.searchKNN(data, numNeighbours, assignments, weights); }
@Override public int numDimensions() { return nn.numDimensions(); }
@Override public int size() { return nn.size(); } }
int ci = cur_inds[i]; if (!seen[ci]) { FloatNearestNeighbours.distanceFunc(qu, new float[][] {pnts[ci]}, dsq);
@Override public int[][] assign(float[][] data) { int [][] indices = new int [data.length][numNeighbours]; float [][] distances = new float [data.length][numNeighbours]; nn.searchKNN(data, numNeighbours, indices, distances); return indices; }
int ci = cur_inds[i]; if (!seen[ci]) { FloatNearestNeighbours.distanceFunc(qu, new float[][] {pnts[ci]}, dsq);
protected void computeDistances(float[] fullQuery, BoundedPriorityQueue<IntFloatPair> queue, IntFloatPair wp) { final float[][] distances = new float[pq.assigners.length][]; for (int j = 0, from = 0; j < this.pq.assigners.length; j++) { final FloatNearestNeighbours nn = this.pq.assigners[j]; final int to = nn.numDimensions(); final int K = nn.size(); final float[][] qus = { Arrays.copyOfRange(fullQuery, from, from + to) }; final int[][] idx = new int[1][K]; final float[][] dst = new float[1][K]; nn.searchKNN(qus, K, idx, dst); distances[j] = new float[K]; for (int k = 0; k < K; k++) { distances[j][idx[0][k]] = dst[0][k]; } from += to; } for (int i = 0; i < data.length; i++) { wp.first = i; wp.second = 0; for (int j = 0; j < this.pq.assigners.length; j++) { final int centroid = this.data[i][j] + 128; wp.second += distances[j][centroid]; } wp = queue.offerItem(wp); } }
@Override public IndependentPair<int[], float[]> assignWeighted(float[] data) { int [][] indices = new int [data.length][numNeighbours]; float [][] distances = new float [data.length][numNeighbours]; nn.searchKNN(new float[][] { data }, numNeighbours, indices, distances); return new IndependentPair<int[], float[]>(indices[0], distances[0]); }
/** * Static method to find a distance between * a query vector and a point. * * @param distance the distance measure * @param qu The query vector. * @param pnt The point to compare against. * @return The resultant distance. */ public static float distanceFunc(final FloatFVComparator distance, final float [] qu, final float [] pnt) { if (distance == null) { return distanceFunc(qu, pnt); } if (distance.isDistance()) { return (float) distance.compare(qu, pnt); } else { return - (float) distance.compare(qu, pnt); } }
final int to = nn.numDimensions(); final int K = nn.size(); nn.searchKNN(qus, K, idx, dst);
/** * Static method to find a distance between * a query vector and a point. * * @param distance the distance measure * @param qu The query vector. * @param pnt The point to compare against. * @return The resultant distance. */ public static float distanceFunc(final FloatFVComparator distance, final float [] qu, final float [] pnt) { if (distance == null) { return distanceFunc(qu, pnt); } if (distance.isDistance()) { return (float) distance.compare(qu, pnt); } else { return - (float) distance.compare(qu, pnt); } }
final int to = nn.numDimensions(); final int K = nn.size(); nn.searchKNN(qus, K, idx, dst);
/** * Static method to find a distance between * a query vector and each of a set of points. Results are stored * in the dsq_out array, much must have the same length as the number * of points. * @param distance the distance measure * @param qu The query vector. * @param pnts The points to compare against. * @param dsq_out The resultant distances. */ public static void distanceFunc(final FloatFVComparator distance, final float [] qu, final float [][] pnts, float [] dsq_out) { if (distance == null) { distanceFunc(qu, pnts, dsq_out); return; } final int N = pnts.length; if (distance.isDistance()) { for (int n=0; n < N; ++n) { dsq_out[n] = (float) distance.compare(qu, pnts[n]); } } else { for (int n=0; n < N; ++n) { dsq_out[n] = - (float) distance.compare(qu, pnts[n]); } } }
/** * Static method to find a distance between * a query vector and each of a set of points. Results are stored * in the dsq_out array, much must have the same length as the number * of points. * @param distance the distance measure * @param qu The query vector. * @param pnts The points to compare against. * @param dsq_out The resultant distances. */ public static void distanceFunc(final FloatFVComparator distance, final float [] qu, final float [][] pnts, float [] dsq_out) { if (distance == null) { distanceFunc(qu, pnts, dsq_out); return; } final int N = pnts.length; if (distance.isDistance()) { for (int n=0; n < N; ++n) { dsq_out[n] = (float) distance.compare(qu, pnts[n]); } } else { for (int n=0; n < N; ++n) { dsq_out[n] = - (float) distance.compare(qu, pnts[n]); } } }