Haskell多态性和类型类实例

Haskell多态性和类型类实例,haskell,machine-learning,functional-programming,nearest-neighbor,Haskell,Machine Learning,Functional Programming,Nearest Neighbor,我正试图在Haskell编写一个机器学习库,以提高我的Haskell技能。 我考虑了一个涉及类的一般设计,如下所示: class Classifier classifier where train :: X -> y -> trainingData classify :: trainingData -> x -> y 例如,给定一组示例X及其真实标签y,列车返回 用于分类功能的训练数据 因此,如果我想实现KNN,我会这样做: data KNN = K

我正试图在Haskell编写一个机器学习库,以提高我的Haskell技能。 我考虑了一个涉及类的一般设计,如下所示:

  class Classifier classifier where
    train :: X -> y -> trainingData
    classify :: trainingData -> x -> y
例如,给定一组示例X及其真实标签y,列车返回 用于分类功能的训练数据

因此,如果我想实现KNN,我会这样做:

data KNN = KNN Int (Int -> Int -> Float) 
其中,第一个int是邻域数,其函数是计算向量之间距离的度量

  instance Classifier KNN where
---This is where I am stuck---
如何实现分类器类型类函数,使其成为泛型 我将创建的所有分类器? 我觉得我对待哈斯克尔太像是一个命令
类似OOP的语言,我想用Haskell的方法来实现这一点。

假设您的类型类不知道分类器提供了什么,您可以这样做

class Classifier c where
  train :: [x] -> [y] -> c -> [(x,y)]
  classify :: [(x,y)] -> c -> x > y
这里,
train
正在获取类型为
x
的样本列表、类型为
y
的标签列表和类型为
c
的分类器,并且需要返回样本/标签对列表

classify
获取样本/标签对列表(例如由
train
生成的)、分类器和样本,并生成新标签

(不过,至少,我可能会将
[(x,y)]
替换为
Map xy

关键是分类器本身需要被
train
classify
使用,尽管此时您不需要知道它是什么样子

然后,
KNN
的实例可能如下所示

instance Classifier KNN where

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

在这里,
n
f
既可用于创建训练数据,也可用于帮助为样本点选择训练数据中最接近的成员。

我认为您需要多参数类型类(具有可选的函数依赖项或类型族;我省略了这些)

分类器、样本、标签和知识类型之间存在着四方关系


训练方法从一组样本(s)-标签(l)对中获得一些知识(k)。分类方法使用这些知识来推断样本的标签。(合并方法将两条知识连接在一起;不知道它是否始终适用)。

听起来你从错误的一端开始解决问题。您能否为您计划创建的各种分类器发布一些实际的
分类
训练
功能的类型签名?那么,如果、为什么以及如何抽象事物,这可能是显而易见的。一个能够处理每种类型的样本和标签的分类器可能过于通用而没有用处约束可与给定分类器一起使用的样本和标签类型会更好,但我对该领域了解不够,无法提供建议。这至少适用于定义的
KNN
 class Classifier c s l  k where
      train :: c -> [(s, l)] -> k
      classify :: c -> k -> s -> l
      combine :: c -> k -> k -> k