PCA를 적용하기 전의 일반적인 기술은 샘플에서 평균을 빼는 것입니다. 그렇게하지 않으면 첫 번째 고유 벡터가 평균이됩니다. 나는 당신이 그것을했는지 여부를 확신하지 못하지만 그것에 대해 이야기하겠습니다. MATLAB 코드로 말하면 :
clear, clf
clc
%% Let us draw a line
scale = 1;
x = scale .* (1:0.25:5);
y = 1/2*x + 1;
%% and add some noise
y = y + rand(size(y));
%% plot and see
subplot(1,2,1), plot(x, y, '*k')
axis equal
%% Put the data in columns and see what SVD gives
A = [x;y];
[U, S, V] = svd(A);
hold on
plot([mean(x)-U(1,1)*S(1,1) mean(x)+U(1,1)*S(1,1)], ...
[mean(y)-U(2,1)*S(1,1) mean(y)+U(2,1)*S(1,1)], ...
':k');
plot([mean(x)-U(1,2)*S(2,2) mean(x)+U(1,2)*S(2,2)], ...
[mean(y)-U(2,2)*S(2,2) mean(y)+U(2,2)*S(2,2)], ...
'-.k');
title('The left singular vectors found directly')
%% Now, subtract the mean and see its effect
A(1,:) = A(1,:) - mean(A(1,:));
A(2,:) = A(2,:) - mean(A(2,:));
[U, S, V] = svd(A);
subplot(1,2,2)
plot(x, y, '*k')
axis equal
hold on
plot([mean(x)-U(1,1)*S(1,1) mean(x)+U(1,1)*S(1,1)], ...
[mean(y)-U(2,1)*S(1,1) mean(y)+U(2,1)*S(1,1)], ...
':k');
plot([mean(x)-U(1,2)*S(2,2) mean(x)+U(1,2)*S(2,2)], ...
[mean(y)-U(2,2)*S(2,2) mean(y)+U(2,2)*S(2,2)], ...
'-.k');
title('The left singular vectors found after subtracting mean')
그림에서 알 수 있듯이 (공) 분산을 더 잘 분석하려면 데이터에서 평균을 빼야한다고 생각합니다. 그런 다음 값은 10-100과 0.1-1 사이가 아니지만 평균은 모두 0입니다. 분산은 고유 값 (또는 특이 값의 제곱)으로 나타납니다. 발견 된 고유 벡터는 우리가 그렇지 않은 경우만큼 평균을 빼는 경우에 대한 차원의 스케일에 영향을받지 않습니다. 예를 들어, 나는 당신의 사건에 중요한 평균을 빼는 것을 알려주는 다음을 테스트하고 관찰했습니다. 따라서 문제는 분산이 아니라 변환 차이로 인해 발생할 수 있습니다.
% scale = 0.5, without subtracting mean
U =
-0.5504 -0.8349
-0.8349 0.5504
% scale = 0.5, with subtracting mean
U =
-0.8311 -0.5561
-0.5561 0.8311
% scale = 1, without subtracting mean
U =
-0.7327 -0.6806
-0.6806 0.7327
% scale = 1, with subtracting mean
U =
-0.8464 -0.5325
-0.5325 0.8464
% scale = 100, without subtracting mean
U =
-0.8930 -0.4501
-0.4501 0.8930
% scale = 100, with subtracting mean
U =
-0.8943 -0.4474
-0.4474 0.8943