Ağırlıklı temel bileşenler analizi


17

Bazı araştırmalardan sonra, gözlem ağırlıklarının / ölçüm hatalarının temel bileşenler analizine dahil edilmesinde çok az şey buluyorum. Bulduğum şey, ağırlıkları (örneğin, burada ) dahil etmek için yinelemeli yaklaşımlara dayanma eğilimindedir . Sorum şu: Bu yaklaşım neden gerekli? Ağırlıklı kovaryans matrisinin özvektörlerini neden kullanamıyoruz?


1
Aşağıdaki cevaba / cevaplara ek olarak, ağırlıklı PCA'nın (sütunlar ve / veya satırlardaki ağırlıklar ile) ağırlıklı ağırlıklı (genelleştirilmiş) svd / Biplot.
ttnphns

Yanıtlar:


33

Ağırlıklarınızın tam olarak ne olduğuna bağlıdır.

Sıra ağırlıkları

Xnxiwi

İlk olarak, ağırlıklı ortalama hesaplamak gerekirμ=1wiwixi

1wiXWXW=diag(wi)

Hücre ağırlıkları

wij

wijwij=wji


Açıklama için teşekkürler. Diyagonal olmayan ağırlıklar ile neden analitik çözümün mümkün olmadığını açıklayabilir misiniz? Ben hem Tamuz et al 2013 hem de Gabriel ve Zamir 1979'da eksik olduğum şey bu.
noname

@noname: Böyle bir ispatın farkında değilim, dahası bilinmezse şaşırmam. Bir şeyin mümkün olmadığını , özellikle de analitik olarak bir şeyin mümkün olmadığını kanıtlamak genellikle oldukça zordur . Açı üçlülüğünün imkansızlığı ünlü olarak 2000 yılı aşkın bir süredir kanıtını bekledi ... (devam)
amip diyor Reinstate Monica

3
i,jwij(XijAij)2Aq
amoeba, Reinstate Monica'ya

2
+1. Cevabın ilk bölümü, burada açıklandığı gibi Ağırlıklı (Genelleştirilmiş) Biplot açısından da kavramsallaştırılabilir . PCA'nın "spesifik" bir Biplot örneği (akılda kalıcı cevapla da ilgilidir) olduğunu akılda tutarak.
ttnphns

@ttnphns: Yorumunuz ve başka bir iş parçacığı yinelenen olarak kapatıldıktan sonra, cevabımı tekrar okudum ve satır ağırlıkları ile nasıl başa çıkılacağının açıklamasını genişlettim. Daha önce tamamen doğru olmadığını düşünüyorum ya da en azından tam değildi çünkü ağırlıklı ortalama ile merkezleme bahsetmedim. Umarım şimdi daha mantıklı!
amip diyor Reinstate Monica

5

Sıra ağırlıklarıyla ilgili içgörü için çok teşekkür ederim. Bunun yığın akışı olmadığını biliyorum, ancak satır ağırlıklı PCA'nın açıklamasını içeren bir uygulama bulmakta zorlandım ve bu, ağırlıklı PCA için googling yaparken ilk sonuçlardan biri olduğu için, çözümümü eklemenin iyi olacağını düşündüm , belki aynı durumda başkalarına yardımcı olabilir. Bu Python2 kod snippet'inde, yukarıda açıklanan gibi RBF çekirdeği olan bir PCA, bir 2D veri kümesinin teğetlerini hesaplamak için kullanılır. Bazı geri bildirimleri duymaktan çok mutlu olacağım!

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()

Ve bir örnek çıktı (her nokta için aynı şeyi yapar): resim açıklamasını buraya girin

Şerefe,
Andres

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.