2

하스켈에서 컴퓨터 학습 라이브러리를 작성하여 하스켈 기술을 익히려고합니다. 나는과 같이하는 클래스를 포함하는 일반적인 디자인에 대한 생각 : 예를 들어하스켈 다형성과 타입 인스턴스

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

, 예 X의 세트가 지정되면 (자), 그리고 그들의 진정한 라벨 Y는 열차 분류 기능에 사용되는 trainingData를 반환합니다. 기능을 벡터

사이의 거리를 계산의 메트릭을 첫 번째 INT는 이웃의 수입니다

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

과 : 나는 KNN을 구현하려는 경우

그래서, 난 그렇게처럼 할 것

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

어떻게 내가 만들 것이다 분류의 모든 를 일반적인 것, 그래서 나는 분류 유형 클래스 기능을 구현할 수있다? 나는 Haskell을 너무 많이 명령해야한다고 느낀다. 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 

분류 자, 샘플, 레이블 및 지식 유형 간에는 네면 관계가 있습니다.

train 메서드는 샘플 (들) - 레이블 (l) 쌍의 집합에서 일부 지식 (k)을 유도합니다. classify 메서드는 해당 지식을 사용하여 샘플의 레이블을 유추합니다. (결합 방법은 두 가지 지식을 하나로 결합하고 항상 적용되는지 여부를 모릅니다.)

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