Алгоритм заполнения поврежденной матрицы данных - PullRequest
6 голосов
/ 26 июля 2011

У меня есть следующая проблема:

Я извлек набор данных, но часть этих данных либо недоступна, либо отсутствует; Для разных предметов я выделил 10 параметров:

       param1   param2    ...  param10
Item 1   1220     N/A            1000
Item 2   1300     200     ...    1000
..        ...      ...

item N    N/A      1000   ...     200

N ~ 1500 and half of the values are complete

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

Пример :

Представим, что у вас есть 2 параметра и 3 элемента.

       param1  param2
item1    400    200
item2    200    100
item3    100     N/A

С линейной интерполяцией вы легко получите param2 для item3 = 50.

Моя идея:

Поскольку у меня есть 10 параметров и 1500 значений, я подумал о PCA на ковариационной матрице из 750 завершенных элементов (в поиске основного направления набора данные).

PCA приведет меня к одному главному направлению для моих предметов (наибольшее собственное значение) и поднаправлению для подгрупп предметов (меньшие собственные значения).

Я хотел, например, проецировать векторы с отсутствующими параметрами на основное направление. получить приблизительное значение отсутствующих параметров.

Из моего первого примера:

       param1  param2
item1    400    200
item2    200    100
item3    100     X ?

Полная матрица:

param1  param2
item1    400    200
item2    200    100

Ковариационная матрица:

   1    0.5
   0.5  1 

собственные векторы и собственные значения:

V1 и l1:

1
1   associatedd to 1.5

V2 и l2:

1
-1  associated to 0.5

результат:

Если я проецирую только на V1, я получаю X1=100.

Если я проецирую на l1.V1 + l2.V2, я получаю X1=50. Это связано с тем, что между первыми двумя элементами существует идеальная корреляция.


Итак, мой вопрос:

Пока это только теория, я еще не применил ее, но перед тем, как начать, я хотел бы знать, собираюсь ли я куда-нибудь с этим.

Могу ли я сделать лучше? (Я действительно верю, да.) Что я могу сделать, если у всех предметов есть один отсутствующий параметр? Откуда я могу получить направление?

Известны ли хорошие алгоритмы для заполнения искаженных матриц или вы можете помочь мне завершить мою идею (порекомендовав мне хорошие показания или методы)?

Я думаю, что Netflix использует этот вид алгоритма для автоматического заполнения матрицы оценки фильма, например (проблема доллара Netflix 1M).

Если вы считаете, что он принадлежит другому сайту stackexchange, не стесняйтесь переносить его.

Ответы [ 3 ]

2 голосов
/ 08 ноября 2011

Попробуйте алгоритм NIPALS.Это стандартный метод из области «Хемометрика».Это метод PCA, специально разработанный для пропущенных данных.Вы можете затем спроецировать свои оценки и нагрузку (t * p '), чтобы заполнить пробелы в соответствии с моделью данных.Прелесть этого подхода в том, что вы не смещаете данные путем вменения, вы просто используете данные, которые у вас есть.Попробуйте поискать работы Германа или Сванте Волда, или есть реализации в R и Matlab.Очевидно, что чем больше пропущенных данных, тем менее достоверны результаты, но при случайном пропуске вы можете получить довольно большое количество пропущенных данных.

Легенда гласит, что Герман изобрел алгоритм ранжирования скаковых лошадей в США - огромная проблема с отсутствующими данными (если подумать, не все лошади встречаются)!

2 голосов
/ 26 июля 2011

Эта статья Саймона Фанка описывает его использование такого подхода, как ваш, для призового конкурса Netflix; возможно, это то, о чем вы подумали, когда упомянули об этом. В отличие от вашего подхода, он обрабатывает недостающие данные. Суть заключается в том, чтобы заменить прямое использование матричных методов для определения сингулярного разложения матрицы данных на примерно эквивалентную задачу оптимизации, которая более естественно учитывает отсутствующие данные.

1 голос
/ 28 июля 2011

Почему бы не использовать числовые прогнозы из машинного обучения ?В вашем первом примере params - это атрибуты, а items - это экземпляры.С его помощью вы можете попробовать линейную регрессию или нейронные сети или что-нибудь еще за пару минут.После обучения вы получите следующее уравнение для вашего первого примера (param2 здесь помечен как класс):

param2 = 0 + 1/2 * param1

, что именно то, что вы хотите.

Если вы не уверены, что отношения между параметрами являются линейными, вы всегда можете попробовать другие типы регрессии (ANN, SVM, что угодно).

Для быстрого запуска используйте Weka .Конвертируйте ваши данные в CSV, загрузите их в Weka и начните играть.Числовые прогнозы можно найти на вкладке «Классификация».

...