You need to enable JavaScript to run this app. 为什么调用k_nearest_neighbors函数后print(clazz)无法输出结果?
优惠活动
大模型
产品
解决方案
定价
更多

为什么调用k_nearest_neighbors函数后print(clazz)无法输出结果?

问题原因
  • 自定义函数k_nearest_neighbors没有显式声明返回值,Python中所有无return语句的函数执行完成后都会默认返回None,因此你赋值得到的clazz本身就是None,自然无法输出预期的分类结果
  • 函数内部逻辑缩进错误:距离排序、提取前k个类别的逻辑被写在了for循环内部,每次遍历节点都会重复执行无意义的排序操作,且你没有补充k近邻的投票逻辑来得到最终的分类结果
解决方法

你可以按照下方修正后的代码调整逻辑:

def k_nearest_neighbors(node, nodes, k=3):
    x1, y1 = node
    distances = []
    for x2, y2, node_cls in nodes:
        distance = abs(x1 - x2) + abs(y1 - y2)
        distances.append((node_cls, distance))
    # 排序和提取前k个类别的逻辑移出for循环,避免重复运算
    distances = sorted(distances, key=lambda x: x[1])
    classes = [x[0] for x in distances[:k]]
    # 统计出现次数最多的类别作为最终分类结果返回
    return max(classes, key=classes.count)

cards = [
    (2, 0, "schilten"), (0, 1, "schilten"), (0, 2, "schilten"),
    (9, 2, "rosen"), (1, 13, "rosen"),
    (3, 3, "eichel"),
    (5, 5, "schellen"),
]
card = (2, 1)
clazz = k_nearest_neighbors(card, cards)
print(clazz)

执行修改后的代码会输出schilten,为预期的分类结果。

内容的提问来源于stack exchange,提问作者Gralsi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 03:48:01