У меня есть система классификации, которая, к сожалению, должна быть расплывчатой по соображениям работы. Скажем, у нас есть 5 функций для рассмотрения, это в основном набор правил:
A B C D E Result
1 2 b 5 3 X
1 2 c 5 4 X
1 2 e 5 2 X
Мы берем предмет и получаем его значения для A-E, затем пытаемся сопоставить правила по порядку. Если совпадение совпадает, мы возвращаем первый результат.
C - это дискретное значение, которое может быть любым из a-e. Остальные - целые числа.
Набор правил был автоматически сгенерирован из нашей старой системы и имеет чрезвычайно большое количество правил (~ 25 миллионов). Старые правила были, если заявления, например,
result("X") if $A >= 1 && $A <= 10 && $C eq 'A';
Как видите, старые правила часто даже не используют некоторые функции и не принимают диапазоны. Некоторые из них более раздражают:
result("Y") if ($A == 1 && $B == 2) || ($A == 2 && $B == 4);
Набор правил должен быть намного меньше, поскольку он должен поддерживаться человеком, поэтому я хотел бы уменьшить наборы правил, чтобы первый пример стал:
A B C D E Result
1 2 bce 5 2-4 X
В результате мы можем разделить набор правил по столбцу Result и уменьшить каждый из них независимо. Однако я не могу придумать простой способ определить и сократить набор правил. Я пробовал кластеризовать алгоритмы, но они задыхаются, потому что некоторые данные являются дискретными, и обработка их как непрерывных является несовершенной. Другой пример:
A B C Result
1 2 a X
1 2 b X
(repeat a few hundred times)
2 4 a X
2 4 b X
(ditto)
В идеальном мире это будет два правила:
A B C Result
1 2 * X
2 4 * X
То есть: алгоритм не только идентифицирует отношения между A и B, но также выводит, что C является шумом (не важно для правила)
У кого-нибудь есть идеи, как решить эту проблему? Любой язык или библиотека - это честная игра, так как я ожидаю, что это будет в основном одноразовый процесс. Заранее спасибо.