sign-random-projection 余弦的敏感hash LSH

   Locality Sensitive Hashing

    

 原理:https://en.wikipedia.org/wiki/Locality-sensitive_hashing

          https://en.wikipedia.org/wiki/Random_projection

   

  1. 生成一个randomProjection 的double[]  也就是向量

   这里如果是几十万行 ,也可以把它分开 成多块,1-100000 100000-200000 300000-xx 分别执行下面的请求

                Random rand  = new Random();
		double[] randomProjection = new double[10000]
		for(int d=0; d<10000; d++) {
			
			double val = rand.nextGaussian();
			randomProjection[d]=val;
		}

  2.然后使用randomProjection进行与要hash的double[]求内积

    

double sum = 0.0;
for(int i=0; i < ; i++) {
sum += randomProjection[i] * hashds[i];
}
return sum>0 ? 1 : 0 大于0表示cos为正1 小于 为负 0

    3.生成多个Hash函数,进行多次hash

    int[] hashs=new int[100];

    hashs[i]=上面第二步的hash的返回的1 或者 0 

    然后分别对上面hash得到10101011010010101 一系列bit素组 这样组成的数组进行合并索引

   

int result = 0;
		int fact = 1;
		for(int i = 0 ; i < hashes.length ; i++){
			result += hashes[i] == 0 ? 0 : factor;
			fact *= 2;
		}
		return result;

    于是得到了一个合并的索引项。该项可以代替余炫代表的hash,你可以把它看做key

    于是添加索引

   

Multimap<Integer,double[]> indexers = ArrayListMultimap.create(); 
//得到的上面合并的索引integer  key
indexers.put(key,vectors);

  这样就把hash索引好了LSH 

  最关键的是搜索查找

   一样的 上面的map 直接 查找key 就能得到List<double[]> 这里怎么限定相识性呢,你如果上面取的维数维多那么返回的距离越相近

  假如有人问我 map怎么支持大量数据,这里我只是举一个例子,比如Hbase存储,数据库查找,比如spark 进行查找。一个意思。 

   

    


你可能感兴趣的:(LSH)