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); }
public LocalitySensitiveHashing(int hashesInGroup, int groupCount) { _hashesInGroup = hashesInGroup; _groupCount = groupCount; _hashing = new MinHashing(_hashesInGroup * _groupCount); }