Исходными данными для объекта является двоичная матрица m-на-n (допускаются только 0 и 1 с). m Строки представляют собой наблюдения, n столбцов - функции. Некоторые наблюдения отмечены как цели, которые необходимо отделить от остальных.Комбинации бинарных признаков (векторов)
Хотя это похоже на типичную проблему NN, SVM и т. Д., Мне не нужно обобщение. Мне нужен эффективный алгоритм, чтобы найти как можно больше комбинаций столбцов (функций), которые полностью разделяют цели из других наблюдений, классифицируют, то есть.
Например:
f1 f2 f3
o1 1 1 0
t1 1 0 1
o2 0 1 1
Здесь {f1, f3} является приемлемым комбо, который отделяет целевую t1 от остальных (O1, O2) (кстати, {f2} не так, по определению задач особенности, ДОЛЖЕН присутствовать в целевой точке). Другими словами,
t1(f1) & t1(f3) = 1 and o1(f1) & o1(f3) = 0, o2(f1) & o2(f3) = 0
where '&' represents logical conjunction (AND).
m - около 100 000, n - 1000. В настоящее время данные упаковываются на 128-битные слова вдоль m, и поиск оптимизируется с помощью sse4 и еще чего-то. Однако для получения этих комбо-функций требуется слишком много времени. После того, как 2 миллиарда звонков в рутину спуска деревьев покрыли около 15% корневых узлов. И нашел около 8000 комбо, что является достойным результатом для моего конкретного приложения.
Я использую некоторые эмпирические критерии, чтобы обрезать менее вероятные пути спуска, не без ограниченного успеха, но есть ли что-то радикально лучше? Я уверен, что там должно быть? .. Любая помощь, в какой бы то ни было форме, отношении или предположении, была бы оценена.
Запрос на разъяснение: предположим, что у вас есть t1, t2, o1, o2. Будете ли вы: a) искать один раз, чтобы отделить t1, t2 от o1, o2 b) искать дважды, один для разделения t1 от o1, o2, а другой для разделения t2 от o1, o2 c) искать дважды один для разделения t1 с o1, o2, t2, а другой для разделения t2 от o1, o2, t1? –
Ali: в настоящее время поиск выполняется рекурсивно, по убыванию дерева и исключая уже обработанные комбинации, поэтому каждая комбо рассматривается только один раз. – jbarr
Не понимаю. Предположим, что есть три функции f1, f2, f3. Я напишу эти функции в двоичном формате, то есть 101 означает f1, а не f2, f3. Пусть t1 = 110 t2 = 101 o1 = 010 o2 = 011. Теперь {f1} решение, так как оно отделяет t1 и t2 от остальных? Или нам нужны два разных решения: s1 = {f1, f2} для разделения t1 и s2 = {f1, f3} для разделения t2? –