0

確率の負の対数の合計がおよそ 1 になるようにグループ化された項目のグループのリストを作成する必要があります。

これまでのところ、私は思いついた

probs = np.random.dirichlet(np.ones(50)*100.,size=1).tolist()
logs = [-1 * math.log(1-x,2) for x in probs[0]]
zipped = zip(range(0,50), logs)

for key, igroup in iter.groupby(zipped, lambda x: x[1] < 1):
    print(list(igroup))

つまり、乱数のリストを作成し、それらの負の対数を取り、これらの確率を項目番号と一緒に圧縮します。

次に、タプルの 2 列目の数値を合計が 1 (またはその少し上) になるまで加算して、グループを作成します。

私はもう試した:

for key, igroup in iter.groupby(zipped, lambda x: x[1]):
    for thing in igroup:
        print(list(iter.takewhile(lambda x: x < 1, iter.accumulate(igroup))))

および itertools.accmuluate の使用に関する他のさまざまなバリエーションですが、動作させることができません。

誰が何がうまくいかないのか考えていますか (私はあまりにも多くの仕事をしていると思います)。

理想的には、出力は次のようになります

groups = [[1,2,3], [4,5], [6,7,8,9]] 

など、つまり、これらはこのプロパティを満たすグループです。

4

1 に答える 1

1

使用numpy.ufunc.accumulateして単純なループ:

import numpy as np

def group(xs, start=1):
    last_sum = 0
    for stop, acc in enumerate(np.add.accumulate(xs), start):
        if acc - last_sum >= 1:
            yield list(range(start, stop))
            last_sum = acc
            start = stop
    if start < stop:
        yield list(range(start, stop))

probs = np.random.dirichlet(np.ones(50) * 100, size=1)
logs = -np.log2(1 - probs[0])
print(list(group(logs)))

出力例:

[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35],
 [36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]]

使用numpy.searchsorted:

def group(xs, idx_start=1):
    xs = np.add.accumulate(xs)
    idxs = np.searchsorted(xs, np.arange(xs[-1]) + 1, side='left').tolist()
    return [list(range(i+idx_start, j+idx_start)) for i, j in zip([0] + idxs, idxs)]
于 2013-09-10T17:27:17.013 に答える