2

私は現在、コンピューター サイエンスの教科書でいくつかの概念に取り組んでいます。線形代数は頻繁に使用され、教科書に示されている例はすべて Numpy を使用しています。

特に 1 つの表現は、まったく役に立たない表現のように思えて、私を完全に混乱させました。教科書からそのままコピーすると、次のように書かれています。

normalisers = sum(exp(outputs),axis=1)*ones((1,shape(outputs)[0]))

expしたがって、単純化のためにを削除します(ここでの問題には関係ありません)。

sum(outputs,axis=1)*ones((1,shape(outputs)[0]))

ここoutputsで、 は 2 次元 Numpy array(行列) です。

私が知る限り、これはoutputs行列内のすべての行を合計し、結果のベクトルを要素ごとにすべて 1 のベクトルで乗算するだけです。では... ここですべての 1 を掛ける意味は何ですか? 値を変更するつもりはまったくありません。

これは教科書の誤りですか、それとも、すべて 1 を掛けると、ここの値にどのような影響があるかわかりませんか? この時点で、私は Numpy にある程度慣れているだけなので、この表現の意味を単に誤解しているだけなのかどうかはわかりません。

4

1 に答える 1

4

mutzmatronがコメントに書いているように、が配列の場合、この乗算は、からoutputsの結果の形状を変更するための非常に工夫された方法です。それを行うための速くて慣用的な方法はsum(n,)(1,n)

sum(exp(outputs), axis=1).reshape(1, -1)

reshape教科書に示されている方法とは対照的に、線形時間とメモリではなく一定の時間がかかるため、これは読み取り可能でスケーラブルです。

ただし、outputsが配列ではなく、恐ろしいタイプのオブジェクトである場合np.matrix、結果は完全に異なります。

>>> outputs = np.matrix(outputs)
>>> (sum(exp(outputs), axis=1) * ones((1,shape(outputs)[0]))).shape
(10, 10)

(しかし、それでも、それは別の操作を表現するための工夫された方法です。)

于 2012-07-25T16:35:04.793 に答える