def __init__(self, ctr, am):
self.n = len(ctr) # dimension
self.ctr = np.array(ctr) # center coordinates
self.am = np.array(am) # precision matrix (inverse of covariance)
# Volume of ellipsoid is the volume of an n-sphere divided
# by the (determinant of the) Jacobian associated with the
# transformation, which by definition is the precision matrix.
self.vol = vol_prefactor(self.n) / np.sqrt(linalg.det(self.am))
# The eigenvalues (l) of `a` are (a^-2, b^-2, ...) where
# (a, b, ...) are the lengths of principle axes.
# The eigenvectors (v) are the normalized principle axes.
l, v = linalg.eigh(self.am)
if np.all((l > 0.) & (np.isfinite(l))):
self.axlens = 1. / np.sqrt(l)
else:
raise ValueError("The input precision matrix defining the "
"ellipsoid {0} is apparently singular with "
"l={1} and v={2}.".format(self.am, l, v))
# Scaled eigenvectors are the axes, where `axes[:,i]` is the
# i-th axis. Multiplying this matrix by a vector will transform a
# point in the unit n-sphere to a point in the ellipsoid.
self.axes = np.dot(v, np.diag(self.axlens))
# Amount by which volume was increased after initialization (i.e.
# cumulative factor from `scale_to_vol`).
self.expand = 1.
评论列表
文章目录