[SciPy-User] speed up a python function using scipy constructs
josef.pktd at gmail.com
josef.pktd at gmail.com
Wed Mar 14 08:20:47 EDT 2012
On Wed, Mar 14, 2012 at 7:51 AM, Ernesto Adorio
<ernesto.adorio at gmail.com> wrote:
> Hi,
>
> The following function is a pure python implmentation of the multinomial
> logistic regression
> log likelihood function.
>
> <pre>
> def negmloglik(Betas, X, Y, m, reflevel=0):
> """
> log likelihood for polytomous regression or mlogit.
> Betas - estimated coefficients, as a SINGLE array!
> Y values are coded from 0 to ncategories - 1
>
> Betas matrix
> b[0][0] + b[0][1]+ b[0][2]+ ... + b[[0][D-1]
> b[1][0] + b[1][1]+ b[1][2]+ ... + b[[1][D-1]
> ...
> b[ncategories-1][0] + b[ncategories-1][1]+ b[ncategories-1][2]
> .... + ... + b[[ncategories - 1][D-1]
>
> Stored in one array! The beta coefficients for each level
> are stored with indices in range(level*D , level *D + D)
> X,Y data X matrix and integer response Y vector with values
> from 0 to maxlevel=ncategories-1
> m - number of categories in Y vector. each value of ylevel in Y must be
> in the
> interval [0, ncategories) or 0 <= ylevel < m
> reflevel - reference level, default code: 0
> """
>
> n = len(X[0]) # number of coefficients per level.
> L = 0
> for (xrow, ylevel) in zip(X,Y):
> h = [0.0] * m
> denom = 0.0
> for k in range(m):
> if k == reflevel:
> denom += 1
> else:
> sa = k * n
> v = sum([(x * b) for (x,b) in zip(xrow, Betas[sa: sa +
> n])])
> h[k] = v
> denom += exp(v)
> deltaL = h[ylevel] - log(denom)
> L += deltaL
> return -2 * L
> </pre>
>
> I am wondering if there are Scipy/Numpy constructs which can speed up the
> above Python implementation?
> Rewrite if necessary.
Maybe it helps to look at our implementation in statsmodels
https://github.com/statsmodels/statsmodels/blob/master/statsmodels/discrete/discrete_model.py#L1091
I didn't read your loop to see if it is the same.
Cheers,
Josef
>
> Regards,
> Ernesto
>
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
>
More information about the SciPy-User
mailing list