Scheme中最近邻和大部分列表

时间:2013-11-13 17:27:56

标签: scheme

我正在尝试定义一个过程knn,它取一个正整数k,一个房子的坐标,一个距离函数和一个训练数据,并返回一个给定给定的(最多)k个最近邻居的列表房子里的训练数据。返回的列表应该通过靠近给定的房屋而以递减顺序排列。

训练数据由:

给出
(define training-data
   '((d (1 8)) (d (2 9)) (d (8 10)) (d (4 2)) (r (1 3)) (r (2 1)) (r (4 8)) (r (6 4))
      (d (7 3)) (r (1 5)) (d (1 9)) (d (6 2)) (r (10 9)) (d (7 7))
      (d (5 11)) (r (1 1)) (r (0 9)) (r (12 12)) (r (20 30))))

我正在使用的距离函数是出租车距离,它取两个点并返回其坐标的绝对差值之和。由下列人员给出:

(define (taxicab-distance ls1 ls2)
   (+ (abs (- (car ls1) (cadr ls1))) (abs(- (car ls2) (cadr ls2)))))

我正在尝试做的一个例子是:

〜(knn 3'(3 8)出租车 - 距离训练 - 数据)

- > ((r(48))(d(18))(d(2 9)))

所以我知道它将从以下开始:

(define (knn k point distance data)

我知道我必须采取每个点的距离,所以做训练数据的caadr然后重复列表的cdr来获取每个值,但是然后如何将它与原始值进行比较然后返回整个嵌套列表是我迷路的地方。

最后,有了这个,我还想定义一个名为majority的函数,它接受一个非空标记数据列表和一个非空标签列表,并返回最常出现的标签。如果有多个这样的标签,那么你的程序返回哪一个并不重要。

大多数情况下,它需要两个参数,一个数据集和一个它正在寻找的列表。我知道对于训练数据,它必须查看数据的caar并对cdr执行相同操作,然后对每个d和r进行计数。

1 个答案:

答案 0 :(得分:0)

(import (rnrs)
        (rnrs sorting)
        (only (srfi :1) take))

(define (knn k point distance data)
  ;; Is p1 is closer to point than p2?
  (define (data-distance-point< p1 p2)
    (< (distance point (cadr p1))
       (distance point (cadr p2))))

  ;; take k elements of the coordinates 
  ;; with the shortest path to point   
  (take (list-sort data-distance-point< data) k))

(knn 3 '(3 8) point-distance training-data) ; ==> ((r (4 8)) (d (2 9)) (d (1 8)))

我没有使用你的距离函数,因为(0,0) - &gt;(0,10)的距离比(0,5) - >(0,10)的距离短,这没有任何意义。如果你使用毕达哥拉斯来获得距离,我的结果就是你得到的。

point具有与data元素不同的结构这一事实很奇怪。我希望cadr中没有data-distance-point<