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