주성분 분석 (PCA)을 수행하려면 데이터에서 각 열의 평균을 빼고 상관 계수 행렬을 계산 한 다음 고유 벡터와 고유 값을 찾아야합니다. 오히려 상관 관계 계수 행렬 (corrcoef)을 찾는 방법으로 높은 차원의 배열을 사용할 수 없기 때문에 작은 행렬에서만 작동한다는 점을 제외하고는 파이썬에서 구현 한 것입니다. 이미지에 이미지를 사용해야하므로 현재 구현이 실제로 도움이되지 않습니다.
데이터 매트릭스 가져 와서 대신 계산 하는 것이 가능하다는 것을 읽었 지만 나에게는 효과가 없습니다. 글쎄, 나는 그것이 (내 경우에는 ) 대신 행렬 이어야한다는 사실 외에도 그 의미가 무엇인지 정확히 이해하지 못합니다 . 나는 고유면 자습서에있는 사람들에 대해 읽었지만 아무도 그것을 실제로 얻을 수있는 방식으로 설명하지는 않았습니다.D D ⊤ / n D ⊤ D / n n × n p × p p ≫ n
간단히 말해,이 방법에 대한 간단한 알고리즘 설명이 있습니까?
답변
표준 PCA를 수행하는 가장 쉬운 방법은 열 평균을 빼서 데이터 행렬의 열을 중심에두고 (열이 다른 변수에 해당한다고 가정) SVD를 수행하는 것입니다. 왼쪽 특이 벡터에 해당 특이 값을 곱한 값은 (추정 된) 주성분에 해당합니다. 오른쪽 특이 벡터는 (추정 된) 주요 구성 요소 방향에 해당합니다. PCA에서 제공 한 고유 벡터와 동일합니다. 특이 값은 주성분의 표준 편차 (루트 n의 계수로 곱한 값, 여기서 n은 데이터 매트릭스의 행 수임)에 해당합니다. 이는 PCA가 제공 한 고유 값의 제곱근과 같습니다.
상관 행렬에서 PCA를 수행하려면 SVD를 적용하기 전에 데이터 행렬의 열을 표준화해야합니다. 이는 평균을 빼고 (중심) 표준 편차 (스케일링)로 나눕니다.
전체 PCA를 원하는 경우 가장 효율적인 방법입니다. 대수로 샘플 공분산 행렬의 스펙트럼 분해를 수행하는 것과 동일한 대답을 제공하는지 확인할 수 있습니다.
일부 PC 만 필요한 경우 부분 SVD를 계산하는 효율적인 방법도 있습니다. 이들 중 일부는 전력 반복의 변형입니다. 에는 Lanczos 알고리즘은 또한 부분 최소 제곱 관련된 일 예이다. 행렬이 크면 대략적인 방법을 사용하는 것이 좋습니다. 이 경우 PCA를 정규화해야하는 통계적 이유도 있습니다.
답변
당신이 지금하고있는 일은 가깝습니다. 그러나의 고유 벡터 를 얻으려면 (data . data.T) / lines
왼쪽에 있는 고유 벡터를 곱해야합니다 . 이것을 “전치 트릭”이라고도합니다.data.T
(data.T . data) / lines
답변
PCA를 수행하기위한 NIPALS 알고리즘이 원하는 것 같습니다. 통계 학자들 사이에서 매우 인기있는 알고리즘입니다. 많은 장점이 있습니다.
- 처음 몇 개의 구성 요소 만 필요한 경우 SVD 또는 고유 값 분해 방법보다 계산 비용이 저렴합니다.
- 공분산 행렬이 형성되지 않기 때문에 일반적으로 더 적당한 저장 요구 사항이 있습니다. 이는 매우 큰 데이터 집합에 매우 중요한 속성입니다.
- 데이터 세트에서 누락 된 데이터를 처리 할 수 있습니다 (이미지를 다루기 때문에 문제가되지는 않지만).
설명
http://en.wikipedia.org/wiki/Non-linear_iterative_partial_least_squares
알고리즘
다음은 알고리즘에 대한 간단하고 훌륭한 설명입니다 (섹션 1.2).
http://stats4.eng.mcmaster.ca/w/mediafiles/mediawiki/f/f7/Section-Extra-Class-1.pdf
PCA는 스케일에 민감하므로 PCA를 수행하기 전에 먼저 평균 센터 스케일을 기억하십시오.
답변
길르앗의 답변을 추가하기 위해 잘린 PCA에 대해 계산 비용이 저렴한 알고리즘입니다. NIPALS는 실제로 매우 인기가 있지만 부분 데이터 (종종 투영법으로 PCA라고 함)에 연속적으로 맞는 근사 방법으로 많은 성공을 거두었습니다. 이것은 메타 최적화 스레드 에서 논의되었습니다 .
파이썬을 언급 할 때 알고리즘이 scikit-learn : PCA 클래스 에서 구현됨을 지적하겠습니다 . 특히, 고유면을 보여주는 예제에서 사용됩니다 .