Подгонка новых изображений из расчета SVD / PCA

16

Я пытаюсь повторить идеи со страницы Eigenface в Википедии. Из сотни образцов изображений, представленных матрицей данных (где каждое изображение сведено к вектору длины n , то есть X является матрицей размером 100 на n ), я вычислил декомпозицию SVD:XnX100n

X=UΣVT

следовательно:

XXT=UΣ2UT

Принимая подмножество крупнейших собственных мод, можно аппроксимировать матрицу (пусть сг 1сг 2 ):qσ1σ2

Xσ1u1v1T+σ2u2v2T++σquqvqT

Теперь, учитывая новый вектор , который представляет изображение не в X , как мне определить вес q собственных векторов U, чтобы наилучшим образом представить мое новое изображение y ? За исключением патологических случаев, является ли это представление уникальным?yXqUy

Короче говоря, то, что я хотел бы сделать, это (со страницы вики):

Эти собственные грани теперь можно использовать для представления как существующих, так и новых граней : мы можем спроецировать новое (вычтенное из среднего) изображение на собственные грани и тем самым записать, как это новое лицо отличается от среднего грани.

Как мне сделать эту проекцию?

Увлеченные
источник
1
Будущие читатели могут найти эту реализацию ценным.
Эмре

Ответы:

11

Упомянутая «проекция» является векторной проекцией . Чтобы рассчитать проекцию вектора на вектор b , вы используете внутреннее произведение двух векторов:ab

aproj=a,bb

в этом случае - векторная компонента a, которая лежит в том же направлении от b . В евклидовом пространстве оператор внутреннего произведения определяется как ихточечный продукт:aprojab

a,b=ab=i=1naibi

где - количество компонентов в векторах a и b, а a i и b i - i-й компонент векторов a и b соответственно. Интуитивно, вычисляя внутреннее произведение двух векторов, вы находите, «сколько из» вектора a идет в направлении вектора b . Обратите внимание, что это число со знаком, поэтому отрицательное значение будет означать, что угол между двумя векторами больше 90 градусов, как показано альтернативным определением для оператора проекции:nabaibiiabab

aproj=|a|cos(θ)b

где - угол между двумя векторами.θ

Таким образом, учитывая вектор и набор базисных векторов b i , можно найти «сколько из a » идет в каждом из направлений каждого из базисных векторов. Как правило, эти базисные векторы будут взаимно ортогональными. В вашем случае SVD - это ортогональное разложение, поэтому это условие должно быть выполнено. Итак, чтобы выполнить то, что вы описываете, вы должны взять матрицу собственных векторов U и вычислить внутреннее произведение вектора-кандидата y с каждым из столбцов матрицы:abiaUy

pi=yui

Скалярное значение которое вы получаете от каждого внутреннего произведения, показывает, насколько хорошо вектор y "выровнен" с i-м собственным вектором. Поскольку собственные векторы ортонормированы , вы можете восстановить исходный вектор y следующим образом:piyiy

y=i=1npiui

yUy

Джейсон Р
источник
Отличный ответ, спасибо! Под «уникальным» я имел в виду уникальное в смысле основы, данной СВД. Я предполагаю, что, учитывая ортонормированную основу, тоYВы должны вычислить должны быть уникальными - но если базис не ортонормирован, то он может не быть (так как если бы они не были ортогональными, то мы могли бы найти меньший базисный набор)?
подключен
Все еще не уверен, к чему ты клонишь. Yэто вектор, к которому вы перешли ваше новое изображение, так что он уникален как исходное изображение и процесс, который вы используете для определения соответствующего вектора. Базис векторного пространства по определению состоит из линейно независимых векторов, что обусловливает свойство взаимной ортогональности. Вы правильно заметили, что если вы спроектировалиYна множество неортогональных векторов вы могли бы придумать более компактное представление, если бы пространство, охватываемое векторами, имело меньшую базовую размерность (меньший базис).
Джейсон Р