당신이하는 일이 잘못되었습니다 : PCA에 대한 PRESS를 계산하는 것은 의미가 없습니다! 특히 문제는 5 단계에 있습니다.
PCA를위한 PRESS에 대한 순진한 접근
데이터 세트 를 차원 공간 에서 점으로 구성 합니다 : . 단일 테스트 데이터 포인트 대한 재구성 오류를 계산하려면 이 포인트를 제외 하고 트레이닝 세트 에 대해 PCA를 수행 하고 특정 수 의 주축을 사용합니다 열로 표시되고 와 같은 재구성 오류를 찾습니다. . 그런 다음 PRESS는 모든 테스트 샘플의 합계와 같습니다.d x ( i ) ∈ R d ,nd(X) ( I ) X ( - I ) k는 U ( - I ) ‖ X ( I ) - (X) ( I ) ‖ 2 = ‖ X ( I ) - U ( - I ) [ U ( - I ) ] ⊤ x ( i ) ″ 2 i Px(i)∈Rd,i=1…nx(i)X(−i)kU(−i)∥∥x(i)−x^(i)∥∥2=∥∥x(i)−U(−i)[U(−i)]⊤x(i)∥∥2i합리적인 방정식은 다음과 같습니다.
P R E S S =?∑나는 = 1엔∥∥엑스( 나는 )− U( − i )[ U( − i )]⊤엑스( 나는 )∥∥2.
간단하게하기 위해 여기서는 중심 및 스케일링 문제를 무시하고 있습니다.
순진한 접근 방식이 잘못되었습니다
위의 문제는 을 사용하여 예측 을 계산 한다는 것은 매우 나쁜 것입니다.(X) ( I )엑스( 나는 )엑스^( 나는 )
재구성 오류의 공식이 기본적으로 동일한 회귀 분석과의 중요한 차이점에 유의하십시오. 이지만 예측 은 예측 변수를 사용하고 사용 하지 않고 계산됩니다 . PCA에는 종속적이고 독립적 인 변수가 없기 때문에 PCA에서는 불가능합니다. 모든 변수가 함께 처리됩니다.Y ( I ) Y ( I )∥∥와이( 나는 )− y^( 나는 )∥∥2와이^( 나는 )와이( 나는 )
실제로, 이는 위에서 계산 된 PRESS가 구성 요소 의 증가로 감소 할 수 있으며 최소값에 도달하지 않음을 의미합니다. 모든 구성 요소가 중요 하다고 생각 하게 만듭니다. 또는 경우에 따라 최소값에 도달하지만 여전히 최적의 치수를 과도하게 맞추고 과대 평가하는 경향이 있습니다.d케이디
올바른 접근법
몇 가지 가능한 접근 방법이 있습니다 ( Bro et al. (2008) 구성 요소 모델의 교차 검증 : 개요 및 비교를위한 현재 방법 을 비판적으로 살펴 봅니다 . 한 가지 방법은 한 번에 하나의 데이터 포인트의 한 차원 (예 : 대신 생략 하여 학습 데이터가 하나의 결 측값이있는 행렬이되도록하는 것입니다. 그런 다음 PCA를 사용하여이 결 측값을 예측 ( "대치")합니다. (물론 매트릭스 요소의 더 큰 부분, 예를 들어 10 %를 무작위로 유지할 수 있습니다). 문제는 결 측값이있는 PCA 계산이 계산 상 상당히 느릴 수 있지만 (EM 알고리즘에 의존 함) 여러 번 반복해야한다는 것입니다. 업데이트 : http://alexhwilliams.info/itsneuronalblog/2018/02/26/crossval/ 참조 (X) ( I )엑스( 나는 )제이엑스( 나는 ) 좋은 토론과 파이썬 구현 (결 측값이있는 PCA는 교대 최소 제곱을 통해 구현됩니다).
내가 훨씬 더 실제적인 하나의 데이터 포인트를 생략하는 것으로 발견 접근 방법 한 번에, 훈련 데이터에 대한 계산 PCA (위와 같이 정확하게)하지만 다음의 크기를 반복 할 한 번에 하나씩 남겨두고 나머지를 사용하여 재구성 오류를 계산하십시오. 이것은 처음에는 상당히 혼란 스러울 수 있으며 수식은 매우 혼란스러워지는 경향이 있지만 구현은 다소 간단합니다. 먼저 (어떤 무서운) 공식을 제시 한 다음 간단히 설명하겠습니다.x ( i )x(i)x(i)
PRESSPCA=∑i=1n∑j=1d∣∣∣x(i)j−[U(−i)[U(−i)−j]+x(i)−j]j∣∣∣2.
내부 루프를 고려하십시오. 우리는 한 포인트 빼고 훈련 데이터 에 대한 주요 구성 요소를 계산했습니다 . 이제 각 값 를 테스트로 유지하고 나머지 차원 을 사용하여 예측을 수행합니다. . 예측 은 IS 의 (최소 제곱 법 의미에서) "투영"좌표 번째 서브 스페이스 상 스팬 에 의해 . 이를 계산하려면 PC 공간 에서 가장 가까운 점 를 찾으십시오. k는 U ( - I ) (X) ( I ) - J ] +x(i)kU(−i)x(i)jx(i)−j∈Rd−1x^(i)jjx(i)−jU(−i)z^Rkx(i)−j 계산함으로써 여기서 는 이며 번째 행 추방하고 의사 역행렬 약자. 이제 를 원래 공간으로 다시 매핑 하십시오 : 로 번째 좌표 합니다. z^=[U(−i)−j]+x(i)−j∈RkU(−i)−jU(−i)j[⋅]+z^U(−i)[U(−i)−j]+x(i)−jj[⋅]j
올바른 접근 방식에 대한 근사치
PLS_Toolbox에 사용 된 추가 정규화를 이해하지 못하지만 동일한 방향으로 진행되는 한 가지 방법이 있습니다.
를 주요 구성 요소의 공간에 매핑하는 다른 방법이 있습니다 . 즉, 의사 역수 대신 조옮김 만 수행하면됩니다. 즉, 테스트를 위해 제외 된 치수는 전혀 계산되지 않으며 해당 가중치도 간단하게 추방됩니다. 나는 이것이 덜 정확해야한다고 생각하지만 종종 받아 들일 수 있습니다. 좋은 점은 결과 수식을 다음과 같이 벡터화 할 수 있다는 것입니다 (계산은 생략합니다).x(i)−jz^approx=[U(−i)−j]⊤x(i)−j
PRESSPCA,approx=∑i=1n∑j=1d∣∣∣x(i)j−[U(−i)[U(−i)−j]⊤x(i)−j]j∣∣∣2=∑i=1n∥∥(I−UU⊤+diag{UU⊤})x(i)∥∥2,
여기서 나는 압축을 위해 를 로 썼고 은 모든 비 대각선 요소를 0으로 설정하는 것을 의미합니다. 이 공식은 작은 수정으로 첫 번째 공식 (순진한 PRESS)과 똑같습니다! 이 수정 은 PLS_Toolbox 코드에서와 같이 의 대각선에만 의존 합니다. 그러나 공식은 여전히 PLS_Toolbox에서 구현 된 것과 다르 므로이 차이점을 설명 할 수 없습니다. U d i a g {⋅} U U ⊤U(−i)Udiag{⋅}UU⊤
업데이트 (2018 년 2 월) : 위의 절차 중 하나는 "정확한"이고 다른 절차는 "대략적"이라고 불렀지 만 더 이상 이것이 의미가 있는지는 확실하지 않습니다. 두 절차 모두 의미가 있으며 더 정확하지 않다고 생각합니다. 나는 "대략적인"절차가 더 간단한 공식을 가지고 있다는 것을 정말로 좋아합니다. 또한 "근사한"프로 시저가보다 의미있는 결과를 산출 한 데이터 집합이 있다는 것을 기억합니다. 불행히도, 나는 더 이상 세부 사항을 기억하지 못합니다.
예
다음은 이러한 방법이 잘 알려진 두 가지 데이터 집합 인 아이리스 데이터 집합과 와인 데이터 집합에 대한 비교입니다. 순진 방법은 단조 감소 곡선을 생성하는 반면, 다른 두 방법은 최소 곡선을 생성합니다. 또한 아이리스의 경우 근사 방법은 1 개의 PC를 최적의 숫자로 제안하지만 유사 역법은 2 개의 PC를 제안합니다. (그리고 Iris 데이터 세트에 대한 PCA 산점도를 살펴보면 첫 번째 PC 모두 신호를 전달하는 것으로 보입니다.) 와인의 경우 의사 역 수법은 3 PC를 분명히 가리 키지 만 근사 방법은 3과 5 사이를 결정할 수 없습니다.
교차 검증을 수행하고 결과를 플롯하는 Matlab 코드
function pca_loocv(X)
%// loop over data points
for n=1:size(X,1)
Xtrain = X([1:n-1 n+1:end],:);
mu = mean(Xtrain);
Xtrain = bsxfun(@minus, Xtrain, mu);
[~,~,V] = svd(Xtrain, 'econ');
Xtest = X(n,:);
Xtest = bsxfun(@minus, Xtest, mu);
%// loop over the number of PCs
for j=1:min(size(V,2),25)
P = V(:,1:j)*V(:,1:j)'; %//'
err1 = Xtest * (eye(size(P)) - P);
err2 = Xtest * (eye(size(P)) - P + diag(diag(P)));
for k=1:size(Xtest,2)
proj = Xtest(:,[1:k-1 k+1:end])*pinv(V([1:k-1 k+1:end],1:j))'*V(:,1:j)';
err3(k) = Xtest(k) - proj(k);
end
error1(n,j) = sum(err1(:).^2);
error2(n,j) = sum(err2(:).^2);
error3(n,j) = sum(err3(:).^2);
end
end
error1 = sum(error1);
error2 = sum(error2);
error3 = sum(error3);
%// plotting code
figure
hold on
plot(error1, 'k.--')
plot(error2, 'r.-')
plot(error3, 'b.-')
legend({'Naive method', 'Approximate method', 'Pseudoinverse method'}, ...
'Location', 'NorthWest')
legend boxoff
set(gca, 'XTick', 1:length(error1))
set(gca, 'YTick', [])
xlabel('Number of PCs')
ylabel('Cross-validation error')
tempRepmat(kk,kk) = -1
라인 의 역할은 무엇 입니까? 이전 줄이 이미tempRepmat(kk,kk)
-1 과 같지 않습니까? 또한 왜 마이너스입니까? 어쨌든 오류가 제곱 될 것이므로 마이너스를 제거하면 아무것도 변경되지 않는다는 것을 올바르게 알고 있습니까?