python - Theano 成本函数

标签 python optimization machine-learning theano

我正在尝试学习如何使用 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.switchtheano.ifelse.ifelseSee the documentation for examples and details .

您还使用了 Python 循环,这可能不是您所需要的。要构建显式循环的 Theano 计算,您需要使用 theano.scan module 。但是,如果您可以用矩阵运算(点积、归约等)来表达您的计算,那么它的运行速度将比使用扫描的计算快得多。

我建议你再做一些工作Theano tutorials在尝试从头开始实现一些复杂的东西之前。

关于python - Theano 成本函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31772938/

相关文章:

python BeautifulSoup查找span id名称而不使用string\re方法

c++ - 为什么在这种特殊情况下数据类型会影响性能?

python - 使用多模型的装袋算法

python - 在 matplotlib pyplot 中使轴长度相同

python - 模块中的函数将值传递给调用它的父模块

python - os.path.basename 是用于文件系统文件吗?

c# - 确定性不变的 Actions 和 Funcs 是否由 JIT 内联?

python - Python 中 MIP 求解器 OR 工具的搜索策略

python - 在 scikit learn KNeighborsClassifier 中使用余弦距离

machine-learning - 偏差在神经网络中的作用是什么?