4

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;
};
4

1 に答える 1