2016-05-20 9 views
2

私は、Nという異なるユーザーによって実行されるデータを含むlist を持っていますので、ユーザーの番号はi=0,1,....,N-1です。各エントリXiの長さは異なります。 グローバルデータセットXで各ユーザの値をXiに正規化します。Python:正規化アルゴリズムを改善する方法は?

これは私がやっていることです。まず第一に私は、すべてのデータを含む1Dリストを作成します。

tmp = list() 
for i in range(0,len(X)): 
    tmp.extend(X[i]) 

はその後、私は配列に変換し、私は外れ値とNaNを削除します。

A = np.array(tmp) 
A = A[~np.isnan(A)] #remove NaN 
tr = np.percentile(A,95) 
A = A[A < tr] #remove outliers 

、その後、私はこのデータセットのヒストグラム

p, x = np.histogram(A, bins=10) # bin it into n = N/10 bins 

最終的に私はそう、私が作成したヒストグラムの上に各ユーザーの値を正規化作成:

Xn = list() 
for i in range(0,len(X)): 
    tmp = np.array(X[i]) 
    tmp = tmp[tmp < tr] 
    tmp = np.histogram(tmp, x) 
    Xn.append(append(tmp[0]/sum(tmp[0])) 

私のデータセットがあるが非常に大きく、このプロセスにはしばらく時間がかかる可能性があります。私はそれが良いかどうか、またはパッケージがあるかどうか疑問に思っています。

答えて

0

Xの各要素X[i]がリストであれば最初の部分のために、あなたはsumを使用することができる場合があり、その後、アレイに直接変換、またはconcatenateを使用する:

# Example X 
X = [list(range(i)) for i in range(3, 19)] + [[2., np.NaN]] 
# Build array with sum 
A = np.array(sum(X, [])) 
# Build array with concatenate 
A = np.concatenate(X) 

後者が多いです読める。

2番目の部分では、各データポイントが属するユーザーのインデックスを格納します。

idx = np.concatenate([np.full(len(x), i, int) for i,x in enumerate(X)]) 
tr = np.nanpercentile(A,95) 
ok = A < tr # this excludes outliers, +Inf and NaN 
idx = idx[ok] 
A = A[ok] 

最後に、あなたは、Aの範囲からxを計算することができ、その後Adigitizeを使用し、各要素のビンを取得します。次に、各対(idx,bin-1)は、所与のビンに属する所与のユーザのデータを識別する。 ufuncaddsee documentation)の方法を使用して、これらすべての寄稿を合計することができます。最後に、ビンの合計で除算して正規化します。

x = np.linspace(A.min(), A.max(), 10+1) 
bin = np.digitize(A, x) 
Xn = np.zeros((len(X), len(x))) 
np.add.at(Xn, (idx,bin-1), 1) 
Xn /= Xn.sum(axis=1)[:,np.newaxis] 
関連する問題