私は分類システムを持っていますが、残念ながら仕事上の理由からあいまいにする必要があります。考慮すべき 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
サブジェクトを取得して AE の値を取得し、ルールを順番に照合してみます。いずれかが一致した場合、最初の結果を返します。
C は離散値で、ae のいずれかになります。残りは単なる整数です。
ルールセットは古いシステムから自動的に生成され、非常に多数のルール (約 2,500 万) を含んでいます。古いルールは if ステートメントでした。
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
結果として、結果列でルールセットを分割し、それぞれを個別に縮小できます。ただし、ルールセットを特定して縮小する簡単な方法は思いつきません。クラスタリング アルゴリズムを試してみましたが、一部のデータが離散的であり、それを連続として扱うのは不完全であるため、それらはチョークします。もう一つの例:
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)
理想的な世界では、これは 2 つのルールになります。
A B C Result
1 2 * X
2 4 * X
つまり、アルゴリズムは A と B の関係を識別するだけでなく、C がノイズであると推測します (ルールにとって重要ではありません)。
この問題をどうやって解決するか考えている人はいますか? ほとんどの場合、これは 1 回限りのプロセスであると予想されるため、どの言語やライブラリも公正なゲームです。前もって感謝します。