1-й главный компонент из 3 точек на линии
Я немного запутался в первых основных направлениях. Скажем, у меня есть три точки в двухмерном евклидовом пространстве: (1,1), (2,2) и (3,3), и я хочу вычислить первый главный компонент.
Сначала я вижу, что центр (2,2), поэтому я перемещаю все точки в начало координат. Теперь (2,2) похоже на (0,0) и (1,1) равно (-1,-1), а (3,3) равно (1,1). Это среднее смещение. Теперь я знаю, что первый главный компонент - это транспонирование ((sqrt (2) / 2, sqrt (2) / 2)) из matlab. Но как это вычислить это? Что это значит?
Вы вычисляете ковариационную матрицу, а затем находите собственные значения, а затем собственные векторы. Этот собственный вектор является направлением? Тогда вы нормализуетесь?
Таким образом, у нас есть наши точки после среднего сдвига в (-1,-1), (0,0) и (1,1). Теперь мы вычисляем ковариационную матрицу
с (х, х) с (х, у)
с (у, х) с (у, у)
который равен [0 1; 0 1] затем мы смотрим на наибольшее собственное значение 1 и вычисляем собственный вектор, который равен [1;1]. Тогда мы нормализуем, так что разделите на sqrt(1^2 + 1^2)?
1 ответ
Шаги, которые вы пишете, правильны, но вы неправильно понимаете некоторые понятия. Часть "Среднее смещение" не имеет проблем, но вы неправильно поняли ковариационную матрицу. Поскольку исходные данные представлены в 2D, ковариационная матрица должна находиться между этими двумя измерениями, включая все шесть значений, то есть (-1,0,1) по оси x и (-1,0,1) по оси y. Итак, [0 1; 0 1] не правильный ответ.
Предположим, что у нас уже есть ковариационная матрица, мы можем использовать функцию svd в matlab для получения собственных векторов и собственных значений. Собственный вектор с наибольшим собственным значением - это не направление, а новая основа для представления данных. Таким образом, если вы умножите этот собственный вектор на исходные данные, вы можете получить новое представление данных в новой системе координат.
Я пишу код в Matlab, чтобы мое описание было легко понять.
clear;
% Original data
x = [1,1;2,2;3,3];
x = x';
x = x - repmat(mean(x, 2), 1, size(x, 2));
figure('name','original data')
plot(x(1,:),x(2,:),'*')
axis([-5 5 -5 5])
% PCA rotate data
sigma = x * x' / size(x, 2);
[U, S, V] = svd(sigma);
xRot = U' * x;
figure('name','PCA data rotation')
plot(xRot(1,:),xRot(2,:),'*')
axis([-5 5 -5 5])