use of smile.neighbor.CoverTree in project smile by haifengl.
the class RNNSearchDemo method run.
@Override
public void run() {
startButton.setEnabled(false);
logNSlider.setEnabled(false);
dimensionSlider.setEnabled(false);
radiusField.setEnabled(false);
logN = logNSlider.getValue();
dimension = dimensionSlider.getValue();
System.out.println("Generating dataset...");
int n = (int) Math.pow(10, logN);
double[][] data = new double[n][];
for (int i = 0; i < n; i++) {
data[i] = new double[dimension];
for (int j = 0; j < dimension; j++) {
data[i][j] = Math.random();
}
}
int[] perm = Math.permutate(n);
System.out.println("Building searching data structure...");
long time = System.currentTimeMillis();
LinearSearch<double[]> naive = new LinearSearch<>(data, new EuclideanDistance());
int naiveBuild = (int) (System.currentTimeMillis() - time);
time = System.currentTimeMillis();
KDTree<double[]> kdtree = new KDTree<>(data, data);
int kdtreeBuild = (int) (System.currentTimeMillis() - time);
time = System.currentTimeMillis();
CoverTree<double[]> cover = new CoverTree<>(data, new EuclideanDistance());
int coverBuild = (int) (System.currentTimeMillis() - time);
time = System.currentTimeMillis();
LSH<double[]> lsh = new LSH<>(dimension, 5, (int) Math.log2(dimension), 4 * radius, 1017881);
for (int i = 0; i < n; i++) {
lsh.put(data[i], data[i]);
}
int lshBuild = (int) (System.currentTimeMillis() - time);
time = System.currentTimeMillis();
MPLSH<double[]> mplsh = new MPLSH<>(dimension, 3, (int) Math.log2(n), 4 * radius, 1017881);
for (int i = 0; i < n; i++) {
mplsh.put(data[i], data[i]);
}
double[][] train = new double[1000][];
for (int i = 0; i < train.length; i++) {
train[i] = data[perm[i]];
}
mplsh.learn(kdtree, train, radius);
int mplshBuild = (int) (System.currentTimeMillis() - time);
System.out.println("Perform 1000 searches...");
time = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
ArrayList<Neighbor<double[], double[]>> neighbors = new ArrayList<>();
naive.range(data[perm[i]], radius, neighbors);
}
int naiveSearch = (int) (System.currentTimeMillis() - time);
time = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
ArrayList<Neighbor<double[], double[]>> neighbors = new ArrayList<>();
kdtree.range(data[perm[i]], radius, neighbors);
}
int kdtreeSearch = (int) (System.currentTimeMillis() - time);
time = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
ArrayList<Neighbor<double[], double[]>> neighbors = new ArrayList<>();
cover.range(data[perm[i]], radius, neighbors);
}
int coverSearch = (int) (System.currentTimeMillis() - time);
time = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
ArrayList<Neighbor<double[], double[]>> neighbors = new ArrayList<>();
lsh.range(data[perm[i]], radius, neighbors);
}
int lshSearch = (int) (System.currentTimeMillis() - time);
time = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
ArrayList<Neighbor<double[], double[]>> neighbors = new ArrayList<>();
mplsh.range(data[perm[i]], radius, neighbors, 0.95, 10);
}
int mplshSearch = (int) (System.currentTimeMillis() - time);
canvas.removeAll();
double[] buildTime = { naiveBuild, kdtreeBuild, coverBuild, lshBuild, mplshBuild };
PlotCanvas build = BarPlot.plot(buildTime, label);
build.setTitle("Build Time");
canvas.add(build);
double[] searchTime = { naiveSearch, kdtreeSearch, coverSearch, lshSearch, mplshSearch };
PlotCanvas search = BarPlot.plot(searchTime, label);
search.setTitle("Search Time");
canvas.add(search);
validate();
startButton.setEnabled(true);
logNSlider.setEnabled(true);
dimensionSlider.setEnabled(true);
radiusField.setEnabled(false);
}
use of smile.neighbor.CoverTree in project smile by haifengl.
the class KNNDemo method run.
@Override
public void run() {
startButton.setEnabled(false);
logNSlider.setEnabled(false);
dimensionSlider.setEnabled(false);
knnField.setEnabled(false);
logN = logNSlider.getValue();
dimension = dimensionSlider.getValue();
System.out.println("Generating dataset...");
int n = (int) Math.pow(10, logN);
double[][] data = new double[n][];
for (int i = 0; i < n; i++) {
data[i] = new double[dimension];
for (int j = 0; j < dimension; j++) {
data[i][j] = Math.random();
}
}
int[] perm = Math.permutate(n);
System.out.println("Building searching data structure...");
long time = System.currentTimeMillis();
LinearSearch<double[]> naive = new LinearSearch<>(data, new EuclideanDistance());
int naiveBuild = (int) (System.currentTimeMillis() - time);
time = System.currentTimeMillis();
KDTree<double[]> kdtree = new KDTree<>(data, data);
int kdtreeBuild = (int) (System.currentTimeMillis() - time);
time = System.currentTimeMillis();
CoverTree<double[]> cover = new CoverTree<>(data, new EuclideanDistance());
int coverBuild = (int) (System.currentTimeMillis() - time);
System.out.println("Perform 1000 searches...");
double radius = 0.0;
List<Neighbor<double[], double[]>[]> answers = new ArrayList<>(1000);
time = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
answers.add(naive.knn(data[perm[i]], knn));
for (int j = 0; j < answers.get(i).length; j++) {
radius += answers.get(i)[j].distance;
}
}
int naiveSearch = (int) (System.currentTimeMillis() - time);
radius /= 1000 * knn;
time = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
kdtree.knn(data[perm[i]], knn);
}
int kdtreeSearch = (int) (System.currentTimeMillis() - time);
time = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
cover.knn(data[perm[i]], knn);
}
int coverSearch = (int) (System.currentTimeMillis() - time);
time = System.currentTimeMillis();
LSH<double[]> lsh = new LSH<>(dimension, 5, (int) Math.log2(dimension), 4 * radius, 1017881);
for (int i = 0; i < n; i++) {
lsh.put(data[i], data[i]);
}
int lshBuild = (int) (System.currentTimeMillis() - time);
time = System.currentTimeMillis();
MPLSH<double[]> mplsh = new MPLSH<>(dimension, 2, (int) Math.log2(n), 4 * radius, 1017881);
for (int i = 0; i < n; i++) {
mplsh.put(data[i], data[i]);
}
double[][] train = new double[1000][];
for (int i = 0; i < train.length; i++) {
train[i] = data[perm[i]];
}
mplsh.learn(kdtree, train, 1.5 * radius);
int mplshBuild = (int) (System.currentTimeMillis() - time);
double lshRecall = 0.0;
time = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
Neighbor<double[], double[]>[] neighbors = lsh.knn(data[perm[i]], knn);
int hit = 0;
for (int p = 0; p < knn && answers.get(i)[p] != null; p++) {
for (int q = 0; q < knn && neighbors[q] != null; q++) {
if (answers.get(i)[p].index == neighbors[q].index) {
hit++;
break;
}
}
}
lshRecall += 1.0 * hit / knn;
}
int lshSearch = (int) (System.currentTimeMillis() - time);
lshRecall /= 1000;
System.out.format("The recall of LSH is %.1f%%\n", lshRecall * 100);
double mplshRecall = 0.0;
time = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
Neighbor<double[], double[]>[] neighbors = mplsh.knn(data[perm[i]], knn, 0.95, 10);
int hit = 0;
for (int p = 0; p < knn && answers.get(i)[p] != null; p++) {
for (int q = 0; q < knn && neighbors[q] != null; q++) {
if (answers.get(i)[p].index == neighbors[q].index) {
hit++;
break;
}
}
}
mplshRecall += 1.0 * hit / knn;
}
int mplshSearch = (int) (System.currentTimeMillis() - time);
mplshRecall /= 1000;
System.out.format("The recall of MPLSH is %.1f%%\n", mplshRecall * 100);
canvas.removeAll();
double[] buildTime = { naiveBuild, kdtreeBuild, coverBuild, lshBuild, mplshBuild };
PlotCanvas build = BarPlot.plot(buildTime, label);
build.setTitle("Build Time");
canvas.add(build);
double[] searchTime = { naiveSearch, kdtreeSearch, coverSearch, lshSearch, mplshSearch };
PlotCanvas search = BarPlot.plot(searchTime, label);
search.setTitle("Search Time");
canvas.add(search);
validate();
startButton.setEnabled(true);
logNSlider.setEnabled(true);
dimensionSlider.setEnabled(true);
knnField.setEnabled(true);
}
use of smile.neighbor.CoverTree in project smile by haifengl.
the class NearestNeighborDemo method run.
@Override
public void run() {
startButton.setEnabled(false);
logNSlider.setEnabled(false);
dimensionSlider.setEnabled(false);
logN = logNSlider.getValue();
dimension = dimensionSlider.getValue();
System.out.println("Generating dataset...");
int n = (int) Math.pow(10, logN);
double[][] data = new double[n][];
for (int i = 0; i < n; i++) {
data[i] = new double[dimension];
for (int j = 0; j < dimension; j++) {
data[i][j] = Math.random();
}
}
int[] perm = Math.permutate(n);
System.out.println("Building searching data structure...");
long time = System.currentTimeMillis();
LinearSearch<double[]> naive = new LinearSearch<>(data, new EuclideanDistance());
int naiveBuild = (int) (System.currentTimeMillis() - time);
time = System.currentTimeMillis();
KDTree<double[]> kdtree = new KDTree<>(data, data);
int kdtreeBuild = (int) (System.currentTimeMillis() - time);
time = System.currentTimeMillis();
CoverTree<double[]> cover = new CoverTree<>(data, new EuclideanDistance());
int coverBuild = (int) (System.currentTimeMillis() - time);
System.out.println("Perform 100 searches...");
int[] answer = new int[100];
double radius = 0.0;
time = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
Neighbor<double[], double[]> neighbor = naive.nearest(data[perm[i]]);
answer[i] = neighbor.index;
radius += neighbor.distance;
}
int naiveSearch = (int) (System.currentTimeMillis() - time);
radius /= 100;
time = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
kdtree.nearest(data[perm[i]]);
}
int kdtreeSearch = (int) (System.currentTimeMillis() - time);
time = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
cover.nearest(data[perm[i]]);
}
int coverSearch = (int) (System.currentTimeMillis() - time);
time = System.currentTimeMillis();
LSH<double[]> lsh = new LSH<>(dimension, 5, (int) Math.ceil(Math.log2(dimension)), 4 * radius, 1017881);
for (int i = 0; i < n; i++) {
lsh.put(data[i], data[i]);
}
int lshBuild = (int) (System.currentTimeMillis() - time);
double lshRecall = 0.0;
time = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
if (lsh.nearest(data[perm[i]]).index == answer[i]) {
lshRecall++;
}
}
int lshSearch = (int) (System.currentTimeMillis() - time);
lshRecall /= 100;
System.out.format("The recall of LSH is %.1f%%\n", lshRecall * 100);
time = System.currentTimeMillis();
MPLSH<double[]> mplsh = new MPLSH<>(dimension, 5, (int) Math.ceil(Math.log2(n)), 4 * radius, 1017881);
for (int i = 0; i < n; i++) {
mplsh.put(data[i], data[i]);
}
double[][] train = new double[1000][];
for (int i = 0; i < train.length; i++) {
train[i] = data[perm[i]];
}
mplsh.learn(kdtree, train, 1.5 * radius);
int mplshBuild = (int) (System.currentTimeMillis() - time);
double mplshRecall = 0.0;
time = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
if (mplsh.nearest(data[perm[i]], 0.95, 10).index == answer[i]) {
mplshRecall++;
}
}
int mplshSearch = (int) (System.currentTimeMillis() - time);
mplshRecall /= 100;
System.out.format("The recall of MPLSH is %.1f%%\n", mplshRecall * 100);
canvas.removeAll();
double[] buildTime = { naiveBuild, kdtreeBuild, coverBuild, lshBuild, mplshBuild };
PlotCanvas build = BarPlot.plot(buildTime, label);
build.setTitle("Build Time");
canvas.add(build);
double[] searchTime = { naiveSearch, kdtreeSearch, coverSearch, lshSearch, mplshSearch };
PlotCanvas search = BarPlot.plot(searchTime, label);
search.setTitle("Search Time");
canvas.add(search);
validate();
startButton.setEnabled(true);
logNSlider.setEnabled(true);
dimensionSlider.setEnabled(true);
}
Aggregations