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 MinHashing extends AbstractHashing {
	private static final long serialVersionUID = -6746930977676653097L;

	private final int numberOfBits;
	private final int numberOfPermutations;

	private final HashRandomProjection hashRandomProjections;

	private final List> permutations = new ArrayList>();

	public MinHashing(int numberOfBits, int numberOfPermutations) {
		this.hashRandomProjections = new HashRandomProjection(numberOfBits);
		this.numberOfBits = numberOfBits;
		this.numberOfPermutations = numberOfPermutations;
	}

	public void reset() {
		hashRandomProjections.clear();
		permutations.clear();
	}

	public void train(ListDataSet dataSet) {
		hashRandomProjections.train(dataSet);
		for (int i = 0; i < numberOfPermutations; i++) {
			permutations.add(MathUtil.randPermInt(0, numberOfBits));
		}
	}

	public Matrix hash(Matrix input) {
		Matrix result = Matrix.Factory.zeros(1, numberOfPermutations);
		Matrix hash = hashRandomProjections.hash(input);
		for (int i = 0; i < numberOfPermutations; i++) {
			for (int j = 0; j < numberOfBits; j++) {
				int pos = permutations.get(i).get(j);
				if (hash.getAsBoolean(0, pos)) {
					result.setAsDouble(j, 0, i);
					break;
				}
			}
		}
		return result;
	}

}

 

Ads help maintain this website.