Аналіз зважених основних компонентів


17

Після деяких пошуків я знаходжу дуже мало щодо включення ваг спостереження / помилок вимірювань у аналіз основних компонентів. Те, що я знаходжу, зазвичай покладається на ітеративний підхід до включення зважувань (наприклад, тут ). Моє запитання, чому такий підхід необхідний? Чому ми не можемо використовувати власні вектори зваженої матриці коваріації?


1
На додаток до відповідей (-ів) нижче, будь ласка, див. Нитку stats.stackexchange.com/q/141754/3277 , де зважена PCA (з вагами на стовпцях та / або рядках) пояснюється як переважно еквівалентна зваженому (узагальненому) svd / біплот.
ttnphns

Відповіді:


33

Це залежить від того, на що саме важать ваги.

Рядові ваги

Нехай - матриця даних зі змінними в стовпцях і n спостереженнями x i в рядках. Якщо кожне спостереження має відповідну вагу w i , то включити ці ваги до PCA справді просто.Xnxiwi

По-перше, потрібно обчислити середньозважене і віднімаємо їх від даних, щобцентралізуватиїх.μ=1wiwixi

Потім обчислюємо зважену матрицю коваріації , деW=diag(wi)- діагональна матриця ваг, і застосуйте стандартний PCA для її аналізу.1wiXWXW=diag(wi)

Ваги клітин

У роботі Tamuz et al., 2013 , яку ви знайшли, розглядається складніший випадок, коли до кожного елемента матриці даних застосовуються різні ваги . Тоді аналітичного рішення справді немає, і доводиться використовувати ітеративний метод. Зауважимо, що, як визнають автори, вони винаходили колесо, оскільки такі загальні ваги, безумовно, були розглянуті раніше, наприклад, у Габріелі та Замірі, 1979, нижнє рангове наближення матриць за найменшими квадратами з будь-яким вибором ваг . Про це також йшлося тут .wij

Як додаткове зауваження: якщо ваги варіюються як із змінними, так і зі спостереженнями, але є симетричними, так що w i j = w j i , то аналітичне рішення знову можливе, див. Koren and Carmel, 2004, Міцне лінійне зменшення розмірності .wijwij=wji


Дякую за роз’яснення. Чи можете ви пояснити, чому жодне аналітичне рішення не можливе при поза діагональних вагах? Я це те , що мені НЕ вистачає з обох Тамуз і ін 2013 і Гавриїла і Замір 1979.
Noname

@noname: Я не знаю такого доказу, і більше того я не здивувався б, якби не було відомо. Як правило, доволі складно довести, що щось неможливо , зокрема, що щось неможливо аналітично. Неможливість кутової трисекції чудово чекала свого доказу протягом понад 2000 років ... (продовження)
амеба каже Reinstate Monica

3
@noname: (продовження), що ви просите, це показати, що проблема мінімізації стосовно A, обмеженого низьким рангом q . не зводиться до проблеми власного вектора. Я боюся, що вам знадобиться інший форум для цього (можливо, mathoverflow?). Але зауважте, що пошук власних векторів також не є саме аналітичним рішенням: це просто те, що ітерації зазвичай безшумно виконуються за допомогою стандартної функції бібліотеки. i,jwij(XijAij)2Aq
amoeba повідомляє про відновлення Моніки

2
+1. Перший розділ відповіді можна концептуалізувати також з точки зору зваженого (узагальненого) біплоту, як описано тут . Маючи на увазі, як PCA є "конкретним випадком" Біплота (також стосується викладеної відповіді).
ttnphns

@ttnphns: Після того, як ваш коментар та ще одна нитка закрита як дублікат, я перечитав свою відповідь і розширив пояснення, як поводитися з вагою рядків. Я вважаю, що раніше це було не зовсім коректно або, принаймні, не було повно, тому що я не згадав про центрування із середньозваженим значенням. Я сподіваюся, це має більше сенсу зараз!
Амеба каже: Відновити Моніку

5

Дуже дякую амебі за розуміння щодо ваг рядків. Я знаю, що це не stackoverflow, але у мене виникли певні труднощі, щоб знайти реалізацію PCA з зваженим рядком з поясненням, і, оскільки це один з перших результатів при гуглінгу для зваженого PCA, я подумав, що було б добре приєднати своє рішення , можливо, це може допомогти іншим у тій же ситуації. У цьому фрагменті коду Python2 PCA, зважений з ядром RBF, як описаний вище, використовується для обчислення дотичних даних 2D набору даних. Я буду дуже радий почути відгуки!

def weighted_pca_regression(x_vec, y_vec, weights):
    """
    Given three real-valued vectors of same length, corresponding to the coordinates
    and weight of a 2-dimensional dataset, this function outputs the angle in radians
    of the line that aligns with the (weighted) average and main linear component of
    the data. For that, first a weighted mean and covariance matrix are computed.
    Then u,e,v=svd(cov) is performed, and u * f(x)=0 is solved.
    """
    input_mat = np.stack([x_vec, y_vec])
    weights_sum = weights.sum()
    # Subtract (weighted) mean and compute (weighted) covariance matrix:
    mean_x, mean_y =  weights.dot(x_vec)/weights_sum, weights.dot(y_vec)/weights_sum
    centered_x, centered_y = x_vec-mean_x, y_vec-mean_y
    matrix_centered = np.stack([centered_x, centered_y])
    weighted_cov = matrix_centered.dot(np.diag(weights).dot(matrix_centered.T)) / weights_sum
    # We know that v rotates the data's main component onto the y=0 axis, and
    # that u rotates it back. Solving u.dot([x,0])=[x*u[0,0], x*u[1,0]] gives
    # f(x)=(u[1,0]/u[0,0])x as the reconstructed function.
    u,e,v = np.linalg.svd(weighted_cov)
    return np.arctan2(u[1,0], u[0,0]) # arctan more stable than dividing


# USAGE EXAMPLE:
# Define the kernel and make an ellipse to perform regression on:
rbf = lambda vec, stddev: np.exp(-0.5*np.power(vec/stddev, 2))
x_span = np.linspace(0, 2*np.pi, 31)+0.1
data_x = np.cos(x_span)[:-1]*20-1000
data_y = np.sin(x_span)[:-1]*10+5000
data_xy = np.stack([data_x, data_y])
stddev = 1 # a stddev of 1 in this context is highly local
for center in data_xy.T:
    # weight the  points based on their euclidean distance to the current center
    euclidean_distances = np.linalg.norm(data_xy.T-center, axis=1)
    weights = rbf(euclidean_distances, stddev)
    # get the angle for the regression in radians
    p_grad = weighted_pca_regression(data_x, data_y, weights)
    # plot for illustration purposes
    line_x = np.linspace(-5,5,10)
    line_y = np.tan(p_grad)*line_x
    plt.plot(line_x+center[0], line_y+center[1], c="r")
    plt.scatter(*data_xy)
    plt.show()

І вибір вибірки (це те ж саме для кожної точки): enter image description here

Ура,
Андрес

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.