实现Find S算法遇报错:local variable 'specific_h' referenced before assignment
Find S算法报错:
local variable 'specific_h' referenced before assignment 问题解决 问题根源
你的代码里specific_h只在第一个target值为'yes'的样本出现时才会被定义。如果你的数据集里:
- 没有任何target为'yes'的样本,第一个循环根本不会执行
specific_h = con[i].copy()这行代码 - 后续循环和return语句调用
specific_h时,变量还未被创建,就会触发这个错误
另外,原代码未处理无正样本的边界情况,这是触发报错的核心原因。
修复后的代码
import pandas as pd import numpy as np data = pd.read_csv('lab1.csv') concepts = np.array(data)[:,:-1] target = np.array(data)[:,-1] def train(con, tar): # 提前初始化specific_h为全'?',避免无正样本时变量未定义 specific_h = ['?' for _ in range(len(con[0]))] found_positive = False # 找到第一个正样本,初始化假设 for i, val in enumerate(tar): if val == 'yes': specific_h = con[i].copy() found_positive = True break # 处理无正样本的边界情况 if not found_positive: print("数据集不存在target为'yes'的正样本") return specific_h # 遍历所有正样本,泛化假设 for i, val in enumerate(con): if tar[i] == 'yes': for x in range(len(specific_h)): if val[x] != specific_h[x]: specific_h[x] = '?' return specific_h print(train(concepts, target))
关键修改点
- 提前初始化
specific_h为全'?'的数组,保证变量始终存在 - 添加
found_positive标记,检测数据集是否包含正样本,避免无效计算并给出提示 - 保留原Find S算法的核心逻辑,仅补全了边界情况的处理
内容的提问来源于stack exchange,提问作者Paras Bansal
相关产品推荐
相关产品推荐

