Theano - 按组分

时间:2016-06-13 07:48:24

标签: python theano

我正在研究Theano的自定义似然函数(尝试拟合条件逻辑回归。)

可能性需要按组 对值进行求和。在R中我们有" ave()"函数,在Python Pandas中我们有" groupby()"。我怎么在Theano做类似的事情?

修改了更多详情

我想创建一个cox比例风险模型(与条件逻辑回归相同。)对数似然需要按组的总和:

\sum{_{g=1}^G

在熊猫中,这将是:

temp = df.groupby('groupid')['eta'].aggregate(np.sum)
denominator = np.log(temp).sum()

在数据中,我们有一个包含组ID的列,以及要求和的值

group    eta
1        2.1
1        1.8
1        0.9
2        1.2
2        0.75
2        1.42

组合和的输出则为:

group    sum
1        4.8
2        3.37

然后,总和的对数总和:

log(4.8) + log(3.37) = 2.7835

在熊猫中这很容易做到。我怎样才能在Thano做类似的事情?当然,可以写一个nexted循环,但这似乎很慢,我尽量避免手动编码循环,因为它们很慢。

谢谢!

1 个答案:

答案 0 :(得分:2)

假设你有" X" (所有你的etas的列表),昏暗。 Nx1(我猜)和一个矩阵H. H是一个NxG矩阵,它具有对这些组的热门编码。

你写的是:

import numpy as np
from numpy import newaxis as na
import theano.tensor as T

X = T.vector()
H = T.matrix()

tmp = T.sum(X[:, na] * H, axis=0)
O = T.sum(T.log(tmp))

x = np.array([5, 10, 10, 0.5, 5, 0.5])
# create a 1-hot encoding
g = np.array([1, 2, 2, 0, 1, 0])
h = np.zeros(shape=(len(x), 3))
for i,j in enumerate(g):
    h[i,j] = 1.0

O.eval({X:x, H: h})

只要每个点至少有一个eta(或者-inf),这个就应该有效。