PageRankアルゴリズムを実装するための遷移行列の作成に取り組んでいます。 numpyを使用して、列の合計が1になるようにする方法を教えてください。
例えば:
1 1 1
1 1 1
1 1 1
正規化する必要があります
.33 .33 .33
.33 .33 .33
.33 .33 .33
各列の要素を列合計で除算します-
a/a.sum(axis=0,keepdims=1) # or simply : a/a.sum(0)
行合計を単一にするために、軸の入力を変更します-
a/a.sum(axis=1,keepdims=1)
サンプルの実行-
In [78]: a = np.random.Rand(4,5)
In [79]: a
Out[79]:
array([[ 0.37, 0.74, 0.36, 0.41, 0.44],
[ 0.51, 0.86, 0.91, 0.03, 0.76],
[ 0.56, 0.46, 0.01, 0.86, 0.38],
[ 0.72, 0.66, 0.56, 0.84, 0.69]])
In [80]: b = a/a.sum(axis=0,keepdims=1)
In [81]: b.sum(0) # Verify
Out[81]: array([ 1., 1., 1., 1., 1.])
Python 2.xのint
配列でも機能することを確認するには、from __future__ import division
を使用するか、 np.true_divide
を使用します。
0
まで追加される列の場合
0
まで追加される列の場合、そのままにして問題がないと想定すると、合計を1
で除算するのではなく、0
に設定できます。
sums = a.sum(axis=0,keepdims=1);
sums[sums==0] = 1
out = a/sums
_for i in range(len(A[0])):
col_sum = A[:, i].sum()
if col_sum != 0:
A[:, i] = A[:, i]/col_sum
else:
pass
_
_for loop
_は少しずさんで、はるかにエレガントな方法があると確信していますが、それは機能します。pass
をA[:, i] = 1/len(A[0])
に置き換えて、ダングリングノードを削除し、行列の列を確率論的にします。