Sklearn Факторный анализ Ортогональное вращение varimax увеличивает корреляцию факторовPython

Программы на Python
Ответить
Anonymous
 Sklearn Факторный анализ Ортогональное вращение varimax увеличивает корреляцию факторов

Сообщение Anonymous »

Я использую факторный анализ 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»