[研究ノート] L1-PCA

L1-PCA

イントロ

低次元空間へのPCAの本質は、高次元空間から投影され、投影の性質は、低次元に(または右乗算)線形重み付けを通じて、ベクトル(特徴空間重リアプロジェクションの右側に元の特徴空間を特徴付ける)を、変換により残され空間の特性、マトリックスはベクトル(Mの組成によって想定ベクトル)によって置換されている場合には、m次元空間まで元の高次元空間の次元削減を吸引しました。

L1-PCA問題を解決するために、外れ値問題L1-PCAは、外れ値行いながら、PCAは、一般的に、より敏感外れ値である(PCAは、一般にノイズガウス、不従順に異常がある場合、時間が非常に悪い効果PCAであろうが、と仮定)であります敏感。

PCAレビュー

数学的な観点からどのようにPCAを理解することが必要です。

:のような私は、PCAは、本質的に変換一種でしばしば従って、行列乗算によって特徴付けることができることを形質転換し、上記前記
\ [\ Rにおける^ {P \ベクトル定義回1}、 Rにおける前記行列Xを\ ^ {N \回P}、その後次元削減にXの寸法が非常に簡単である:\\ X '= Xa因子、X
R ^ {N \回1}で' \ \] 信号では、我々は本を学んだ処理しますデータ次元削減が大きな分散を持つべき後、もちろん、我々はそれだと思うので、我々は、信号がより大きな分散を有する傾向があることを知っている、と雑音の分散は小さいです。したがって、次のステップは、分散を最大化することである:
\ [\シグマ^ 2_a =(XA)^ T(XA)= ^ TX = ^^ TXA TVA \]
分散最適化を最大化するには、次のタスクは、問題解決となっています、我々は、制約条件、ラグランジュの方法を紹介:
[TVA Zは、^ = \ - \ラムダ(^のTa - 1)1 \\ ^ \\\ FRAC TA = {\部分} Z {\部分A} =(V + V ^ T) - 2 \ラムダA = 2VA - 2 \ラムダA = 0 \\ - (\ラムダI V)\\得
A = 0 \] 明確特徴ベクトルVであります、我々は戻って固有値分解Vへ、私たちはこのようなベクターを得ています。

別の問題は、分散は、分散を適切に取る降順にソート各成分について計算された情報のより保持することです。

L1-PCA

次元縮小変換した後、新たな行列のL1ノルムが十分に大きくなければならないという考えにL1-PCA、L1ノルムは、対応する列の全ての最大値の行の合計を特徴付けます。

実際には、PCA等価形態の伝統(関連情報の具体的な証拠を参照)がある:
\ [\ MAX_ I = {W ^ TW WX} || || _2 ^ 2 \]
ながら、二ノルムを最大化することであるL1これは等価ではないが、結果は同様であることができる、および外れ値試験L1ノルムに対してよりロバストであることが-PCAは、L2ノルムL1ノルムによって置き換えられます。

したがってL1-PCAの問題が解決される
[\ MAX_ {W ^ TW \ = I} || || WX _1 \]

完全を求める1のではなく、私たちは通常、第2の変換ベクトルを求めるには、ワット形質転換ベクターを追求することで貪欲法により求め、というように、一つ一つを見つけることは、この問題への直接の解決策は、非常に困難であるので、行列。、問題となるW形質転換ベクターを解く:
\ [^ * = ArgのW \ max_w TX || W || _1 = Argの^ \ max_w \ ^ {N-sum_1} | W ^ TX_I |、被験体へ| .. | W || _2 = 1 \]
(T代表ラウンド)の最適化:
\ [W(T + 1)= \ {。FRAC \ sum_ 1 = {I}} ^ {N-P_I(T)X_I} {| | \ sum_ {i = 1} ^ {n}はP_I(T)X_I || _2} \\ P_I(T)= \ ^ T(T)X_I \ GE wは、&​​1 {{整列を開始\} \左0 \\ - 1&、^ T W (T)X_I <0 \\\端{整列} \右\]。

トレーニングデータXを更新し
、私は= [X_I ^ M = M-X_I ^ {} \。1. 1-W_ {M}(T_ {M-W ^}。1. 1-X_I ^ {M})。1 ... N- \ ]

具体的な証拠、以下を参照してください。

最適化は、L1-PCAを導出しました

コーディング

'''
@Descripttion: This is Aoru Xue's demo, which is only for reference.
@version: 
@Author: Aoru Xue
@Date: 2019-12-12 22:57:48
@LastEditors: Aoru Xue
@LastEditTime: 2019-12-13 00:50:29
'''
import numpy as np
import copy
from matplotlib import pyplot as plt
class L1PCA():
    def __init__(self,):
        pass
    def __call__(self,x,out_n = 2): # x (100,16)
        w = np.ones(shape = (x.shape[0],out_n))
        X = copy.copy(x)
        # 收的得到第一个w
        for epoch in range(100):
            w_t = w[:,0:1] # (100,1)
            top = np.zeros(shape = (X.shape[0],1)) # (100,1)
            for i in range(x.shape[1]):
                xi = X[:,i:i+1] # (100,1)
                pit = 0
                if w_t.T.dot(xi)>=0: # (1,100)@(100,1)
                    pit = 1
                else:
                    pit = -1
                top += (pit * xi)
            bottom = np.sqrt(np.sum(top**2))
            w[:,0:1] = top/bottom
        
        for j in range(1,out_n):
            for i in range(X.shape[1]):
                
                b = w[:,j-1:j]*(w[:,j-1:j].T.dot(X[:,i]))
                
            X[:,i:i+1] = X[:,i:i+1] - b
            
            for epoch in range(100):
                w_t = w[:,j:j+1] # (100,1)
                top = np.zeros(shape = (X.shape[0],1)) # (100,1)
                for i in range(X.shape[1]):
                    xi = X[:,i:i+1] # (100,1)
                    pit = 0
                    if w_t.T.dot(xi)>=0: # (1,100)@(100,1)
                        pit = 1
                    else:
                        pit = -1
                    top += pit * xi
                bottom = np.sqrt(np.sum(top**2))
                w[:,j:j+1] = top/bottom

        return w.T.dot(x)
if __name__ == '__main__':
    dataset_path = "/home/xueaoru/下载/iris.data"
    dataset = np.loadtxt(dataset_path,dtype = np.str,delimiter=',')
    x = dataset[:,:-1].astype(np.float)
    y = dataset[:,-1]
    plt.subplot(2,1,1)
    for c,i,target in zip("rgb",[0,1,2],y): # y is the label
        plt.scatter(x[y == target,i],x[y== target,i+1],marker = 'x',c = c,label = target)
    plt.subplot(2,1,2)
    pca = L1PCA()
    x = pca(x.T).T
    print(x.shape)
    for c,target in zip("rgb",y): # y is the label
        plt.scatter(x[y == target,0],x[y== target,1],marker = 'o',c = c,label = target)
    plt.show()
    
    #x = np.random.rand(100,16)
    #pca(x)

可視化

おすすめ

転載: www.cnblogs.com/aoru45/p/12032884.html