I was not sure of what is meant by `empirical_covariance` in English and after seeing that it does something different, I used my own implementation.

Now, I looked it up and I suspect there is a bug in the implementation of `empirical_covariance`. For non-centered data it should normalize using `(N - 1)` - the two following lines basically do the same, so should be 0:

    if assume_centered:
        covariance = np.dot(X.T, X) / X.shape[0]
    else:
        covariance = np.cov(X.T, bias=1)