def _compute_A(X, pi, classes): """ Compute the A matrix in the variance estimation technique. Parameters ---------- X : array The feature matrix. pi : array The probability matrix predicted by the classifier. classes : array The list of class names ordered lexicographically. Returns ------- A : array The A matrix as part of the variance calcucation. """ n_classes = len(classes) n_features = X.shape[1] n_samples = X.shape[0] width = n_classes * n_features one_in_k = LabelBinarizer(pos_label=1, neg_label=0).fit_transform(classes) I_same = one_in_k.repeat(n_features, axis=0) I_same = np.tile(I_same, n_samples) I_diff = 1 - I_same A = np.tile(pi.flatten(), (width, 1)) B = 1 - A C = -A D = pi.transpose().repeat(n_features, axis=0).repeat(n_classes, axis=1) E = X.transpose().repeat(n_classes, axis=1) E = np.tile(E, (n_classes, 1)) G = A * B * I_same + C * D * I_diff G = E * G outer = np.dot(G, G.transpose()) return outer