2016-09-30 10 views
0

行列が整数値であるとします。確率的行列(行列の各行の和を1にする)を作成します。確率行列正規化への整数行列

ランダム行列を作成し、各行のカウントの合計を計算し、行の各要素を行の合計に分けます。

dt = pd.DataFrame(np.random.randint(0,10000,size=10000).reshape(100,100)) 
dt['sum_row'] = dt.sum(axis=1) 
for col_n in dt.columns[:-1]: 
    dt[col_n] = dt[col_n]/dt['sum_row'] 

この行の合計は1に等しくなければなりません。しかし、そうではありません。

(dt.sum_row_normalized == 1).value_counts() 
> False 75 
> True  25 
> Name: sum_row_normalized, dtype: int64 

私はいくつかの値が正確に1、それに非常に近いではないことを理解しています。それにもかかわらず、行列を正しく正規化するにはどうすればよいですか?

+1

注意'float'は最初に' dt [col_n]/float(dt ['sum_row']) 'となります。 –

答えて

1

浮動小数点数が1になることは保証できませんが、np.aroundで任意の精度に厳密にチェックすることができます。

これはおそらく、パンダの列をループすることなく、より簡単で高速です。 `Pythonの2の3/2 == '1'がする部門の2つの数の1を変換してみていること

X = np.random.randint(0,10000,size=10000).reshape(100,100) 
X_float = X.astype(float) 
Y = X_float/X_float.sum(axis=1)[:,np.newaxis] 

sum(np.around(Y.sum(axis=1),decimals=10)==1) # is 100 

(あなたはPythonの3.xでは.astype(float)ステップを必要としない)

関連する問題