def out_wls(Psi, S, q): S1 = S.copy() np.fill_diagonal(S1, 1 - Psi) eig_val, eig_vec = utils.eigen_sorted(S1) L = eig_vec[:, :q].dot(np.diag(np.sqrt(eig_val[:q]))) return L
def residual_function(Psi, S, n_factors, Sinv, method, obs): S1 = S.copy() np.fill_diagonal(S1, 1 - Psi) if (Sinv is not None): Sdinv = np.diag(1 / np.diag(Sinv)) eig_val, eig_vec = utils.eigen_sorted(S1) eig_val[eig_val < np.finfo(np.float64).eps] = \ 100 * np.finfo( np.float64).eps * 100 if n_factors > 1: loadings = eig_vec[:, :n_factors].dot( np.diag(np.sqrt(eig_val[:n_factors]))) else: loadings = eig_vec[:, 0:1] * np.sqrt(eig_val[0]) model = loadings.dot(loadings.T) if method == 'wls': residual = Sdinv.dot((S1 - model) ** 2).dot(Sdinv) elif method == 'gls': residual = (Sinv.dot(S1 - model)) ** 2 else: residual = (S1 - model) ** 2 if method == 'minres': np.fill_diagonal(residual, 0) else: # minchi residual *= obs np.fill_diagonal(residual, 0) return np.sum(residual)