нестабильные результаты KernelPCA пакет scikit
Я пытаюсь использовать KernelPCA для уменьшения размерности набора данных до 2D (как для целей визуализации, так и для дальнейшего анализа данных).
я экспериментировал с вычислением KernelPCA с использованием ядра RBF при различных значениях гаммы, но результат нестабилен:
(каждый кадр представляет собой немного другое значение гаммы, где гамма непрерывно изменяется от 0 до 1)
похоже, что это не так детерминированный.
есть ли способ стабилизировать его / сделать его детерминированным?
код, используемый для генерации преобразованных данных:
def pca(X, gamma1):
kpca = KernelPCA(kernel="rbf", fit_inverse_transform=True, gamma=gamma1)
X_kpca = kpca.fit_transform(X)
#X_back = kpca.inverse_transform(X_kpca)
return X_kpca
2 ответов
KernelPCA должен быть детерминированным и непрерывно развиваться с гамма.
он отличается от RBFSampler, который имеет встроенную случайность, чтобы обеспечить эффективную (более масштабируемую) аппроксимацию ядра RBF.
однако что может измениться в KernelPCA-это порядок главных компонентов: в scikit-learn они возвращаются отсортированными в порядке убывания собственного значения, поэтому, если у вас есть 2 собственных значения, близких друг к другу, может быть, что порядок меняется с гамма.
Я предполагаю (из gif), что это то, что происходит здесь: оси, по которым вы строите график, не постоянны, поэтому ваши данные, кажется, прыгают.
не могли бы вы предоставить код, который вы использовали для создания gif?
Я предполагаю, что это график точек данных вдоль 2 первых основных компонентов, но это поможет увидеть, как вы его создали.
вы можете попробовать дополнительно проверить его, посмотрев на значения kpca.alphas_ (собственные векторы)для каждого значения гаммы.
надеюсь, что это имеет смысл.
редактировать: как вы заметили, похоже, что точки отражаются от оси, наиболее правдоподобным объяснением является то, что один из собственных векторов переворачивает знак (обратите внимание, что это не влияет на собственное значение).
я вставил простая суть чтобы воспроизвести проблему (вам понадобится ноутбук Jupyter для ее запуска). Вы можете увидеть знак-листать когда вы изменяете значение гамма.
в качестве дополнения отметим, что такого рода несоответствие происходит только потому, что вы fit несколько раз объект KernelPCA несколько раз. Как только вы определились с определенным значением гаммы, и вы поместили kpca, как только вы можете вызвать transform несколько раз и получить согласованные результаты. Для классического PCA документы учтите, что:
из-за тонкостей реализации декомпозиции сингулярных значений (SVD), которая используется в этой реализации запуск fit дважды на одной и той же матрице может привести к основным компонентам с перевернутыми знаками (изменение направления). По этой причине важно всегда использовать один и тот же объект оценки для последовательного преобразования данных.
Я не знаю о поведении одного объекта KernelPCA, который вы поместили бы несколько раз (я не нашел ничего важного в документах).
Это не относится к вашему случаю, хотя, как вы должны соответствовать объект с несколькими значениями гаммы.
Так... Я не могу дать вам окончательного ответа на вопрос, почему KernelPCA
не детерминирована. Поведение напоминает различия, которые я наблюдал между результатами PCA и RandomizedPCA. PCA детерминирован, но RandomizedPCA нет, и иногда собственные векторы переворачиваются по знаку относительно собственных векторов PCA.
def pca(X, gamma1):
kernvals = RBFSampler(gamma=gamma1, random_state=0).fit_transform(X)
kpca = PCA().fit_transform(X)
X_kpca = kpca.fit_transform(X)
return X_kpca