0

我正在尝试定义一个过程 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 (4 8)) (d (1 8)) (d (2 9)))

所以我知道它会开始:

(define (knn k point distance data)

我知道我将不得不计算每个点的距离,所以训练数据的 caadr 然后在列表的 cdr 上重复以获取每个值,然后如何将其与原始值进行比较,然后返回整个值嵌套列表是我迷路的地方。

最后,我还想定义一个名为 major 的函数,它接受一个非空的标记数据列表和一个非空的标签列表,并返回最常出现的标签。如果有多个这样的标签,那么您的程序返回哪一个都没有关系。

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

4

1 回答 1

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)->(0,10) 的距离比 (0,5)->(0,10) 短,这没有任何意义。我的结果是如果你使用毕达哥拉斯来获得距离,你会得到什么。

point结构与元素不同的事实data很奇怪。我宁愿没有cadrin data-distance-point<

于 2013-11-13T19:02:24.913 回答