2

我想在Haskell中編寫一個機器學習庫,以處理我的Haskell技能。 我考慮涉及一類是像這樣的一般設計:,給定一組實例X的Haskell多態性和類型實例

class Classifier classifier where 
    train :: X -> y -> trainingData 
    classify :: trainingData -> x -> y 

例如,與它們的真實標記Y,列車返回 trainingData其在分類功能中使用。

所以,如果我想要實現KNN,我會做它像這樣:

data KNN = KNN Int (Int -> Int -> Float) 

當第一個int是鄰居的數量和功能,它是計算矢量

之間的距離度量
instance Classifier KNN where 
---This is where I am stuck--- 

我該如何實現分類器類型的類函數,以便它們對於我將創建的所有分類器都是通用的 ? 我感覺就像我對待Haskell太像一個命令 面向對象的語言,我想這樣做的Haskell的方式。

+4

這聽起來像你從錯誤的結局開始的問題。你可以爲你計劃創建的各種分類器發佈一些實際的'classify'和'train'函數的類型簽名嗎?那麼,如果,爲什麼以及如何抽象東西,可能會很明顯 – jberryman

回答

4

我會說你需要多參數類型類(有可選的功能依賴或類型系列;我省略了這些)。

class Classifier c s l k where 
     train :: c -> [(s, l)] -> k 
     classify :: c -> k -> s -> l 
     combine :: c -> k -> k -> k 

分類器,樣本,標籤和知識類型之間存在着四面關係。

訓練方法從一組樣本(s) - 標籤(l)對中推導出一些知識(k)。分類方法使用該知識來推斷樣本的標籤。 (組合方法將兩個知識結合在一起;不知道它是否總是適用)。

3

假設你的類型的類沒有什麼分類提供知識,你可以不喜歡

class Classifier c where 
    train :: [x] -> [y] -> c -> [(x,y)] 
    classify :: [(x,y)] -> c -> x > y 

這裏,train越來越x類型的樣本名單,y類型的標籤列表,和某種類型的分類器c,並且需要返回樣本/標籤對的列表。

classify獲取樣本/標籤對(例如由train產生的),分類器和樣本的列表,並生成新的標籤。

(最起碼,雖然,我可能會喜歡的東西Map x y更換[(x,y)]。)

的關鍵是,分級本身需要雙方trainclassify使用,但是你沒有需要知道這個時候會是什麼樣子。

您的KNN實例可以再看看像

instance Classifier KNN where 

    train samples labels (KNN n f) = ... 
    classify td (KNN n f) sample = ... 

這裏,nf可同時用於創建訓練數據,並幫助挑選訓練數據的最接近的成員的採樣點。

+1

可以處理每種類型的樣本和標籤的分類器可能過於通用,無法使用。 –

+0

是的,我懷疑一個類型族(或具有函數依賴關係的多參數類型類)來約束可以與給定分類器一起使用的樣本和標籤類型會更好,但我不太瞭解該領域以提供建議。這至少與定義的'KNN'一起工作。 – chepner