如何在Python中实现数值到模糊术语的映射?基于scikit-fuzzy自动生成模糊规则
如何用Python(结合scikit-fuzzy)从训练样本自动生成模糊规则?
嘿,你已经用automf()快速搭好了模糊系统的输入输出框架,现在想跳过手动写规则的繁琐步骤,靠训练样本自动生成对吧?我来给你一步步拆解实现方法:
第一步:准备训练样本数据
首先得有结构化的样本,每条样本要包含输入(quality、service)和对应的输出(tip)。我先模拟一组符合场景的样本:
import numpy as np import skfuzzy as fuzz from skfuzzy import control as ctrl # 初始化你已经定义好的模糊变量 quality = ctrl.Antecedent(np.arange(0, 11, 1), 'quality') service = ctrl.Antecedent(np.arange(0, 11, 1), 'service') tip = ctrl.Consequent(np.arange(0, 26, 1), 'tip') quality.automf(3) service.automf(3) tip.automf(3) # 模拟训练样本:每一行是[quality取值, service取值, tip实际值] training_data = np.array([ [5, 7, 15], [2, 3, 5], [9, 8, 22], [4, 5, 10], [7, 9, 18], [1, 2, 3], [10, 10, 25] ])
第二步:自动生成规则的核心逻辑
自动生成规则的本质很直观:给每个样本的输入值找到最贴合的模糊术语,输出值也找到最贴合的模糊术语,然后把它们拼成一条标准的"If...Then..."模糊规则。
比如样本[9,8,22],quality=9对应good,service=8对应good,tip=22对应good,那生成的规则就是If quality is good and service is good then tip is good。
第三步:代码实现规则自动生成
我写了一个实用函数,遍历每个样本计算隶属度、匹配最优模糊术语,最终生成scikit-fuzzy能直接识别的Rule对象:
def auto_generate_fuzzy_rules(training_data, antecedents, consequent): rules = [] # 遍历每一条训练样本 for sample in training_data: input_vals = sample[:-1] # 提取quality和service的输入值 output_val = sample[-1] # 提取对应的tip输出值 # 为每个输入变量匹配隶属度最高的模糊术语 input_conditions = [] for idx, ant in enumerate(antecedents): # 计算当前输入值在所有模糊术语上的隶属度 member_scores = [ fuzz.interp_membership(ant.universe, ant[term].mf, input_vals[idx]) for term in ant.terms ] # 选中隶属度最高的那个术语 best_term = list(ant.terms.keys())[np.argmax(member_scores)] input_conditions.append(ant[best_term]) # 为输出变量匹配隶属度最高的模糊术语 output_scores = [ fuzz.interp_membership(consequent.universe, consequent[term].mf, output_val) for term in consequent.terms ] best_output_term = list(consequent.terms.keys())[np.argmax(output_scores)] # 组合成scikit-fuzzy可识别的规则对象 rule = ctrl.Rule( antecedent=input_conditions[0] & input_conditions[1], consequent=consequent[best_output_term] ) rules.append(rule) return rules # 调用函数生成规则 auto_rules = auto_generate_fuzzy_rules(training_data, [quality, service], tip) # 构建模糊控制系统并测试 tip_control_system = ctrl.ControlSystem(auto_rules) tip_simulation = ctrl.ControlSystemSimulation(tip_control_system) # 测试输入:quality=8,service=9 tip_simulation.input['quality'] = 8 tip_simulation.input['service'] = 9 tip_simulation.compute() print(f"预测小费金额:{tip_simulation.output['tip']:.1f}")
第四步:优化小技巧
- 规则去重:如果多个样本生成了完全相同的规则,可以通过遍历检查或集合去重,避免冗余计算。
- 调整模糊术语粒度:把
automf(3)改成automf(5),会生成更精细的模糊术语(poor、low、average、high、good),规则精度会提升,但要注意避免过拟合。 - 过滤无效样本:如果某个输入值在所有模糊术语上的隶属度都极低(接近0),说明样本和你的模糊集不匹配,可以跳过这类样本,避免生成无效规则。
内容的提问来源于stack exchange,提问作者dada
相关产品推荐
相关产品推荐

