Оберніть компоненти PCA, щоб вирівняти дисперсію в кожному компоненті


9

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

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

Інший спосіб - зіставити ПК назад у вихідний простір функцій, але в цьому випадку розмірність також збільшиться до вихідного значення.

Я думаю, що краще зберегти отримані стовпчики ортогональними, але це наразі не обов'язково.


1
Ні ... varimax максимізує суму відхилень у квадраті навантажень, тому намагається зробити їх максимально нерівними . Крім того, чому ви хочете зрівняти компоненти? Вся справа в тому, щоб зафіксувати якомога більше змін у якомога менше компонентах.

2
Чи вам не підходить просто стандартизація балів компонентів до відхилень одиниць? Чому тоді? Якого результату ви хочете - чи повинні у результаті отримані стовпці бути невідповідними, крім рівних дисперсій?
ttnphns

2
З вашого опису виглядає дуже схоже на те, що ви хочете просто "сферувати" дані (зменшеної розмірності). Це часто робиться як крок попередньої обробки машинного навчання. Щоб цього досягти, ви просто виконуєте PCA, вибираєте деякі компоненти та стандартизуєте їх. Я думаю, можна знайти ортогональне обертання (наприклад, варімакс), яке обертає стандартизовані компоненти таким чином, що вони залишаються некорельованими, але пояснюють точно таку ж кількість дисперсії; це цікаве питання, мені потрібно подумати над цим. Але я ніколи не бачив цього робити, безумовно, не в машинному навчанні.
амеба

2
До речі, що таке "деякі алгоритми машинного навчання", які ви хочете застосувати після PCA? Це може бути актуальним.
амеба

1
Зауважте, що якщо ви обертаєте свої стандартизовані ПК, то відстані взагалі не зміняться! Тож насправді це не має значення для будь-якого наступного алгоритму, заснованого на відстані.
амеба

Відповіді:


10

Мені не зовсім зрозуміло, що те, що ви запитуєте, те, що вам насправді потрібно: загальний крок попередньої обробки в машинному навчанні - це зменшення розмірності + відбілювання, що означає виконання PCA та стандартизацію компонентів, нічого іншого. Але я все ж зупинюсь на вашому питанні, як це сформульовано, адже це цікавіше.


Дозволяє X бути центром n×dматриця даних із точками даних у рядках та змінними у стовпцях. PCA дорівнює сингулярному розкладанню величини

X=USVUkSkVk,
де виконати зменшення розмірності, ми зберігаємо лише kкомпоненти. Ортогональне "факторне обертання" цих компонентів передбачає вибір ортогональногоk×k матриця R і підключивши його до розкладання:
XUkSkVk=UkRRSkVk=n1UkRRotatedstandardized scoresRSkVk/n1Rotated loadings.
Ось n1UkRобертаються стандартизованими компонентами, а другий член представляє поворотні вантажі, що переміщуються. Дисперсія кожного компонента після обертання задається сумою квадратів відповідного вектора навантаження; перед обертанням просто . Після обертання це щось інше.si2/(n1)

Тепер ми готові сформулювати задачу в математичному відношенні: задані невратовані навантаження , знаходимо матрицю обертання таким, що обертові навантаження, , має рівну суму квадратів у кожному стовпчику.L=VkSk/n1RLR

Давайте вирішимо. Сума стовпців квадратів після обертання дорівнює діагональним елементам Це має сенс: обертання просто перерозподіляє дисперсії компонентів, які спочатку задаються між ними, відповідно до цієї формули. Нам потрібно їх перерозподілити, щоб вони всі дорівнювали середньому значенню .

(LR)LR=RS2n1R.
si2/(n1)μ

Я не думаю, що для цього є рішення закритої форми, і насправді існує багато різних рішень. Але рішення можна легко побудувати послідовно:

  1. Візьміть перший компонент і -й компонент. Перший має дисперсію а останній - дисперсію .kσmax>μσmin<μ
  2. Оберніть лише ці два так, щоб дисперсія першого стала рівною . Матриця обертання у 2D залежить лише від одного параметра і легко записати рівняння та обчислити необхідне . Дійсно, і після перетворення перший ПК отримає дисперсію з якого ми одержуємоμθθ
    R2D=(cosθsinθsinθcosθ)
    cos2θσmax+sin2θσmin=cos2θσmax+(1cos2θ)σmin=μ,
    cos2θ=μσminσmaxσmin.
  3. Перший компонент зараз зроблений, він має дисперсію .μ
  4. Перехід до наступної пари, беручи компонент з найбільшою дисперсією та той, який має найменшу дисперсію. Гото №2.

Це дозволить перерозподілити всі дисперсії однаково послідовністю 2D обертів. Помноживши всі ці матриці обертання разом дасть загальну .(k1)R


Приклад

Розглянемо таку матрицю :Середня дисперсія . Мій алгоритм діятиме так:S2/(n1)

(10000060000300001).
5
  1. Крок 1: поверніть PC1 і PC4, щоб PC1 отримав дисперсію . В результаті PC4 отримує дисперсію .51+(105)=6

  2. Крок 2: поверніть PC2 (нова максимальна дисперсія) та PC3, щоб PC2 отримав дисперсію . В результаті PC3 отримує дисперсію .53+(65)=4

  3. Крок 3: поверніть PC4 (нова максимальна дисперсія) та PC3, щоб PC4 отримав дисперсію . В результаті PC3 отримує дисперсію .54+(61)=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

Кінцева матриця обертання (добуток трьох двовимірних матриць обертання):

 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

І остаточна матриця:(LR)LR

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

Зауважимо, що ця проблема повністю еквівалентна наступній: некорельованих змінних із відхиленнями , знайдіть обертання (тобто нову ортогональну основу), яка дасть змінних з однаковими відхиленнями (але, звичайно, більше не співвідносяться).kσi2k


Я думаю, що для будь-яких двох пар компонентів (їх балів) кут повороту склав би 45 градусів, щоб вирівняти їх відхилення. Однак я не уявляю, як виконати ціле завдання з 3+ компонентами попарно.
ttnphns

1
@feilong, я думаю, що вирівнювання дисперсії пари компонентів за раз - це дуже неоптимальний алгоритм. Я запропонував вибрати обертання таким чином, щоб дисперсія одного компонента стала точно рівною середньою глобальною дисперсією. Тоді цей компонент "робиться", і можна впоратися з рештою. Це гарантовано вирівняє всі відхилення в кінцевій кількості кроків. Дивіться приклад в моєму попередньому коментарі.
амеба

1
@amoeba Ви маєте рацію, це краще рішення, і його слід завершити кроками n-1.
feilong

1
@amoeba Я додав свою мінімальну реалізацію за допомогою Python. Я змінив частину, множивши всю матрицю, оскільки це може зайняти багато часу для великих матриць.
feilong

1
@amoeba Спеціально для основних компонентів можна заощадити більше часу, видаливши деталь, шукаючи максимум та мінімум. Ми можемо просто обертати 1-й і 2-й компоненти (щоб 1-й компонент мав середню дисперсію), а потім 2-й і 3-й компоненти тощо. Нам просто потрібно переконатися, що загальна дисперсія кожної пари більша за mu.
feilong

2

У своїй проникливій та вичерпній відповіді @amoeba показав - як частину відповіді - як можна обертати дві некорельовані змінні (наприклад, головні компоненти, наприклад), щоб досягти бажаних варіацій для них (хоча, за рахунок втрати некорельованості, звичайно) . Нехай ортогональні змінніX і Y мають відхилення σmax2 (більший) і σmin2(менший) відповідно. Поверніть їх так, щобX отримає довільну, зменшену дисперсію μ2 (поки Yотже, стане дисперсією σmax2+σmin2μ2).

@amoeba показує формулу, з якої ми можемо обчислити кут такого обертання, cosθ:

μ2=cos2θ(σmax2)+sin2θ(σmin2)

але не продемонстрував, звідки походить це рівняння; напевно, думаючи, що це очевидно без пояснень. Очевидно чи ні, я вважаю, що це варто з'ясувати - якимось чином. Моя відповідь представляє один спосіб.

Отже, у нас є еліпсоїдальне, зосереджене хмара даних у просторі некоррельованих змінних X і Y. Треба обертати осі на кутθ. Точка даних у хмарі (наприклад, на малюнку зображена зеленою плямою) зX координувати x матиме цю координату як x після обертання.

ілюстрація обертання

Зауважте, що проекція координати x виїмка на обертову вісьX дається x=xcosθ(катет як гіпотенуза і кут між ними). Зверніть увагу і на цеx менше, ніж x по розрізу довжини xx обчислюється з координати y: ysinθ(ще один катет і гіпотенуза). І так,

x=x(xx)=xcosθysinθ

Ми знаємо (див. Початок) дисперсії (або суми квадратів) двох змінних та дисперсії (сума квадратів) μ2 з X. Потім випливає:

μ2=x2=(xcosθysinθ)2=(x2cos2θ+y2sin2θ2xycosθsinθ)=cos2θx2+sin2θy22cosθsinθxy=0 (X and Y are uncorrelated)=cos2θ(σmax2)+sin2θ(σmin2)

З якого ви оцінюєте cosθ, як показав @amoeba, і виконайте обертання.


2
+1. Я не думав, що це очевидно (це не так), але я швидше думав, що це легко перевірити :-) Можна це також показати прямою алгеброю, записуючи (як у моїй відповіді)
(cosθsinθsinθcosθ)(σmax200σmin2)(cosθsinθsinθcosθ),
і обчислення верхнього лівого елемента виробу. Це, звичайно, ті ж міркування, просто виражені по-різному. Дякую!
амеба

І я думаю, що ваше геометричне пояснення та "пряме" обчислення (без матриць) легше зрозуміти і дуже корисно розвивати правильну інтуїцію.
амеба

0

Якщо я інтерпретую речі правильно, ви маєте на увазі, що перший компонент принципу (власне значення) пояснює більшість дисперсій у даних. Це може статися, коли ваш метод стиснення лінійний. Однак у вашому просторі можливостей можуть бути нелінійні залежності.

TL / DR: PCA - це лінійний метод. Використовуйте Autoencoders (нелінійні pca) для зменшення розмірності. Якщо частина машинного навчання знаходиться під наглядом, просто відстежуйте свою функцію втрат, коригуючи (гіпер) параметри для автокодера. Таким чином ви отримаєте набагато краще стиснуту версію своїх оригінальних даних.

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

Порада: Autoencoders не має рішення закритої форми (afaik), тому якщо ваш контекст передає потокові дані, це означає, що ви можете постійно оновлювати свій автокодер (стиснене представлення) і, таким чином, компенсувати такі речі, як поняття дрейфу. З pca вам доведеться час від часу тренувати пакетний режим, коли надходять нові дані.

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


Я не бачу, як це відповідає на питання ОП; ваша відповідь здається абсолютно не пов'язаною з питанням.
амеба

Тому мені було цікаво: чи існує простий спосіб просто розділити свою дисперсію та поділитися нею з ПК з меншими дисперсіями? ОП хоче зменшити розмірність. Я запропонував альтернативну можливість вирішити його проблему, оскільки в кінцевому рахунку те, що хоче ОП, не гарантує кращого результату, якщо ефективність не буде оцінена. Робота в гільбертових просторах / нормованих просторах не гарантує кращих результатів. Вимірювання продуктивності призводить до кращих результатів.
shuriken x blue
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.