Взвешенный анализ основных компонентов


17

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


1
В дополнение к ответу (ответам) ниже, смотрите ветку stats.stackexchange.com/q/141754/3277 , где взвешенный PCA (с весовыми коэффициентами в столбцах и / или строках) объясняется как в основном эквивалентный взвешенному (обобщенному) svd / biplot.
ttnphns

Ответы:


33

Это зависит от того, к чему именно относятся ваши веса.

Весовые характеристики

Пусть - матрица данных с переменными в столбцах и наблюдений в строках. Если каждое наблюдение имеет ассоциированный вес , то действительно просто включить эти веса в PCA.Xnxiwi

Во-первых, нужно вычислить взвешенное среднее значение и вычесть его из данных, чтобы отцентрировать их.μ=1wiwixi

Затем мы вычисляем взвешенную ковариационную матрицу 1wiXWX , где W=diag(wi) - это диагональная матрица весов, и применять стандартный PCA для его анализа.

Вес клеток

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

В качестве дополнительного замечания: если веса меняются в зависимости от переменных и наблюдений, но симметричны, так что , то аналитическое решение снова возможно, см. Koren and Carmel, 2004, Robust Уменьшение линейной размерности .wijwij=wji


Спасибо за разъяснение. Можете ли вы объяснить, почему аналитическое решение невозможно с недиагональными весами? Я это то , что мне не хватает с обеих Тамуз и др 2013 и Гавриила и Замир 1979.
Noname

@noname: я не знаю о таком доказательстве, и более того, я бы не удивился, если бы его не знали. Обычно довольно сложно доказать, что что-то невозможно , в частности, что-то невозможно аналитически. Невозможность угловой трисекции, как известно, ждала своего доказательства более 2000 лет ... (продолжение)
говорит амеба Восстановить Монику

3
i,jwij(XijAij)2Aq
Амеба говорит Восстановить Монику

2
+1. Первый раздел ответа может быть концептуализирован также в терминах взвешенного (обобщенного) биплота, как описано здесь . Имея в виду, что PCA является «конкретным случаем» биплота (также затрагивается в выложенном ответе).
ttnphns

@ttnphns: После того, как ваш комментарий и другая ветка были закрыты как дубликат, я перечитал свой ответ и расширил объяснение того, как обращаться с весами строк. Я думаю, что ранее это было не совсем правильно или, по крайней мере, не было полным, потому что я не упомянул центрирование с помощью взвешенного среднего. Надеюсь, теперь это имеет больше смысла!
говорит амеба, восстанови Монику

5

Спасибо большое амеба за понимание весов рядов. Я знаю, что это не стекопоток, но у меня возникли некоторые трудности с поиском реализации взвешенного по строкам 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()

И пример вывода (он делает то же самое для каждой точки): введите описание изображения здесь

Ура,
Андрес

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.