我编写了Python代码来计算以下函数,用于固定
y_i
和固定z_i
。
在实践中,我将有许多不同的向量
x
,我想对其进行评估。我不想经历一个循环,而是想充分利用 NumPy 的矢量化和广播能力。
目标:编写一个Python函数,将形状为
的矩阵X
作为输入,其中每一行都是不同的向量(M, p)
,并为每一行计算上面的表达式,从而获得形状的输出x
。(M, p)
def single_function(x):
"""Assumes y is a vector (n,) and Z is a matrix (n, p). These are fixed."""
return x / (sigma**2) - gamma*np.sum((np.exp(-np.logaddexp(0.0, y*np.matmul(Z, x))) * y)[:, None] * Z, axis=0)
我的尝试是错误的,但我不知道我错在哪里。
def vectorised(X):
return X / (sigma**2) - gamma*np.matmul(np.exp(-np.logaddexp(0.0, y[None, :] * X.dot(Z.T))) * y[None, :], Z)
用爱因斯坦表示法完成复杂的乘积通常会变得更容易理解。
def vectorized(X):
"""Assumes y is a vector (n,) and Z is a matrix (n, p). These are fixed."""
E = np.exp(np.einsum("n, Mp, np-> nM", -y, X, Z))
return (X / sigma ** 2) - gamma * np.einsum("nM, n, np -> Mp", E / (1 + E), y, Z)