[英]Haskell polymorphism and typeclass instance
我正在嘗試在Haskell中編寫一個機器學習庫,以研究我的Haskell技能。 我想到了涉及類的一般設計,如下所示:
class Classifier classifier where
train :: X -> y -> trainingData
classify :: trainingData -> x -> y
例如,給定一組示例X及其真實標簽y,train返回在分類函數中使用的trainingData。
所以,如果我想實現KNN,我會這樣做:
data KNN = KNN Int (Int -> Int -> Float)
第一個int是鄰居的數量,而函數是計算向量之間距離的度量
instance Classifier KNN where
---This is where I am stuck---
如何實現Classifier類型類函數,以便它們對我將創建的所有分類器都是通用的? 我覺得我對Haskell的處理過於像語言這樣的命令式OOP,我想以Haskell的方式做這件事。
我想說你需要多參數類型類(帶有可選的函數依賴,或者類型族;我省略了這些類)。
class Classifier c s l k where
train :: c -> [(s, l)] -> k
classify :: c -> k -> s -> l
combine :: c -> k -> k -> k
分類器,樣本,標簽和知識類型之間存在四方面的關系。
列車方法從一組樣本 - 標簽(1)對中導出一些知識(k)。 分類方法使用該知識來推斷樣本的標簽。 (組合方法將兩個知識連接在一起;不知道它是否總是適用)。
假設你的類型類不知道分類器提供什么,你可以做類似的事情
class Classifier c where
train :: [x] -> [y] -> c -> [(x,y)]
classify :: [(x,y)] -> c -> x > y
這里, train
獲取x
類型的樣本列表, y
類型的標簽列表以及某種類型c
的分類器,並且需要返回樣本/標簽對列表。
classify
采用樣本/標簽對列表(例如train
生成的列表),分類器和樣本,並生成新標簽。
(至少,我可能用Map xy
替換[(x,y)]
。)
關鍵是分類器本身需要被train
和classify
,盡管您不需要知道此時的樣子。
你的KNN
實例可能就像
instance Classifier KNN where
train samples labels (KNN n f) = ...
classify td (KNN n f) sample = ...
這里, n
和f
既可用於創建訓練數據,也可用於為樣本點選擇最接近的訓練數據成員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.