예제 #1
0
        public LocalitySensitiveHashing(double minSim, double maxSim, double minProb, double maxProb)
        {
            int    hashesInGroup = -1;
            var    k = Math.Log(1.0 - minProb) / Math.Log(1.0 - maxProb);
            double oldFn, fn = 1.0;

            for (int tr = 1; tr < 40; tr++)
            {
                oldFn = fn;
                fn    = (Math.Log(1.0 - Math.Pow(minSim, tr)) / Math.Log(1.0 - Math.Pow(maxSim, tr))) - k;
                if (tr == 1)
                {
                    continue;
                }
                if (fn > 0)
                {
                    continue;
                }
                hashesInGroup = -fn > oldFn ? tr - 1 : tr;
                break;
            }
            if (hashesInGroup == -1)
            {
                throw new ArgumentException();
            }
            //
            double groupCount = Math.Log(1.0 - maxProb) / Math.Log(1.0 - Math.Pow(maxSim, hashesInGroup));

            //
            _hashesInGroup = hashesInGroup;
            _groupCount    = (int)(groupCount + 0.9999);
            //
            _hashing = new MinHashing(_hashesInGroup * _groupCount);
        }
예제 #2
0
 public LocalitySensitiveHashing(int hashesInGroup, int groupCount)
 {
     _hashesInGroup = hashesInGroup;
     _groupCount    = groupCount;
     _hashing       = new MinHashing(_hashesInGroup * _groupCount);
 }