簡體   English   中英

Haskell多態和類型實例

[英]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)] 。)

關鍵是分類器本身需要被trainclassify ,盡管您不需要知道此時的樣子。

你的KNN實例可能就像

instance Classifier KNN where

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

這里, nf既可用於創建訓練數據,也可用於為樣本點選擇最接近的訓練數據成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM