2017-01-20 10 views
2

shuffleから戻ってくる方法がありますか?sklearn.utils? 私は私の問題より良い説明:私は2つの行列の列をランダム化するshuffle機能を使用します。sklearn.utilsのシャッフルが戻ってくるのはどうですか?

A_s, B_s = shuffle(A, B, random_state = 1)

次は、私はいくつかの操作で行列A_sB_sの両方を使用すると私は同じと他のマトリックスC_sを取得寸法:例えばC_s = f(A_s, B_s)Cの元の順序に戻るにはABとしてください。

私はsklearn.inverse_transform()を使用して帰ってから、sklearn.preprocessing.MinMaxScaler((0,+1))のようなものを考えています。

+0

'f'は単純な関数です(例:合計)。 残念ながら、私はあなたにストレスを与え続けると、自分のシャッフル機能をどうやって行えますか?私はこのようなものだと思う: 'for i in range(len(A)): A_s [i ,:] = np.random(A [i ,:]) B_s [i ,:] = np.random (B [i ,:]) どうすれば注文を追跡できますか? –

答えて

1

fの選択によっては、必ずしも可能ではありません。 fが可逆で、行がシャッフルされる方法を追跡している場合は、効率的でない場合は可能です。 sklearn.utils shuffleメソッドは、マトリックスがシャッフルされた方法を「追跡」しません。あなた自身をロールバックしたいかもしれません。ランダムシャッフルを生成するには、range(len(A))のランダム置換を生成し、その順番で行を繰り返しスワップします。元の行列を検索するには、置換を元に戻すだけです。これは、あなたがfの特定の選択のためのCを回復することができます(たとえば、行列の加算)

う(EDIT、OPは、追加情報を要求した)

これは私のために動作しますが、それを行うには、より効率的な方法はおそらくあります。

import numpy as np 

def shuffle(A,axis=0,permutation=None): 
    A = np.swapaxes(A,0,axis) 
    if permutation is None: 
     permutation = np.random.permutation(len(A)) 
    temp = np.copy(A[permutation[0]]) 
    for i in range(len(A)-1): 
     A[permutation[i]] = A[permutation[i+1]] 
    A[permutation[-1]] = temp 
    A = np.swapaxes(A,0,axis) 
    return A, permutation 

A = np.array([[1,2],[3,4],[5,6],[7,8]]) 
print A 
B, p = shuffle(A) #NOTE: shuffle is in place, so A is the same object as B!!!! 
print "shuffle A" 
print B 
D, _ = shuffle(B,permutation=p[::-1]) 
print "unshuffle B to get A" 
print D 

B = np.copy(B) 
C = A+B 
print "A+B" 
print C 

A_s, p = shuffle(A) 
B_s, _ = shuffle(B, permutation = p) 
C_s = A_s + B_s 

print "shuffle A and B, then add" 
print C_s 

print "unshuffle that to get the original sum" 
CC, _ = shuffle(C_s, permutation=p[::-1]) 
print CC 
+0

ありがとうございました。しかし、私はあなたの例で 'A'の初期行列を変更しない方法を知りたいです。このような方法がありますか? –

+0

関数の先頭に 'A = np.copy(A)'という行を追加するだけです。 – Scott

+0

'A = np.array([1,2]、[3,4]、[ 5,6]、[7,8]]) '?それは動作しないためです。 –