我正在尝试定义一个过程 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。