【问题标题】:Selecting nodes with probability proportional to trust选择概率与信任成正比的节点
【发布时间】:2011-01-13 23:33:01
【问题描述】:

有没有人知道与选择项目相关的算法或数据结构,它们被选择的概率与某些附加值成正比?换句话说:http://en.wikipedia.org/wiki/Sampling_%28statistics%29#Probability_proportional_to_size_sampling

这里的上下文是一个去中心化的信誉系统,因此附加价值是一个用户对另一个用户的信任价值。在这个系统中,所有节点要么作为完全信任的朋友开始,要么作为完全不信任的未知节点开始。这在大型 P2P 网络中本身并没有用,因为节点数量会比您的朋友多得多,并且您需要知道在不是您直接朋友的大量用户中信任谁,所以我实现了一个动态的信任系统,其中未知数可以通过朋友的朋友关系获得信任。

每隔一段时间,每个用户都会选择一个固定数量的目标节点(为了速度和带宽),以根据另一个选定的固定数量的中间节点对他们的信任程度来重新计算他​​们的信任。选择目标节点进行重新计算的概率将与其当前信任成反比,因此未知数很有可能变得更好。中间节点将以相同的方式被选择,只是中间节点的选择概率与其当前信任成正比。

我自己编写了一个简单的解决方案,但它相当慢,我想找到一个 C++ 库来为我处理这方面的问题。我当然已经完成了自己的搜索,并且我设法找到了我现在正在挖掘的 TRSL。由于这似乎是一个相当简单且可能很常见的问题,我希望有更多的 C++ 库可供我使用,所以我提出这个问题是希望这里有人能对此有所了解。

【问题讨论】:

标签: c++ probability sampling


【解决方案1】:

这就是我要做的:

int select(double *weights, int n) {
    // This step only necessary if weights can be arbitrary
    // (we know total = 1.0 for probabilities)
    double total = 0;
    for (int i = 0; i < n; ++i) {
        total += weights[i];
    }

    // Cast RAND_MAX to avoid overflow
    double r = (double) rand() * total / ((double) RAND_MAX + 1);
    total = 0;
    for (int i = 0; i < n; ++i) {
        // Guaranteed to fire before loop exit
        if (total <= r && total + weights[i] > r) {
            return i;
        }

        total += weights[i];
    }
}

您当然可以根据需要多次重复第二个循环,每次选择一个新的r,以生成多个样本。

【讨论】:

  • 如果所有 OP 都是加权选择,那么 TR1 中的随机库已经提供了有效创建离散分布的方法。
  • 要退出第一个循环,您需要unsigned int n。而且由于您的第二个循环似乎计算了诸如累积概率分布之类的东西,您不应该正确规范化sum(weights)return round(i)吗?
  • @darid:我不知道那个库,你应该在单独的答案中提到!
  • @honk: ??? ni 的“正确”类型是 size_t,它可能是也可能不是 unsigned int。我只是用int 来保持非正式。你的第二句话同样令人费解——第二个循环所做的就是决定一个均匀分布的随机数落入哪个“桶”。 i 是一个整数,那么四舍五入有什么意义呢?
  • 是的,我对 (2) 感到困惑,您只需返回索引即可。对于(1),如果有人盲目地复制这个,他们就会得到一个错误。
猜你喜欢
  • 2013-05-05
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多