Theano成本函数

时间:2015-08-02 14:35:55

标签: python optimization machine-learning theano

我正在努力学习如何使用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所希望的那样实现这个成本函数,所以我希望得到一些关于如何改进这个代码以便它起作用的指导。

1 个答案:

答案 0 :(得分:0)

您正在混合符号和非符号操作,但这不起作用。

例如,T.eq返回一个不可执行的符号表达式,表示为了相等而比较两个事物的想法,但它实际上并没有进行比较。 T.eq实际上返回一个表示相等比较的Python对象,因为非None对象引用被认为与Python中的True相同,所以执行将始终在if语句中继续。

如果您需要构建涉及条件的Theano计算,则需要使用其两个符号条件运算之一:T.switchtheano.ifelse.ifelseSee the documentation for examples and details

你也在使用Python循环,这可能不是你需要的。要构造明确循环的Theano计算,您需要使用theano.scan module。但是,如果您可以根据矩阵运算(点积,缩减等)来表达您的计算,那么它将比使用扫描的东西运行得更快,更快,更快。

我建议您在尝试从头开始实现复杂的工作之前先完成更多Theano tutorials