加重主成分分析


17

いくつかの検索の後、主成分分析に観測値の重み/測定誤差を組み込むことはほとんどありません。私が見つけたものは、重み付けを含めるために反復アプローチに依存する傾向があります(たとえば、ここ)。私の質問は、なぜこのアプローチが必要なのですか?なぜ重み付き共分散行列の固有ベクトルを使用できないのですか?


1
以下の回答に加えて、スレッドstats.stackexchange.com/q/141754/3277を参照してください。ここで、重み付きPCA(列および/または行の重み付き)は、主に重み付き(一般化)svd /バイプロット。
ttnphns

回答:


33

体重が正確に何に適用されるかによります。

行の重み

ましょX列の変数とを有するデータ行列であるn観測xi列に。各観測値に関連する重みがある場合wi、これらの重みをPCAに組み込むのは確かに簡単です。

最初に、加重平均を計算し、それをデータから減算して中央に配置する必要があります。μ=1wiwixi

次に、重み付き共分散行列\ frac {1} {\ sum w_i} \ mathbf X ^ \ top \ mathbf W \ mathbf Xを計算します1wiXWX。ここで、W=diag(wi)は重みの対角行列です。標準のPCAを適用して分析します。

セル重量

Tamuz et al。、2013の論文では、データマトリックスの各要素に異なる重みが適用される場合のより複雑なケースが考慮されています。その場合、実際には分析的な解決策はなく、反復法を使用する必要があります。著者が認めたような一般的な重みは、確かに例えば、以前に考えられてきたとして、彼らは、ホイールを再発明、という注意重みの任意の選択を最小二乗法によりガブリエルとザミール、1979、行列の低ランク近似。これもここで議論されましたwij

追加の注釈として:重みが変数と観測値の両方で変化するが、対称であり、である場合、分析解が再び可能になります。Korenand Carmel、2004、Robustを参照してください線形次元削減wijwij=wji


明確化していただきありがとうございます。非対角線の重みでは分析ソリューションが不可能な理由を説明できますか?私はこれが、Tamuz et al 2013とGabriel and Zamir 1979の両方から欠けているものです。
noname 14

@noname:私はそのような証拠に気づいていません。さらに、それが知られていなくても驚かないでしょう。一般に、何かが不可能であること、特に分析的には不可能であることを証明することは非常に難しいです。角度の三等分の不可能では有名な... 2000年以上にわたり、その証拠を待っていた(続き)
アメーバが復活モニカ言う

3
@noname:(続き)何を求めていることは最小化する問題ことを示すことであるに関して持っているように拘束低ランク。固有ベクトル問題に還元できません。そのために別のフォーラムが必要になるのではないかと心配しています(おそらくmathoverflow?)。ただし、固有ベクトルを見つけることは、厳密には分析的な解決策ではないことに注意してください。反復は通常、標準ライブラリ関数によって静かに実行されるだけです。i,jwij(XijAij)2Aq
アメーバは、モニカを復活させる14

2
+1。答えの最初のセクションは、ここで説明されているように、加重(一般化)バイプロットの観点でも概念化できます。PCAがどのようにBiplotの「特定のケース」であるかを念頭に置いてください(また、並んだ答えに関係しています)。
ttnphns

@ttnphns:コメントと別のスレッドが重複として閉じられた後、答えを読み直し、行の重みを処理する方法の説明を拡張しました。以前は、重み付き平均によるセンタリングについては言及しなかったため、完全に正しくなかった、または少なくとも完全ではなかったと思います。私はそれが今より理にかなっていることを望みます!
アメーバは、2015

5

行の重みに関する洞察に感謝します。私はこれがスタックオーバーフローではないことを知っていますが、説明付きの行加重PCAの実装を見つけるのにいくつかの困難がありました。 、おそらく同じ状況の他の人を助けることができます。このPython2コードスニペットでは、上記のようにRBFカーネルで重み付けされたPCAを使用して、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()

サンプル出力(すべてのドットで同じことをします): ここに画像の説明を入力してください

乾杯、
アンドレス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.