You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:42:08