为什么调用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
相关产品推荐
相关产品推荐

