Python嵌套循环实现最近邻分类器对未知样本红蓝分类
问题分析
你现有代码的核心错误如下:
- 变量名冲突:循环变量使用了
unknown、red、blue和原始数据集名称重名,会覆盖原始数据导致计算错误 - 最小距离更新逻辑错误:比较最小距离的判断逻辑写在了循环外,且没有赋值操作,每次循环直接覆盖当前距离值,无法取到真正的最小距离
- 分类判断逻辑位置错误:比较逻辑放在了外层循环外,只会对最后一个未知点做分类,无法批量处理所有未知样本
- 缺少可直接运行的距离计算实现:如果没有自定义的
util模块,需要自行实现欧氏距离计算逻辑
完整实现代码
距离计算函数(可直接替换你现有的util.calculate_distance)
import math def calculate_distance(point1, point2): # 计算二维欧氏距离 return math.sqrt((point1[0] - point2[0])**2 + (point1[1] - point2[1])**2)
批量分类逻辑
# 数据集定义 unknown = [(0.678713, 0.951598), (-1.169512, -0.957855), (0.631947, 1.236489), (-0.131799, -0.324218), (-0.199565, -0.229171), (0.900907, 0.448131), (0.699395, 0.414314), (-1.132646, -1.013298)] red = [(4.495835, 5.347824), (4.847142, 3.975707), (3.899234, 4.040381), (4.679696, 4.379142), (4.036405, 4.594875), (4.018261, 4.013737), (5.234569, 3.760527), (4.984905, 4.239113), (7.209045, 2.419611), (4.090784, 5.082992)] blue = [(-1.136909, -0.71508), (-0.019995, -0.10857), (-0.305477, -0.83567), (-0.364433, -0.335014), (-0.687055, -0.871415), (-0.255737, -0.739738), (0.238247, 0.235795), (1.906042, 1.712006)] # 遍历所有未知点完成分类 for unknown_point in unknown: min_red_dist = float('inf') min_blue_dist = float('inf') # 计算到所有红类样本的最小距离 for red_point in red: dist = calculate_distance(unknown_point, red_point) if dist < min_red_dist: min_red_dist = dist # 计算到所有蓝类样本的最小距离 for blue_point in blue: dist = calculate_distance(unknown_point, blue_point) if dist < min_blue_dist: min_blue_dist = dist # 输出分类结果 if min_red_dist < min_blue_dist: print(f"坐标{unknown_point} 分类为:red") else: print(f"坐标{unknown_point} 分类为:blue")
补充说明
你提供的8个测试样本运行后全部会被分类为blue,因为所有未知点和蓝类样本的距离都远小于和红类样本的距离。如果后续你需要处理20个未知样本,直接把新的样本点追加到unknown列表中即可自动完成批量分类。
内容的提问来源于stack exchange,提问作者Mahbub Abdullah
相关产品推荐
相关产品推荐

