Вращайте компоненты PCA, чтобы выровнять дисперсию в каждом компоненте

9

Я пытаюсь уменьшить размерность и шум набора данных, выполняя PCA для набора данных и выбрасывая последние несколько ПК. После этого я хочу использовать некоторые алгоритмы машинного обучения на оставшихся ПК, и поэтому я хочу нормализовать данные путем выравнивания дисперсии ПК, чтобы алгоритмы работали лучше.

Один простой способ - просто нормализовать дисперсию для значений единиц. Однако первый компьютер содержит больше отклонений от исходного набора данных, чем следующие, и я все еще хочу придать ему больше «веса». Поэтому мне было интересно: есть ли простой способ просто разделить его дисперсию и поделиться ею с ПК с меньшими отклонениями?

Другой способ - отобразить ПК обратно в исходное пространство объектов, но в этом случае размерность также увеличится до исходного значения.

Я предполагаю, что лучше сохранять результирующие столбцы ортогональными, но в этом нет необходимости.

Feilong
источник
1
Нет ... varimax максимизирует сумму квадратов отклонений нагрузок, поэтому пытается сделать их как можно более неравными . Кроме того, почему вы хотите выровнять компоненты? Все дело в том, чтобы охватить как можно больше вариаций как можно меньшего числа компонентов.
2
Вас не устраивает простая стандартизация оценок компонентов к единичным отклонениям? Почему тогда? Какой результат вы хотите - должны ли результирующие столбцы быть некоррелированными в дополнение к равным отклонениям?
ttnphns
2
Из вашего описания очень похоже, что вы хотите просто «сферировать» данные (уменьшенной размерности). Это часто делается как шаг предварительной обработки в машинном обучении. Чтобы достичь этого, вы просто выполняете PCA, выбираете некоторые компоненты и стандартизируете их. Я предполагаю, что можно найти ортогональное вращение (такое как варимакс), которое вращает стандартизированные компоненты так, что они остаются некоррелированными, но объясняют точно такое же количество дисперсии; это интересный вопрос, мне нужно подумать об этом. Но я никогда не видел, чтобы это было сделано, определенно не в машинном обучении.
амеба
2
Кстати, какие «алгоритмы машинного обучения» вы хотите применить после PCA? Это может быть актуально.
амеба
1
Обратите внимание, что если вы вращаете ваши стандартизированные ПК, то расстояния не изменятся совсем! Так что это действительно не должно иметь значения для любого последующего алгоритма, основанного на расстоянии.
амеба

Ответы:

10

Мне не совсем ясно, что вы спрашиваете, что вам действительно нужно: обычным этапом предварительной обработки в машинном обучении является уменьшение размерности + отбеливание, что означает выполнение PCA и стандартизацию компонентов, и ничего больше. Но я все же остановлюсь на вашем вопросе в том виде, как он сформулирован, потому что он более интересен.


Пусть - центрированная матрица данных n × d с точками данных в строках и переменными в столбцах. РСА составляет сингулярное разложение Х = U S VU K S K V K , где для выполнения сокращения размерности мы держать только K компоненты. Ортогональное «вращение фактора» из этих компонентов предполагает выбор ортогонального K × K матрицы R и подключить его к разложению: XU K S к VИксN×d

Иксзнак равноUSВUКSКВК,
КК×КрВот
ИксUКSКВКзнак равноUКррSКВКзнак равноN-1UКрповернутогостандартизированные оценкирSКВК/N-1Поворотные нагрузки,
- повернутые стандартизированные компоненты, а второй член представляет повернутые нагрузки, транспонированные. Дисперсия каждого компонента после вращения задается суммой квадратов соответствующего вектора нагрузки; перед вращением это простоs 2 i /(n-1). После вращения это что-то еще.N-1UКрsя2/(N-1)

Теперь мы готовы сформулировать задачу в математических терминах: с учетом неповрежденных нагрузок , найдите матрицу вращенияRтак, чтобы вращаемые нагрузки,LR, имели равную сумму квадратов в каждом столбце.Lзнак равноВКSК/N-1рLр

Давайте решать это. Суммы столбцов квадратов после вращения равны диагональным элементам Это имеет смысл: вращение просто перераспределяет дисперсии компонентов, которые первоначально определяются какs 2 i /(n-1), между ними, согласно этой формуле. Нам нужно перераспределить их так, чтобы все они стали равными их среднему значениюμ.

(Lр)Lрзнак равнорS2N-1р,
sя2/(N-1)μ

Я не думаю, что есть закрытое решение этой проблемы, и на самом деле есть много разных решений. Но решение может быть легко построено последовательным способом:

  1. Возьмите первый компонент и компонент. Первый из них имеет дисперсию сг макс > М , а последний имеет дисперсию сг мин < μ .КσМаксимум>μσмин<μ
  2. Вращайте только эти два, так что дисперсия первого становится равной . Вращение матрицы в 2D зависит только от одного параметра θ, и легко записать уравнение и вычислить необходимое θ . Действительно, R 2D = ( Cos & thetas грех & thetas ; - грех & thetas ; соз & thetas ; ) и после преобразования первого ПК будет получить дисперсию сов 2 & thetas ; сг макс + грех 2 & thetas ; сг мин = соз 2 & thetas ; сгμθθ
    р2Dзнак равно(созθгрехθ-грехθсозθ)
    из которых мы сразу получаем соз 2 & thetas ; = ц - сг мин
    соз2θσМаксимум+грех2θσминзнак равносоз2θσМаксимум+(1-соз2θ)σминзнак равноμ,
    соз2θзнак равноμ-σминσМаксимум-σмин,
  3. Первый компонент готов, он имеет дисперсию .μ
  4. Перейдите к следующей паре, взяв компонент с наибольшей дисперсией и компонент с наименьшей дисперсией. Перейти к # 2.

Это перераспределит все дисперсии одинаково по последовательности 2D поворотов. Умножение всех этих матриц вращения даст общее значение R(К-1)р .


пример

S2/(N-1)

(10000060000300001),
5
  1. 51+(10-5)знак равно6 .

  2. 53+(6-5)знак равно4

  3. 54+(6-1)знак равно5

  4. Выполнено.

Я написал скрипт Matlab, который реализует этот алгоритм (см. Ниже). Для этой входной матрицы последовательность углов поворота равна:

48.1897   35.2644   45.0000

Отклонения компонентов после каждого шага (в строках):

10     6     3     1
 5     6     3     6
 5     5     4     6
 5     5     5     5

Конечная матрица вращения (произведение трех 2D матриц вращения):

 0.6667         0    0.5270    0.5270
      0    0.8165    0.4082   -0.4082
      0   -0.5774    0.5774   -0.5774
-0.7454         0    0.4714    0.4714

(Lр)Lр

5.0000         0    3.1623    3.1623
     0    5.0000    1.0000   -1.0000
3.1623    1.0000    5.0000    1.0000
3.1623   -1.0000    1.0000    5.0000

Вот код:

S = diag([10 6 3 1]);
mu = mean(diag(S));
R = eye(size(S));

vars(1,:) = diag(S);
Supdated = S;

for i = 1:size(S,1)-1
    [~, maxV] = max(diag(Supdated));
    [~, minV] = min(diag(Supdated));

    w = (mu-Supdated(minV,minV))/(Supdated(maxV,maxV)-Supdated(minV,minV));
    cosTheta = sqrt(w);
    sinTheta = sqrt(1-w);

    R2d = eye(size(S));
    R2d([maxV minV], [maxV minV]) = [cosTheta sinTheta; -sinTheta cosTheta];
    R = R * R2d;

    Supdated = transpose(R2d) * Supdated * R2d;    

    vars(i+1,:) = diag(Supdated);
    angles(i) = acosd(cosTheta);
end

angles                %// sequence of 2d rotation angles
round(vars)           %// component variances on each step
R                     %// final rotation matrix
transpose(R)*S*R      %// final S matrix

Вот код на Python, предоставленный @feilong:

def amoeba_rotation(s2):
    """
    Parameters
    ----------
    s2 : array
        The diagonal of the matrix S^2.

    Returns
    -------
    R : array
        The rotation matrix R.

    Examples
    --------
    >>> amoeba_rotation(np.array([10, 6, 3, 1]))
    [[ 0.66666667  0.          0.52704628  0.52704628]
     [ 0.          0.81649658  0.40824829 -0.40824829]
     [ 0.         -0.57735027  0.57735027 -0.57735027]
     [-0.74535599  0.          0.47140452  0.47140452]]

    http://stats.stackexchange.com/a/177555/87414
    """
    n = len(s2)
    mu = s2.mean()
    R = np.eye(n)
    for i in range(n-1):
        max_v, min_v = np.argmax(s2), np.argmin(s2)
        w = (mu - s2[min_v]) / (s2[max_v] - s2[min_v])
        cos_theta, sin_theta = np.sqrt(w), np.sqrt(1-w)
        R[:, [max_v, min_v]] = np.dot(
            R[:, [max_v, min_v]],
            np.array([[cos_theta, sin_theta], [-sin_theta, cos_theta]]))
        s2[[max_v, min_v]] = [mu, s2[max_v] + s2[min_v] - mu]
    return R

Кσя2К

амеба
источник
Я предполагаю, что для любых двух пар компонентов (их оценки) угол поворота будет 45 градусов, чтобы выровнять их отклонения. Однако я не представляю, как выполнить всю задачу с 3+ компонентами попарно.
ttnphns
1
@feilong, я думаю, что выравнивание дисперсии пары компонентов за один раз является очень неоптимальным алгоритмом. Я предложил выбрать такие повороты, чтобы дисперсия одного компонента стала точно равной глобальной средней дисперсии. Тогда этот компонент «готов», и с остальным можно разобраться. Это гарантированно выровняет все дисперсии за конечное число шагов. Смотрите мой предыдущий комментарий для примера.
амеба
1
@amoeba Вы правы, это лучшее решение, и должно закончить с n-1 шагов.
Feilong
1
@amoeba Я добавил свою минимальную реализацию с использованием Python. Я изменил часть, умножив всю матрицу, так как это может занять много времени для больших матриц.
Feilong
1
@amoeba Специально для основных компонентов можно сэкономить больше времени, удалив детали, ища максимум и минимум. Мы можем просто повернуть 1-й и 2-й компоненты (чтобы 1-й компонент имел среднюю дисперсию), а затем 2-й и 3-й, и так далее. Нам просто нужно убедиться, что общая дисперсия каждой пары больше, чем mu.
Feilong
2

ИксYσмaИкс2σмяN2Иксμ2YσмaИкс2+σмяN2-μ2

созθ

μ2знак равносоз2θ(σмaИкс2)+грех2θ(σмяN2)

но не продемонстрировал, откуда это уравнение; вероятно, думая, что это очевидно без объяснения причин. Очевидно это или нет, я полагаю, что это стоит объяснить - в некотором роде. Мой ответ представляет один из способов.

ИксYθИксИксИкс*

иллюстрация вращения

Икс Икс*Икс'знак равноИкссозθИкс*Икс'Икс'-Икс*YYгрехθ

Икс*знак равноИкс'-(Икс'-Икс*)знак равноИкссозθ-Yгрехθ

μ2Икс*

μ2знак равноΣИкс*2знак равноΣ(Икссозθ-Yгрехθ)2знак равноΣ(Икс2соз2θ+Y2грех2θ-2ИксYсозθгрехθ)знак равносоз2θΣИкс2+грех2θΣY2-2созθгрехθΣИксY= 0 (X и Y некоррелированы)знак равносоз2θ(σмaИкс2)+грех2θ(σмяN2)

созθ

ttnphns
источник
2
(созθгрехθ-грехθсозθ)(σМаксимум200σмин2)(созθгрехθ-грехθсозθ),
и вычисление верхнего левого элемента продукта. Это, конечно, одно и то же рассуждение, просто выраженное по-разному. Спасибо!
амеба
И я думаю, что ваше геометрическое объяснение и «прямые» вычисления (без матриц) легче понять и очень полезно для разработки правильной интуиции.
амеба
0

Если я правильно интерпретирую вещи, вы имеете в виду, что первый основной компонент (собственное значение) объясняет большую часть различий в данных. Это может произойти, когда ваш метод сжатия является линейным. Однако в вашем пространстве пространственных объектов могут быть нелинейные зависимости.

TL / DR: PCA - это линейный метод. Используйте автоэнкодеры (нелинейные pca) для уменьшения размерности. Если часть машинного обучения - контролируемое обучение, просто следите за своей функцией потерь, настраивая (гипер) параметры для автоэнкодера. Таким образом, вы получите гораздо более сжатую версию исходных данных.

Вот пример scikit, где они выполняют поиск по сетке, чтобы найти оптимальное количество главных компонентов, которые нужно сохранить (гиперпараметр), используя PCA. Наконец, они применяют логистическую регрессию к пространству нижних измерений: http://scikit-learn.org/stable/auto_examples/plot_digits_pipe.html#example-plot-digits-pipe-py

Подсказка: автоэнкодеры не имеют решения для закрытой формы (afaik), поэтому, если ваш контекст представляет собой потоковую передачу данных, это означает, что вы можете постоянно обновлять свой автоэнкодер (сжатое представление) и, таким образом, компенсировать такие вещи, как смещение концепции. С помощью pca вы должны периодически переучивать пакетный режим по мере поступления новых данных.

Что касается придания некоторым функциям большего «веса», смотрите регуляризацию (я бы начал с норм https://en.wikipedia.org/wiki/Norm_(matmatics) ). Вы также можете быть удивлены, насколько логистическая регрессия похожа на персептрон.

сюрикен х синий
источник
Я не понимаю, как это отвечает на вопрос ОП; кажется, ваш ответ совершенно не связан с вопросом.
амеба
Поэтому мне было интересно: есть ли простой способ просто разделить его дисперсию и поделиться ею с ПК с меньшими отклонениями? ОП хочет уменьшить размерность. Я предложил альтернативу для решения его проблемы, поскольку в конечном итоге то, что хочет OP, не гарантирует повышения производительности, если производительность не измеряется. Работа в гильбертовых / нормированных пространствах не гарантирует лучших результатов. Измерение производительности приводит к лучшим результатам.
сюрикен х синий