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 ではなく、それに非常に近いことを理解しています。それにもかかわらず、マトリックスを正しく正規化するにはどうすればよいですか?

4

1 に答える 1

1

float が正確に 1 であることを保証することはできませんが、 を使用して任意の精度に近い値を確認できますnp.around

これは、パンダの列をループすることなく、おそらく簡単/高速です。

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

.astype(float)( python 3.x ではこのステップは必要ありません)

于 2016-09-30T13:35:16.100 に答える