5.3.2 파이썬으로 커널 PCA 구현

    이전 절에서 커널 PCA 이면의 핵심 개념을 소개했습니다. 이제 세 단계로 요약한 커널 PCA 방식을 따라서 파이썬으로 RBF 커널 PCA를 구현해 보겠습니다. 사이파이와 넘파이 헬퍼 함수를 사용하면 커널 PCA를 아주 간단하게 구현할 수 있습니다.

    from scipy.spatial.distance import pdist, squareform
    from numpy import exp
    from scipy.linalg import eigh
    import numpy as np
    
    def rbf_kernel_pca(X, gamma, n_components):
        """
        RBF 커널 PCA 구현
    
        매개변수
        ------------
        X: {넘파이 ndarray}, shape = [n_samples, n_features]
    
        gamma: float
          RBF 커널 튜닝 매개변수
    
        n_components: int
          반환할 주성분 개수
    
        반환값
        ------------
        X_pc: {넘파이 ndarray}, shape = [n_samples, k_features]
          투영된 데이터셋
    
        """
        # MxN 차원의 데이터셋에서 샘플 간의 유클리디안 거리의 제곱을 계산합니다
        sq_dists = pdist(X, 'sqeuclidean')
    
        # 샘플 간의 거리를 정방 대칭 행렬로 변환합니다
        mat_sq_dists = squareform(sq_dists)
    
        # 커널 행렬을 계산합니다
        K = exp(-gamma * mat_sq_dists)
    
        # 커널 행렬을 중앙에 맞춥니다
        N = K.shape[0]
        one_n = np.ones((N,N)) / N
        K = K - one_n.dot(K) - K.dot(one_n) + one_n.dot(K).dot(one_n)
    
        # 중앙에 맞춰진 커널 행렬의 고윳값과 고유 벡터를 구합니다
        # scipy.linalg.eigh 함수는 오름차순으로 반환합니다
        eigvals, eigvecs = eigh(K)
        eigvals, eigvecs = eigvals[::-1], eigvecs[:, ::-1]
    
        # 최상위 k개의 고유 벡터를 선택합니다(투영 결과)
        X_pc = np.column_stack([eigvecs[:, i]
                               for i in range(n_components)])
    
        return X_pc

    차원 축소에 RBF 커널 PCA를 사용하는 한 가지 단점은 사전에 값을 찾으려면 실험을 해야 하며, 6장에서 자세하게 소개할 그리드 서치 같은 매개변수 튜닝을 위한 알고리즘을 사용하는 것이 최선입니다.

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.