HNSW fix layer probability

pull/1/head
unknown 3 years ago
parent f1203f00b8
commit d8095157af

@ -98,7 +98,7 @@ namespace HNSWDemo
static void Main(string[] args) static void Main(string[] args)
{ {
AccuracityTest(); TransformToCompactWorldTestWithAccuracity();
Console.ReadKey(); Console.ReadKey();
} }
@ -423,7 +423,7 @@ namespace HNSWDemo
var sw = new Stopwatch(); var sw = new Stopwatch();
var test = new VectorsDirectCompare(samples, CosineDistance.ForUnits); var test = new VectorsDirectCompare(samples, CosineDistance.ForUnits);
var world = new SmallWorld<float[]>(NSWOptions<float[]>.Create(32, 15, 200, 200, CosineDistance.ForUnits, true, true, selectionHeuristic: NeighbourSelectionHeuristic.SelectSimple)); var world = new SmallWorld<float[]>(NSWOptions<float[]>.Create(8, 15, 200, 200, CosineDistance.ForUnits, true, true, selectionHeuristic: NeighbourSelectionHeuristic.SelectSimple));
sw.Start(); sw.Start();
var ids = world.AddItems(samples.ToArray()); var ids = world.AddItems(samples.ToArray());

@ -4,19 +4,16 @@ namespace ZeroLevel.HNSW.Services
{ {
internal sealed class ProbabilityLayerNumberGenerator internal sealed class ProbabilityLayerNumberGenerator
{ {
private const float DIVIDER = 3.361f;
private readonly float[] _probabilities; private readonly float[] _probabilities;
private float _mL;
internal ProbabilityLayerNumberGenerator(int maxLayers, int M) internal ProbabilityLayerNumberGenerator(int maxLayers, int M)
{ {
_mL = maxLayers; _mL = maxLayers;
_probabilities = new float[maxLayers]; _probabilities = new float[maxLayers];
var probability = 1.0f / DIVIDER; var m_L = 1.0f / Math.Log(M);
for (int i = 0; i < maxLayers; i++) for (int i = 0; i < maxLayers; i++)
{ {
_probabilities[i] = probability; _probabilities[i] = (float)(Math.Exp(-i / m_L) * (1 - Math.Exp(-1 / m_L)));
probability /= DIVIDER;
} }
} }

Loading…
Cancel
Save

Powered by TurnKey Linux.