PCA 구성 요소를 회전하여 각 구성 요소의 분산을 균등화


9

데이터 세트에서 PCA를 수행하고 마지막 몇 대의 PC를 버림으로써 데이터 세트의 차원과 노이즈를 줄이려고합니다. 그런 다음 나머지 PC에서 일부 기계 학습 알고리즘을 사용하고 싶습니다. 따라서 알고리즘이 더 잘 작동하도록 PC의 분산을 균등화하여 데이터를 정규화하고 싶습니다.

간단한 방법 중 하나는 단순히 분산을 단위 값으로 정규화하는 것입니다. 그러나 첫 번째 PC에는 다음 데이터보다 원래 데이터 세트와 더 많은 차이가 있으며 여전히 "무게"를주고 싶습니다. 따라서 궁금한 점이 있습니다. 분산을 분할하여 분산이 적은 PC와 공유하는 간단한 방법이 있습니까?

또 다른 방법은 PC를 원래 기능 공간에 다시 매핑하는 것이지만이 경우 차원도 원래 값으로 증가합니다.

결과 열을 직교로 유지하는 것이 더 좋지만 지금은 필요하지 않습니다.


1
아니요 ... varimax 는 하중 의 제곱 분산 합계를 최대화 하므로 가능한 한 불균형 하게 만듭니다. 또한 왜 구성 요소를 동일하게하고 싶습니까? 요점은 가능한 한 적은 수의 구성 요소에서 가능한 한 많은 변형을 캡처하는 것입니다.

2
구성 요소 점수를 단위 분산으로 표준화하는 것만으로는 적합하지 않습니까? 그땐 왜? 어떤 종류의 결과를 원하십니까-동일한 분산 외에 결과 열이 상관되어 있지 않아야합니까?
ttnphns

2
설명에서 간단히 데이터를 "구체적으로"(차원이 줄어든) 원하는 것처럼 보입니다. 머신 러닝의 전처리 단계로 자주 수행됩니다. 이를 달성하기 위해 단순히 PCA를 수행하고 일부 구성 요소를 선택한 후 표준화하십시오. 표준화 된 구성 요소를 서로 관련이없는 상태로 유지하면서 정확히 같은 양의 분산을 설명하는 직교 회전 (예 : varimax)을 찾을 수 있습니다. 그것은 흥미로운 질문입니다. 나는 그것에 대해 생각해야합니다. 그러나 나는 이것이 머신 러닝이 아니라는 것을 본 적이 없다.
amoeba

2
그런데 PCA 후에 적용 할 "일부 기계 학습 알고리즘"은 무엇입니까? 관련이있을 수 있습니다.
amoeba

1
표준화 된 PC를 회전해도 거리 가 전혀 바뀌지 않습니다. 따라서 후속 거리 기반 알고리즘에는 실제로 중요하지 않습니다.
amoeba

답변:


10

머신 러닝의 일반적인 전처리 단계는 차원 축소 + 미백입니다. 이는 PCA를 수행하고 구성 요소를 표준화하는 것을 의미합니다. 그럼에도 불구하고 나는 당신의 질문이 더 흥미 롭기 때문에 공식화 된 것에 집중할 것입니다.


하자 센터링 될 열의 행 변수 데이터 포인트와 데이터 매트릭스. PCA는 단일 값 분해 , 차원 축소를 수행하는 경우 구성 요소 만 유지합니다 . 이러한 구성 요소의 직교 "인자 회전"은 직교 행렬 을 선택하여 분해에 연결하는 것을 의미합니다.Xn×d

X=USVUkSkVk,
kk×kR
XUkSkVk=UkRRSkVk=n1UkRRotatedstandardized scoresRSkVk/n1Rotated loadings.
여기서 은 회전 된 표준화 된 구성 요소이며 두 번째 항은 회전 된 하중을 나타냅니다. 회전 후 각 구성 요소의 분산은 해당하는 로딩 벡터의 제곱의 합으로 제공됩니다. 회전하기 전에 단순히 입니다. 회전 후 다른 것입니다.n1UkRsi2/(n1)

이제 우리는 수학적인 관점에서 문제를 공식화 할 준비가 : 회전되지 않은 부하 주어진 , 회전 행렬 찾을 회전 부하가 그와 같은 은 각 열에 동일한 제곱합을 갖습니다.L=VkSk/n1RLR

해결합시다. 회전 후의 열 제곱합은 의 대각선 요소와 같습니다. 이것은 의미가 있습니다. 회전은 이 공식에 따라 원래 의해 주어진 성분의 분산을 재분배합니다 . 우리는 그것들이 모두 그들의 평균값 가되도록 재분배 할 필요가있다 .

(LR)LR=RS2n1R.
si2/(n1)μ

나는 이것에 대한 폐쇄 형 솔루션이 있다고 생각하지 않으며 실제로 많은 다른 솔루션이 있습니다. 그러나 순차적 인 방식으로 솔루션을 쉽게 구축 할 수 있습니다.

  1. 첫 번째 구성 요소와 번째 구성 요소를 가져옵니다 . 첫 번째는 분산 이고 마지막은 분산 입니다.kσmax>μσmin<μ
  2. 첫 번째의 분산이 가되도록이 두 개만 회전하십시오 . 2D의 회전 행렬은 하나의 매개 변수 에만 의존 하며 방정식을 작성하고 필요한 쉽게 계산할 수 있습니다. 실제로 변환 후 첫 번째 PC는 여기서 즉시 얻습니다.μθθ
    R2D=(cosθsinθsinθcosθ)
    cos2θσmax+sin2θσmin=cos2θσmax+(1cos2θ)σmin=μ,
    cos2θ=μσminσmaxσmin.
  3. 첫 번째 구성 요소는 이제 분산 입니다.μ
  4. 가장 큰 분산을 가진 성분과 가장 작은 분산을 가진 성분을 취하여 다음 쌍으로 진행하십시오. 고토 # 2.

이렇게하면 2D 회전 순서에 따라 모든 분산이 균등하게 재분배됩니다 . 이 회전 행렬을 모두 곱하면 전체 됩니다.(k1)R


다음의 행렬을 고려하십시오평균 분산은 입니다. 내 알고리즘은 다음과 같이 진행됩니다.S2/(n1)

(10000060000300001).
5
  1. 1 단계 : 그 PC1 그래서 회전 PC1 및 PC4는 분산 도착 . 결과적으로 PC4는 분산 얻습니다 .51+(105)=6

  2. 2 단계 : PC2가 분산 얻는다 그래서 회전 PC2 (새 최대 편차) 및 PC3 . 결과적으로 PC3은 분산 얻습니다 .53+(65)=4

  3. 3 단계 : PC4 (새로운 최대 분산) 및 PC3을 회전하여 PC4가 분산 얻습니다 . 결과적으로 PC3은 분산 얻습니다 .54+(61)=5

  4. 끝난.

이 알고리즘을 구현하는 Matlab 스크립트를 작성했습니다 (아래 참조). 이 입력 행렬의 회전 각도 순서는 다음과 같습니다.

48.1897   35.2644   45.0000

각 단계 후의 성분 차이 (행) :

10     6     3     1
 5     6     3     6
 5     5     4     6
 5     5     5     5

최종 회전 행렬 (세 개의 2D 회전 행렬의 곱) :

 0.6667         0    0.5270    0.5270
      0    0.8165    0.4082   -0.4082
      0   -0.5774    0.5774   -0.5774
-0.7454         0    0.4714    0.4714

그리고 마지막 행렬은 다음과 같습니다.(LR)LR

5.0000         0    3.1623    3.1623
     0    5.0000    1.0000   -1.0000
3.1623    1.0000    5.0000    1.0000
3.1623   -1.0000    1.0000    5.0000

코드는 다음과 같습니다.

S = diag([10 6 3 1]);
mu = mean(diag(S));
R = eye(size(S));

vars(1,:) = diag(S);
Supdated = S;

for i = 1:size(S,1)-1
    [~, maxV] = max(diag(Supdated));
    [~, minV] = min(diag(Supdated));

    w = (mu-Supdated(minV,minV))/(Supdated(maxV,maxV)-Supdated(minV,minV));
    cosTheta = sqrt(w);
    sinTheta = sqrt(1-w);

    R2d = eye(size(S));
    R2d([maxV minV], [maxV minV]) = [cosTheta sinTheta; -sinTheta cosTheta];
    R = R * R2d;

    Supdated = transpose(R2d) * Supdated * R2d;    

    vars(i+1,:) = diag(Supdated);
    angles(i) = acosd(cosTheta);
end

angles                %// sequence of 2d rotation angles
round(vars)           %// component variances on each step
R                     %// final rotation matrix
transpose(R)*S*R      %// final S matrix

@feilong에서 제공 한 Python 코드는 다음과 같습니다.

def amoeba_rotation(s2):
    """
    Parameters
    ----------
    s2 : array
        The diagonal of the matrix S^2.

    Returns
    -------
    R : array
        The rotation matrix R.

    Examples
    --------
    >>> amoeba_rotation(np.array([10, 6, 3, 1]))
    [[ 0.66666667  0.          0.52704628  0.52704628]
     [ 0.          0.81649658  0.40824829 -0.40824829]
     [ 0.         -0.57735027  0.57735027 -0.57735027]
     [-0.74535599  0.          0.47140452  0.47140452]]

    http://stats.stackexchange.com/a/177555/87414
    """
    n = len(s2)
    mu = s2.mean()
    R = np.eye(n)
    for i in range(n-1):
        max_v, min_v = np.argmax(s2), np.argmin(s2)
        w = (mu - s2[min_v]) / (s2[max_v] - s2[min_v])
        cos_theta, sin_theta = np.sqrt(w), np.sqrt(1-w)
        R[:, [max_v, min_v]] = np.dot(
            R[:, [max_v, min_v]],
            np.array([[cos_theta, sin_theta], [-sin_theta, cos_theta]]))
        s2[[max_v, min_v]] = [mu, s2[max_v] + s2[min_v] - mu]
    return R

이 문제는 다음과 완전히 같습니다. 분산이 인 상관되지 않은 변수가 주어지면 동일한 분산을 갖는 변수를 산출하는 회전 (즉, 새로운 직교 기준)을 찾으십시오 (물론 더 이상 상관되지 않습니다).kσi2k


두 쌍의 구성 요소 (그들의 점수)에 대해 회전 각도는 45도이며 분산을 균등하게합니다. 그러나 3 + 구성 요소로 전체 작업을 쌍으로 수행하는 방법을 상상할 수 없습니다.
ttnphns

1
@ feilong, 한 번에 한 쌍의 구성 요소의 분산을 균일화하는 것이 매우 차선책이라고 생각합니다. 내가 제안한 것은 한 구성 요소의 분산이 전체 평균 분산과 정확히 같아 지도록 회전을 선택하는 것입니다. 그런 다음이 구성 요소는 "완료"되고 나머지는 처리 할 수 ​​있습니다. 이는 유한 한 단계로 모든 분산을 균등하게 보장합니다. 예를 들어 이전 주석을 참조하십시오.
amoeba

1
@amoeba 맞습니다. 더 나은 솔루션이며 n-1 단계로 마무리해야합니다.
feilong

1
@amoeba Python을 사용하여 최소 구현을 추가했습니다. 큰 행렬의 경우 시간이 오래 걸리므로 전체 행렬을 곱하는 부분을 수정했습니다.
feilong

1
@amoeba 기본 구성 요소의 경우 최대 및 최소를 검색하는 부품을 제거하여 더 많은 시간을 절약 할 수 있습니다. 첫 번째 및 두 번째 구성 요소를 회전하여 (첫 번째 구성 요소의 평균 분산을 유지) 두 번째 및 세 번째 등을 간단히 수행 할 수 있습니다. 각 쌍의 총 분산이보다 큰지 확인해야합니다 mu.
feilong

2

@amoeba는 그의 이해하기 쉽고 포괄적 인 답변에서, 답변의 일부로서, (예를 들어 주요 구성 요소와 같은) 두 개의 상관되지 않은 변수를 회전시켜 원하는 분산을 달성하는 방법을 보여주었습니다. . 직교 변수 와 각각 (더 큰)와 (보다 작은)의 분산을 갖도록하십시오 . 가 임의의 감소 된 분산 갖도록 회전 시키십시오 ( 는 결과적으로 분산 ).XYσmax2σmin2Xμ2Yσmax2+σmin2μ2

@amoeba는 이러한 회전 각도 계산할 수있는 공식을 보여줍니다 .cosθ

μ2=cos2θ(σmax2)+sin2θ(σmin2)

그러나이 방정식이 어디에서 나오는지 설명하지 않았다. 아마도 설명없이 분명하다고 생각할 것입니다. 분명히, 나는 그것을 설명 할 가치가 있다고 생각합니다. 내 대답은 한 가지 방법을 제시합니다.

따라서 상관 관계가없는 변수 와 의 공간에 타원 중심의 데이터 구름이 있습니다. 축을 각도 로 회전시켜야합니다 . 좌표 가 있는 구름의 데이터 점 (예 : 그림에서 녹색 점으로 표시됨) 은 회전 좌표가 입니다.XYθXxx

회전 그림

좌표의 투영 관찰 노치를 회전 축선에 주어진다 (빗변 같은 cathetus 그들 사이의 각도). 좌표 : (다른 카테터 스 및 빗변) 에서 계산할 수있는 길이 의 컷으로 인해 가 보다 작다는 것도 관찰하십시오 . 그래서x Xx=xcosθxxxxyysinθ

x=x(xx)=xcosθysinθ

우리는 두 변수의 분산 (또는 제곱합) 과 의 분산 (제곱합) 를 알고 있습니다 (시작 부분 참조) . 그런 다음 다음과 같습니다.μ2X

μ2=x2=(xcosθysinθ)2=(x2cos2θ+y2sin2θ2xycosθsinθ)=cos2θx2+sin2θy22cosθsinθxy=0 (X and Y are uncorrelated)=cos2θ(σmax2)+sin2θ(σmin2)

@amoeba에서 보듯이 를 추정 하고 회전을 수행하십시오.cosθ


2
+1. 나는 그것이 분명하지 않다고 생각하지는 않았지만, 검증 하기가 쉽다고 생각했습니다. :-) 직접 대수로 표시 할 수 있습니다 (내 대답에서와 같이) 및 제품의 왼쪽 상단 요소를 계산합니다. 물론 같은 추론으로 다르게 표현되었습니다. 감사!
(cosθsinθsinθcosθ)(σmax200σmin2)(cosθsinθsinθcosθ),
amoeba

그리고 여러분의 기하학적 설명과 "직접"계산 (매트릭스 제외)이 이해하기 쉽고 올바른 직관을 개발하는 데 매우 도움이된다고 생각합니다.
amoeba

0

내가 올바르게 해석하면 첫 번째 기본 구성 요소 (고유 값)가 데이터의 대부분의 차이를 설명합니다. 압축 방법이 선형 일 때 발생할 수 있습니다. 그러나 피처 공간에 비선형 종속성 이있을 수 있습니다 .

TL / DR : PCA는 선형 방법입니다. 차원 축소를 위해 자동 인코더 (비선형 pca)를 사용하십시오. 기계 학습 부분이 학습 학습 인 경우, 자동 엔코더의 (하이퍼) 매개 변수를 조정하면서 손실 기능을 모니터링하십시오. 이러한 방식으로 원본 데이터의 압축 버전이 훨씬 향상됩니다.

다음은 PCA를 사용하여 유지할 최적의 주요 구성 요소 (하이파 매개 변수)를 찾기 위해 그리드 검색을 수행하는 scikit 예입니다. 마지막으로 그들은 낮은 차원 공간에 로지스틱 회귀를 적용합니다 : http://scikit-learn.org/stable/auto_examples/plot_digits_pipe.html#example-plot-digits-pipe-py

팁 : 자동 엔코더에는 폐쇄 형 솔루션 (afaik)이 없으므로 컨텍스트가 데이터를 스트리밍하는 경우 자동 엔코더 (압축 된 표현)를 지속적으로 업데이트하여 개념 편차와 같은 사항을 보완 할 수 있습니다. pca를 사용하면 새로운 데이터가 들어올 때마다 배치 모드를 재교육해야합니다.

일부 기능에 "가중치"를 부여하려면 정규화를 참조하십시오 ( https://en.wikipedia.org/wiki/Norm_(mathematics) ). 또한 로지스틱 회귀 분석이 퍼셉트론과 얼마나 비슷한 지 놀랄 수도 있습니다.


이것이 OP의 질문에 어떻게 대답하는지 알 수 없습니다. 당신의 대답은 질문과 전혀 관련이없는 것 같습니다.
amoeba

따라서 궁금한 점이 있습니다. 분산을 분할하여 분산이 적은 PC와 공유하는 간단한 방법이 있습니까? OP는 차원 축소를 원합니다. 나는 OP가 원하는 것이 성능을 측정하지 않으면 더 나은 성능을 보장한다고 보장하지 않기 때문에 그의 문제를 해결할 대안을 제시했습니다. 힐버트 공간 / 표준 공간에서 작업한다고해서 더 나은 결과를 보장 할 수는 없습니다. 성능을 측정하면 더 나은 결과를 얻을 수 있습니다.
shuriken x blue
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.