Я использую факторный анализ Scikit-Learn в приложении, которое основано на предположении, что факторы некоррелированы. Было бы здорово иметь больше интерпретируемых факторов, и ортогональное вращение, такое как варимакс, должно помочь.
Я не понимаю, почему это с помощью sklearn.decomposition.FactorAnaанализ(n_comComponents=n, Rotation="varimax") дает корреляции, которые на порядки больше, чем с Rotate=None. Для моего приложения r=1e-5 незначителен, а r=0,0015 - нет.
Этот эффект можно наблюдать (с различиями в 3/10 порядков) в приведенном ниже примере, полученном на основе примеров декомпозиции scikit-learn, и я также наблюдаю его в своем наборе данных, который примерно на порядок больше. Кажется, он не зависит (сильно) от количества компонентов и не зависит (для вращающихся факторов) от алгоритма SVD.
Я пробовал использовать код в этом ответе, который относится к пакету Factor_anlyzer, но я обнаружил большие корреляции (например, ~ 0,5, до такой степени, что я блуждаю, если неправильно понял смысл этого кода) или числовые ошибки в матричных операциях.
Использование FactorAnalyzer из пакета Factor_anlyzer дает корреляции одного и того же порядка без учета вращения. Мой текущий патч заключается в понижении версии scikit-learn и использовании Factor_anlyzer.
Есть идеи? Я что-то упускаю из значения выходных данных? Будет ли это считаться ошибкой?
Пример (посмотрите на масштаб цветовой панели!):
# sklearn's example
import numpy as np
import matplotlib.pyplot as plt
from numpy.random import RandomState
from sklearn import cluster, decomposition
from sklearn.datasets import fetch_olivetti_faces
rng = RandomState(0)
faces, _ = fetch_olivetti_faces(return_X_y=True, shuffle=True, random_state=rng)
n_samples, n_features = faces.shape
# Global centering (focus on one feature, centering all samples)
faces_centered = faces - faces.mean(axis=0)
# Local centering (focus on one sample, centering all features)
faces_centered -= faces_centered.mean(axis=1).reshape(n_samples, -1)
# My bit:
n_components = 20
for svd in ["lapack", "randomized"]:
for rotation in ["varimax", None]:
fa_estimator = decomposition.FactorAnalysis(
n_components=n_components, max_iter=20, svd_method=svd, rotation=rotation
)
factors = fa_estimator.fit_transform(faces_centered)
corr = np.corrcoef(factors, rowvar=False)
corr[np.diag_indices_from(corr)] = np.nan
plt.imshow(corr)
plt.colorbar()
plt.title("SVD method: %s, rotation: %s" % (svd, rotation))
plt.show()
Подробнее здесь: https://stackoverflow.com/questions/798 ... tion-of-fa