PCA в 2D вычисляет центральную точку в исходных данных

Я пытаюсь создать ограничивающую рамку вокруг данного набора данных.

Поэтому моя идея состояла в том, чтобы использовать PCA. Я читал, что он не всегда находит оптимальные решения, но это не имеет значения.

Что я сделал до сих пор, так это вычислил ковариационную матрицу и использовал ее для вычисления SVD этой матрицы.

Допустим, у нас есть образец ввода, например

[40, 20], [-40, -20],[40, -20],[-40, 20],[30, 30]

Ковариационная матрица станет

[1780.0, 180.0] [180.0,   580.0]

С СВД получаю матрицу вращения U:

[0.99, 0.15]

[0.15, -0.99]

и диагональная матрица D:

[1806.41, 0]

[0, 553.58]

С моими собственными векторами я могу вычислить наклон линий, представляющих прямоугольник.

Теперь мне нужно получить центр PCA в исходном пространстве, а не в 0-центрированном пространстве. И мне также нужно узнать длину этих векторов.

Кто-нибудь знает, как их получить?


person fsulser    schedule 04.12.2015    source источник


Ответы (3)


Интересный вопрос. Просто мысли.

Является ли центр, о котором вы говорите, средним значением данных? Подумайте так, если мы можем спроецировать обратно (0,0) в исходное пространство, это среднее значение.

Чтобы найти длину, предполагая, что вы пытаетесь включить каждую точку в поле, вы можете спроецировать каждую точку в каждом направлении основного компонента и записать наибольшую и наименьшую координаты. Разница будет в длине.

Кстати, у меня сложилось впечатление, что PCA на корреляционной матрице обычно является более подходящим выбором, и я думаю, что это относится и к вашему вопросу.

person Weizhou Sun    schedule 14.12.2015

Я нашел решение. Идея заключалась в том, чтобы использовать два собственных вектора для вычисления максимального расстояния от всех точек до него.

Максимальное расстояние будет равно половине ширины и высоты прямоугольников. Как показано на рисунке ниже

введите здесь описание изображения

Чтобы расположить прямоугольник, я вычисляю 4 точки по

p1.x = max1 * собственный вектор1 (0) + max2 * собственный вектор1 (1)

p1.y = max1 * собственный вектор2 (0) + max2 * собственный вектор2 (1)

для всех точек.

Затем мне просто нужно было преобразовать вершины и все точки данных с помощью среднего X и среднего Y, а также прямоугольник, охватывающий исходный набор данных.

person fsulser    schedule 14.12.2015

Проблема в приведенном выше решении заключалась в том, что использование только max было не лучшей идеей, потому что оно всегда будет минимальным в одном направлении собственных векторов. Используя min и max, теперь я могу создавать минимальные ограничивающие блоки в обоих направлениях основных компонентов.

Для расчета точек я использовал приведенный ниже код, где minDistX — абсолютное значение минимального расстояния:

p1.setX(minDist2 * U[0][0] + maxDist1 * U[0][1]);
p1.setY(minDist2 * U[1][0] + maxDist1 * U[1][1]);

p2.setX(minDist2 * U[0][0] - minDist1 * U[0][1]);
p2.setY(minDist2 * U[1][0] - minDist1 * U[1][1]);

p3.setX(-(maxDist2 * U[0][0] + minDist1 * U[0][1]));
p3.setY(-(maxDist2 * U[1][0] + minDist1 * U[1][1]));

p4.setX(-(maxDist2 * U[0][0] - maxDist1 * U[0][1]));
p4.setY(-(maxDist2 * U[1][0] - maxDist1 * U[1][1]));
person fsulser    schedule 14.12.2015