1

我有一個分類系統,我不幸需要爲工作原因模糊。假設我們有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。其餘的只是整數。

該規則集已經從我們的舊系統自動生成,並且有大量的規則(約2500萬)。舊規則是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) 

在理想情況下,這將是兩個規則:

A B C Result 
1 2 * X 
2 4 * X 

即:不僅將所述算法標識A和B之間的關係,而且也將推斷是c是噪音(不重要的規則)

有沒有人有如何去解決這個問題的想法?任何語言或圖書館都是公平的遊戲,因爲我認爲這是一個大多數一次性的過程。提前致謝。

+0

你確定你的第一個例子是正確的嗎?據我所知,「1 2 5 5 4 X」將意味着例如「1 2 b 5 2」意味着X,這不是原始規則集所隱含的。 – Sami 2010-01-19 19:24:37

回答

1

查看Weka machine learning lib for Java。該API有點笨重,但它非常有用。總的來說,你似乎想要的是一種現成的機器學習算法,這正是Weka包含的算法。你顯然在尋找相對容易解釋的東西(你提到你希望它推斷A和B之間的關係,並告訴你C只是噪聲)。你可以嘗試一個決策樹,比如J48,因爲這些通常易於可視化/解釋。

+1

接受 - 我實現了一個簡單的分類算法,它利用了我通過使用Weka發現的關係和含義。謝謝。 – rjh 2010-02-14 21:03:12

0

假設您已經或可以隨機生成(基於舊規則集)一大組打破所有類的數據,您可以嘗試使用neural network方法,通過backpropagation進行培訓。使用適當大小的隱藏層可以使您近似於特徵空間中的任意判別函數。這或多或少是與聚類相同的想法,但由於訓練範例應該對離散輸入沒有任何問題。

但是,對於您的情況,這可能會有點過於「黑匣子」,特別是如果您對誤報和負面情況零容忍(尤其是對於一次性過程,您會獲得任意程度的置信度通過檢查一個龐大的驗證集)。

+0

不幸的是,我們需要能夠反思確切的規則,儘管你的想法對於許多其他用例來說是非常好的。 – rjh 2010-01-20 12:22:38

1

2500萬條規則?有多少功能?每個功能有多少個值?是否可以在實際時間內遍歷所有組合?如果可以的話,您可以先將結果按規則分組。

然後,對於每個結果,執行以下操作。將每個要素視爲一個維度,並將特徵的允許值作爲沿該維度的度量,構建一個代表整個規則集的巨大卡諾圖。

該地圖有兩種用途。一:研究Quine-McCluskey算法的自動化方法。這方面做了很多工作。甚至還有一些可用的程序,但可能它們都不會處理您要製作的卡諾圖地圖。

二:當您創建了最終約簡規則集時,再次遍歷所有要素的所有值的所有組合,並使用約簡規則集構造另一個卡諾圖。如果地圖匹配,則您的規則集是相同的。

-Al。