human
Complete this python program:
def fitbinnedgmm(distfn, freq, binedges, start, fixed=None, weightsoptimal=True):
assistant
#Here is the Python program you requested.

    """estimate parameters of distribution function for binned data using GMM
    Parameters
    distfn : distribution instance
    needs to have cdf method, as in scipy.stats
    freq : array, 1d
    frequency count, e.g. obtained by histogram
    binedges : array, 1d
    binedges including lower and upper bound
    start : tuple or array_like ?
    starting values, needs to have correct length
    fixed : None
    not used yet
    weightsoptimal : boolean
    If true, then the optimal weighting matrix for GMM is used. If false,
    then the identity matrix is used
    Returns
    paramest : array
    estimated parameters
    Notes
    todo: add fixed parameter option
    added factorial
    """
    if (not (fixed is None)):
        raise NotImplementedError
    nobs = np.sum(freq)
    if weightsoptimal:
        weights = (freq / float(nobs))
    else:
        weights = np.ones(len(freq))
    freqnormed = (freq / float(nobs))
    def gmmobjective(params):
        'negative    loglikelihood    function    of    binned    data\n\n                                corresponds    to    multinomial\n                                '
        prob = np.diff(distfn.cdf(binedges, *params))
        momcond = (freqnormed - prob)
        return np.dot((momcond * weights), momcond)
    return optimize.fmin(gmmobjective, start)