https://en.wikipedia.org/wiki/Reservoir_sampling#Algorithm_A-Chaoに示すように、加重貯留層サンプリングの 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;
};