【问题标题】:Sampling according to difference in function value根据函数值的差异进行采样
【发布时间】:2016-06-18 00:37:35
【问题描述】:

我有 20 个值 x1,...x20。每个值都在 0 和 1 之间,例如 0.22,0.23,0.25,...

x = rand(20,1);
x = sort(x);

现在我想随机选择一个数据点但不统一。具有最低值的数据点应具有最高概率,其他值应具有与函数值与最低值之差成正比的概率。

例如,如果最低函数值为 0.22,则函数值为 0.23 的数据点与最佳值 0.23 - 0.22 = 0.01 的差异,因此应该具有与 0.22 值相似的概率。但是 0.3 的值有 0.3 - 0.22 = 0.08 的差值,因此概率应该小得多。

如何做到这一点?

【问题讨论】:

    标签: matlab random random-sample


    【解决方案1】:

    我会将此作为评论,但不幸的是我还没有代表。 这看起来很有趣,我有几个问题要问你。 (我稍后会编辑这个答案作为答案。)

    具有最低值的数据点应具有最高概率,而其他值应具有与函数值与最低值之差成正比的概率。

    让我们取一个包含 20 个项目的数组,然后从整个数组中减去最小的数字。这给我们留下了我们的最小值(您希望它是最可能的)为 0。我们现在需要定义一个函数,它遍历所有点并积分为 1。

    我做了以下事情:

    x = rand(20, 1);
    x = sort(x);
    xx = x - x(1);
    

    我想此时我们可以反转我们的答案,所以最低点是 1。

    Px = 1 - xx;        %For probabilities
    TotalP = sum(Px);
    

    现在我们已经拥有了我们需要的一切,我想......所以让我们看看我们能做些什么。

    P = Px/TotalP;        %This will be our probability.
    SanityCheck = sum(P); %Make sure that it sums up to 1.
    

    看起来可行,所以让我们创建累积和数组,并获取一个元素。

    PI = cumsum(P);     %This will be the integral form of the probability function.
    test = rand;   %Create a test number so we can place it in the integral function
    index = find(PI > test, 1); %This will return the first entry that is greater than our test value...
    result = x(index); %And here's our value
    

    我希望这符合您的要求。如果没有,请发表评论,我会回复您。 :)

    [编辑以合并 cmets]

    【讨论】:

    • 好答案。只是几个cmets:(1)rand(1,1) = rand。你可以简单地调用rand,不带参数,它会默认为你提供一个输出。 (2) index = find(PI > temp, 1); result = x(index); 可以替换为result = x(PI > temp); 尽可能使用逻辑索引而不是find。它更快。 (3) MATLAB 中的注释使用%,而不是#。我冒昧地为你改变了这一点。它还将允许为 cmets 启用语法突出显示。
    • 我很欣赏这些 cmets,当我把它放在一起时应该更小心一点。不过要注意一件事。使用结果 = x(PI > temp);会导致返回一系列条目而不是第一个有效的条目,这就是我使用 find 的原因。我想它可以更像 rlist = x(PI > temp);结果 = rlist(1);这将保留逻辑索引。
    • 当然是拍摄。我没有看到find 1 是第二个参数。是的,忘记逻辑索引。绝对使用find。我看错了,我以为你想找到所有满足条件的元素。顺便说一句,请接受我对 StackOverflow 的热烈欢迎。在这里回答 MATLAB 问题的人并不多!
    • 我真的很感激。看看我做的改动,我还是用了逻辑索引;)
    • 哈哈。不不不改回find。您只需要第一个条目,这样肯定会更快。我误读了代码。由于您只想找到第一个条目,因此不仅可以节省空间,还可以节省时间。一旦找到第一个条目,该函数就会退出。逻辑索引必须切入数组并获取所有条目,然后您可以对其进行索引。 Octave 可以在一行中做到这一点:result = x(PI > temp)(1);... 这是我每天抱怨的 MATLAB 所没有的。
    猜你喜欢
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2016-01-10
    • 2012-03-10
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多