所以我需要转换以下行
np.mean([-y[i] * X[i] * (1 - 1 / (1 + np.exp( - np.dot(X[i],w) * y[i]))) for i in range(X.shape[0])], axis = 0)
哪里y.shape = (N,)
, X.shape = (N,M)
, w.shape = (M,)
输出的形状必须是 (M,)
.
我不知道要使用哪些 numpy 函数(点、内部或类似的函数)。我将不胜感激任何提示=)
最佳答案
这是一种向量化方法,利用 np.dot
的高效矩阵乘法
-
n = y.shape[0]
exp_val = (1 - 1 / (1 + np.exp(-np.dot(X,w)*y)))
out = -(y*exp_val).dot(X)/n
我们基本上分两部分来解决/向量化它:
1) 向量化:np.dot(X[i],w) * y[i]
通过执行np.dot(X,w)
,从而执行所有这些迭代点积一次性完成。
2) 使用点积
模拟y[i] * X[i] *指数部分
的均值
,求和归约,然后除以沿归约轴的元素数量。
运行时测试和验证
方法 -
def original_app(y,X,w):
return [np.mean([-y[i] * X[i] * (1 - 1 / (1 + np.exp( - \
np.dot(X[i],w) * y[i]))) for i in range(X.shape[0])], axis = 0)]
def vectorized_app(y,X,w):
n = y.shape[0]
exp_val = (1 - 1 / (1 + np.exp(-np.dot(X,w)*y)))
out = -(y*exp_val).dot(X)/n
return out
时间安排 -
In [117]: N,M = 300,400
...: y = np.random.rand(N)
...: X = np.random.rand(N,M)
...: w = np.random.rand(M)
...:
In [118]: out1 = original_app(y,X,w)
In [120]: out2 = vectorized_app(y,X,w)
In [121]: np.allclose(out1, out2)
Out[121]: True
In [122]: %timeit original_app(y,X,w)
1000 loops, best of 3: 1.29 ms per loop
In [123]: %timeit vectorized_app(y,X,w)
10000 loops, best of 3: 47.1 µs per loop
关于Python Numpy 计算不循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42950161/