我正在努力学习如何使用Theano。我经常从事生存分析工作,因此我想尝试使用Theano的自动微分和梯度下降来实现一个标准的生存模型。我正在尝试实现的模型被称为考克斯模型,这是维基百科上的文章:https://en.wikipedia.org/wiki/Proportional_hazards_model
非常有帮助的是,他们在那里写了部分似然函数,这是在估计Cox模型的参数时最大化的函数。我对Theano非常陌生,因此在实现这个成本函数时遇到了困难,所以我正在寻找一些指导。
以下是我到目前为止编写的代码。我的数据集有137条记录,因此我硬编码了这个值。T指的是张量模块,W指的是维基百科文章中所说的beta,状态指的是维基百科所说的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希望的方式实现这个成本函数,所以我希望得到一些关于如何改进这段代码的指导,以便它能够工作。
发布于 2015-08-03 16:13:41
您混合了符号和非符号操作,但这不起作用。
例如,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。
https://stackoverflow.com/questions/31772938
复制相似问题