3

マトリックスを (すばやく) 希薄化する必要があります。

Rarefaction - 豊富なマトリックスを均一なサンプリング深度に変換します。

この例では、各行がサンプルであり、サンプリング深度は行の合計です。サンプルごとにマトリックスをランダムに(置換して)サンプリングしたいmin(rowsums(matrix))

行列があるとします:

>>> m = [ [0, 9, 0],
...       [0, 3, 3],
...       [0, 4, 4] ]

min(rowsums(matrix))レアファクション関数は、置換回数 (この場合は 6) で行ごとにランダムにサンプリングします。

>>> rf = rarefaction(m)
>>> rf
    [ [0, 6, 0],  # sum = 6
      [0, 3, 3],  # sum = 6
      [0, 3, 3] ] # sum = 6

結果はランダムですが、行の合計は常に同じです。

>>> rf = rarefaction(m)
>>> rf
    [ [0, 6, 0],   # sum = 6
      [0, 2, 4],   # sum = 6
      [0, 4, 2], ] # sum = 6

PyCogentには、これを行ごとに実行する関数がありますが、大きな行列では非常に遅くなります。

これを実行できる関数が Numpy にあるような気がしますが、それが何と呼ばれるかはわかりません。

4

2 に答える 2

4
import numpy as np
from numpy.random import RandomState

def rarefaction(M, seed=0):
    prng = RandomState(seed) # reproducible results
    noccur = np.sum(M, axis=1) # number of occurrences for each sample
    nvar = M.shape[1] # number of variables
    depth = np.min(noccur) # sampling depth

    Mrarefied = np.empty_like(M)
    for i in range(M.shape[0]): # for each sample
        p = M[i] / float(noccur[i]) # relative frequency / probability
        choice = prng.choice(nvar, depth, p=p)
        Mrarefied[i] = np.bincount(choice, minlength=nvar)

    return Mrarefied

例:

>>> M = np.array([[0, 9, 0], [0, 3, 3], [0, 4, 4]])
>>> M
array([[0, 9, 0],
       [0, 3, 3],
       [0, 4, 4]])
>>> rarefaction(M)
array([[0, 6, 0],
       [0, 2, 4],
       [0, 3, 3]])
>>> rarefaction(M, seed=1)
array([[0, 6, 0],
       [0, 4, 2],
       [0, 3, 3]])
>>> rarefaction(M, seed=2)
array([[0, 6, 0],
       [0, 3, 3],
       [0, 3, 3]])

乾杯、ダビデ

于 2013-09-23T19:26:00.327 に答える
1

質問は完全には明確ではないと思います。希薄行列は、元の行列の各係数から取得したサンプルの数を示していると思いますか?

リンクのコードを見ると、速度が向上する可能性があります。転置行列を操作し、行ではなく列を操作するようにリンクのコードを書き直します。これにより、プロセッサがサンプリングした値をより適切にキャッシュできるため、メモリ内のジャンプが少なくなります。

残りは、numpy を使用して同様に行います (それが最も効率的な方法であるとは限りません)。

より速く必要な場合は、関数を C++ でコーディングし、scipy.weave を使用して Python に含めることができます。C++ では、すべての行に移動し、0 より大きい位置のルックアップ テーブルを作成し、ルックアップ テーブルmin(rowsums(matrix))内の項目数に等しい範囲内で整数を生成します。ルックアップ テーブル内の各位置が描画される頻度を累積し、それらの数値を配列内の正しい位置に戻します。そのコードは、文字通りほんの数行である必要があります。

于 2013-03-20T02:32:48.690 に答える