Исходными данными для субъекта является двоичная матрица 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).
М - около 100 000, n - 1000. В настоящее время данные упакованы в 128-битные слова вдоль m, и поиск оптимизирован с помощью sse4 и еще много чего. Тем не менее, получение этих комбинаций функций занимает слишком много времени.
После 2 миллиардов обращений к процедуре спуска дерева она покрыла около 15% корневых узлов. И нашел около 8000 комбо, что является достойным результатом для моего конкретного приложения.
Я использую некоторые эмпирические критерии, чтобы отрезать менее вероятные пути спуска, не без ограниченного успеха, но есть ли что-то радикально лучше? Я уверен, что должно быть? .. Любая помощь, в любой форме, ссылка или предложение, будет оценена.