package org.jdmp.core.algorithm.hashing;
import java.util.ArrayList;
import java.util.List;
import org.jdmp.core.dataset.ListDataSet;
import org.ujmp.core.Matrix;
import org.ujmp.core.util.MathUtil;
public class LocalitySensitiveHashing extends AbstractHashing {
private static final long serialVersionUID = 4449292116298947107L;
private final int numberOfAndCombinations;
private final int numberOfOrCombinations;
private final int numberOfBits;
private final HashRandomProjection hashRandomProjections;
private final List> permutations = new ArrayList>();
public LocalitySensitiveHashing() {
this(4, 5, 20);
}
public LocalitySensitiveHashing(int numberOfBits) {
this(numberOfBits, 5, 20);
}
public LocalitySensitiveHashing(int numberOfBits, int numberOfAndCombinations,
int numberOfOrCombinations) {
this.hashRandomProjections = new HashRandomProjection(numberOfAndCombinations
* numberOfOrCombinations);
this.numberOfAndCombinations = numberOfAndCombinations;
this.numberOfOrCombinations = numberOfOrCombinations;
this.numberOfBits = numberOfBits;
}
public void reset() {
hashRandomProjections.clear();
}
public void train(ListDataSet dataSet) {
hashRandomProjections.train(dataSet);
for (int i = 0; i < numberOfBits; i++) {
permutations.add(MathUtil.randPermInt(0, numberOfOrCombinations
* numberOfAndCombinations));
}
}
public Matrix hash(Matrix input) {
Matrix result = Matrix.Factory.zeros(1, numberOfBits);
Matrix hash = hashRandomProjections.hash(input);
for (int b = 0; b < numberOfBits; b++) {
int pos = 0;
boolean or = false;
for (int i = 0; i < numberOfOrCombinations; i++) {
pos++;
boolean and = true;
for (int j = 1; j < numberOfAndCombinations; j++) {
if (hash.getAsBoolean(0, permutations.get(b).get(pos - 1)) != hash
.getAsBoolean(0, permutations.get(b).get(pos))) {
and = false;
}
pos++;
}
or = or | and;
}
result.setAsBoolean(or, 0, b);
}
return result;
}
}
Ads help maintain this website.