4

この計算をできるだけ早く行うことを検討しています。X を nxm numpy 配列として持っています。Yを次のように定義したい:

Y_11 = 1 / (exp(X_11-X_11) + exp(X_11-X_12) + ... exp(X_11 - X_1N) ).

または Y_00 の場合

1/np.sum(np.exp(X[0,0]-X[0,:]))

したがって、基本的に、Y も nxm であり、i,j 要素は 1 / sum_j' exp(X_ij - X_ij') です。

どんなヒントも素晴らしいでしょう!ありがとう。

リクエストされたサンプルコード:

np.random.seed(111)
J,K = 110,120
X = np.random.rand(J,K)
Y = np.zeros((J,K))
for j in range(J):
    for k in range(K):
        Y[j,k] = 1/np.sum(np.exp(X[j,k]-X[j,:]))

# note each row will sum to 1 under this operation
np.sum(Y,axis=1)
4

2 に答える 2

2

二重ループを減らすための最初のステップは次のとおりです。

def foo2(X):
    Y = np.zeros_like(X)
    for k in range(X.shape[1]):
        Y[:,k]=1/np.exp(X[:,[k]]-X[:,:]).sum(axis=1)
    return Y

ループを削除することもできると思いkますが、それが何をしているのかを理解するためにもっと時間を費やす必要があります. それX[:,[k]]-X[:,:]は明らかではありません(全体像では)。

別のステップ:

Z = np.stack([X[:,[k]]-X for k in range(X.shape[1])],2)
Y = 1/np.exp(Z).sum(axis=1)

これは、(試行錯誤が多すぎる)でさらに洗練できます

Z = X[:,None,:]-X[:,:,None]
于 2016-09-19T19:20:26.103 に答える