2

私は、Haskellのスキルを操作するために、Haskellで機械学習ライブラリを書くことを試みています。 は私は似ているクラスを含む一般的な設計について考えた:例えばHaskell多形性と型クラスインスタンス

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

、実施例Xの組与えられ、その真のラベルyは、列車が分類関数で使用される trainingDataを返します。

私はKNNを実装したいのであれば、私はそうのようにそれを行うだろう:

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

最初のintは隣人の数と機能ベクトル間の距離を計算し、その測定基準である場合には

instance Classifier KNN where 
---This is where I am stuck--- 

どのように彼らは私が作成する分類器のすべてに を汎用的になるので、私は分類子型クラスの機能を実装することができますか? 私はハスケルをあまりにも多くの命令のように扱っているように感じています OOPのような言語と私はこれをハスケルの方法でやりたいと思います。

+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 

クラシファイア、サンプル、ラベル、およびナレッジタイプの間には4つの関係があります。

列車法は、サンプル(1つまたは複数)のラベル(l)の組から知識(k)を導出する。 classifyメソッドは、その知識を使用してサンプルのラベルを推論します。 (結合メソッドは2つの知識を結合し、常に適用されるかどうかはわかりません)。

3

trainはタイプxのサンプルのリストを取得している、あなたはここで

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

ような何かを行うことができ、あなたのタイプのクラスは、分類器が提供するものの知識がないと仮定すると、タイプ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