我正在尝试学习如何使用 Theano。我经常进行生存分析,因此我想尝试使用 Theano 的自动微分和梯度下降来实现标准生存模型。我尝试实现的模型称为 Cox 模型,这是维基百科文章:https://en.wikipedia.org/wiki/Proportional_hazards_model
非常有帮助的是,他们在那里编写了偏似然函数,这是在估计 Cox 模型参数时最大化的函数。我对 Theano 很陌生,因此在实现这个成本函数时遇到困难,所以我正在寻找一些指导。
这是我到目前为止编写的代码。我的数据集有 137 条记录,因此我硬编码该值。 T 指的是张量模块,W 指的是维基百科文章中所说的 beta,status 指的是维基百科中所说的 C。其余变量与维基百科的表示法相同。
def negative_log_likelihood(self, y, status):
v = 0
for i in xrange(137):
if T.eq(status[i], 1):
v += T.dot(self.X[i], self.W)
u = 0
for j in xrange(137):
if T.gt(y[j], y[i]):
u += T.exp(T.dot(self.X[j], self.W))
v -= T.log(u)
return T.sum(-v)
不幸的是,当我运行这段代码时,我不幸遇到了无限递归错误,我希望这种情况不会发生。这让我觉得我还没有按照 Theano 想要的方式实现这个成本函数,所以我希望得到一些关于如何改进这段代码以使其正常工作的指导。
最佳答案
您正在混合符号和非符号操作,但这不起作用。
例如,T.eq
返回一个不可执行的符号表达式,表示比较两个事物是否相等的想法,但它实际上并没有进行比较,并且然后。 T.eq
实际上返回一个表示相等比较的 Python 对象,因为非 None
对象引用在 Python 中被视为与 True
相同,执行将始终在 if 语句内继续。
如果您需要构建涉及条件的 Theano 计算,那么您需要使用其两个符号条件操作之一:T.switch
或 theano.ifelse.ifelse
。 See the documentation for examples and details .
您还使用了 Python 循环,这可能不是您所需要的。要构建显式循环的 Theano 计算,您需要使用 theano.scan
module 。但是,如果您可以用矩阵运算(点积、归约等)来表达您的计算,那么它的运行速度将比使用扫描的计算快得多。
我建议你再做一些工作Theano tutorials在尝试从头开始实现一些复杂的东西之前。
关于python - Theano 成本函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31772938/