нестабильные результаты KernelPCA пакет scikit

Я пытаюсь использовать KernelPCA для уменьшения размерности набора данных до 2D (как для целей визуализации, так и для дальнейшего анализа данных).

я экспериментировал с вычислением KernelPCA с использованием ядра RBF при различных значениях гаммы, но результат нестабилен:

anim

(каждый кадр представляет собой немного другое значение гаммы, где гамма непрерывно изменяется от 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.

RBFSampler с фиксированным семя:
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