我正在尝试实现 A-Chao 版本的加权水库采样,如https://en.wikipedia.org/wiki/Reservoir_sampling#Algorithm_A-Chao所示
但是我发现wiki中描述的伪代码似乎是错误的,尤其是在初始化部分。我读了这篇论文,它提到我们需要处理权重过大的数据点,但我仍然不知道如何正确初始化。
据我了解,在初始化步骤中,我们要确保选择的所有初始数据点都应该具有相同的概率*权重。但是,我不明白超重点与此有何关系。
我根据wiki实现的代码,但结果显示它是不正确的。
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;
};