Theano行/列明智的减法

时间:2016-12-05 07:18:09

标签: numpy matrix vectorization theano

X是一个n乘d矩阵,W是一个m乘d矩阵,对于X中的每一行,我想计算{{1}中每一行的欧几里德距离平方1}},所以结果将是一个n乘m矩阵。

如果W中只有一行,这很容易

W

x = tensor.TensorType("float64", [False, False])() w = tensor.TensorType("float64", [False])() z = tensor.sum((x-w)**2, axis=1) fn = theano.function([x, w], z) print fn([[1,2,3], [2,2,2]], [2,2,2]) # [ 2. 0.] 是矩阵(在Theano中)时我该怎么办?

2 个答案:

答案 0 :(得分:1)

简短回答,请使用scipy.spatial.distance.cdist

很长的答案,如果你没有scipy,就是通过轴0广播减法然后规范。

np.linalg.norm(X[:,:,None]-W[:,None,:], axis=0)

真的很长的答案,你有一个古老版本的numpy没有可升级linalg.norm(即你使用Abaqus)

np.sum((X[:,:,None]-W[:,None,:])**2, axis=0).__pow__(0.5)

按OP编辑
在Theano中,我们可以使XW两个三维矩阵并使相应的轴可以播放,如

x = tensor.TensorType("float64", [False, True, False])()
w = tensor.TensorType("float64", [True, False, False])()

z = tensor.sum((x-w)**2, axis=2)

fn = theano.function([x, w], z)
print fn([[[0,1,2]], [[1,2,3]]], [[[1,1,1], [2,2,2]]])
# [[ 2.  5.]
#  [ 5.  2.]]

答案 1 :(得分:0)

幸运的是W中的行数可以提前知道,所以我暂时不知道

x = tensor.TensorType("float64", [False, False])()
m = 2
w = tensor.as_tensor([[2,2,2],[1,2,3]])
res_list = []
for i in range(m):
    res_list.append(ten.sum((x-w[i,:])**2, axis=1))

z = tensor.stack(res_list)

fn = theano.function([x], z)
print fn([[1,2,3], [2,2,2], [2,3,4]])

# [[ 2.  0.  5.]
#  [ 0.  2.  3.]]

欢迎其他答案!