Я пытаюсь реализовать A-Chao-версию взвешенной выборки из коллектора, как показано в https://en.wikipedia.org/wiki/Reservoir_sampling#Algorithm_A-Chao
Но я обнаружил, что псевдокод, описанный в вики, кажется неправильным, особенно в части инициализации. Я прочитал документ , в котором упоминается, что нам нужно обрабатывать слишком взвешенные точки данных, но я все еще не могу понять, как правильно инициализировать.
В моем понимании на этапе инициализации мыхотите убедиться, что все выбранные исходные точки данных должны иметь одинаковую вероятность * вес, который будет выбран. Однако я не понимаю, как с этим связаны переоцененные баллы.
Код, который я реализовал в соответствии с вики, но результаты показывают, что он неверен.
const reservoirSampling = <T>(dataList: T[], k: number, getWeight: (point: T) => number): T[] => {
const sampledList = dataList.slice(0, k);
let currentWeightSum: number = sampledList.reduce((sum, item) => sum + getWeight(item), 0);
for (let i = k; i < dataList.length; i++) {
const currentItem = dataList[i];
currentWeightSum += getWeight(currentItem);
const probOfChoosingCurrentItem = getWeight(currentItem) / currentWeightSum;
const rand = Math.random();
if (rand <= probOfChoosingCurrentItem) {
sampledList[getRandomInt(0, k - 1)] = currentItem;
}
}
return sampledList;
};