我正在尝试用python实现tSNE算法。我使用autograd包来计算梯度,而不是通常使用的解析梯度。
但我无法计算出所需的梯度。我是ML的新手,正在尝试使用autograd和其他框架。
所以,这就是我的方法。我首先计算相似度矩阵P,然后在计算损失的同时计算低维亲和度矩阵Q。这是我的代码-
def compute_kl_loss(Y, P, n):
loss = 0
for i in range(n):
qij = 1 / (1 + np.sum((Y[i,:] - Y)**2),1)
for j in range(n):
loss += P[i,j]* np.log(P[i,j]) - P[i,j]*np.log(qij)
return loss
def get_grad(Y, P):
n = Y.shape[0]
loss_kld = lambda Y: compute_kl_loss(Y, P, n)
gradY = grad(loss_kld)
dY = gradY(Y).但这种方法似乎行不通。我得到以下错误-
File "tsne.py", line 130, in compute_kl_loss
qij = 1 / (1 + np.sum((Y[i,:] - Y)**2),1)
TypeError: unsupported operand type(s) for /: 'int' and 'tuple'请告诉我如何纠正这个问题。我的方法是正确的吗?还是有更好的方法呢?
谢谢。
发布于 2017-09-13 10:37:52
在这一行中:
qij = 1 / (1 + np.sum((Y[i,:] - Y)**2),1)您正在创建一个元组,它包含:
left_part: 1 + np.sum((Y[i,:] - Y)**2)
right_part: 1元组是:my_tuple = (left_part, right_part)
这在你的错误中得到了很好的解释。
操作1 / (x, y) ((x, y)是一个元组)在python中无效,如错误所述!
所以你可能应该检查一下你的括号。
https://stackoverflow.com/questions/46186583
复制相似问题