我正在努力学习如何使用Theano。我经常进行生存分析,因此我希望尝试使用Theano的自动分化和梯度下降来实现标准生存模型。我试图实现的模型称为Cox模型,这里是维基百科文章: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所希望的那样实现这个成本函数,所以我希望得到一些关于如何改进这个代码以便它起作用的指导。
答案 0 :(得分:0)
您正在混合符号和非符号操作,但这不起作用。
例如,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。