'Compute Huber\'s proposal 2 estimate of scale, using an optional
initial value of scale and an optional estimate of mu. If mu
is supplied, it is not reestimated.
Parameters
a : array
1d array
mu : float or None, optional
If the location mu is supplied then it is not reestimated.
Default is None, which means that it is estimated.
initscale : float or None, optional
A first guess on scale.  If initscale is None then the standardized
median absolute deviation of a is used.
Notes
`Huber` minimizes the function
sum(psi((a[i]-mu)/scale)**2)
as a function of (mu, scale), where
psi(x) = np.clip(x, -self.c, self.c)'

def __call__(self, a, mu=None, initscale=None, axis=0):

    a = np.asarray(a)
    if (mu is None):
        n = (a.shape[0] - 1)
        mu = np.median(a, axis=axis)
        est_mu = True
    else:
        n = a.shape[0]
        mu = mu
        est_mu = False
    if (initscale is None):
        scale = mad(a, axis=axis)
    else:
        scale = initscale
    scale = tools.unsqueeze(scale, axis, a.shape)
    mu = tools.unsqueeze(mu, axis, a.shape)
    return self._estimate_both(a, scale, mu, axis, est_mu, n)
