如何从skfuzzy模糊逻辑模型输出值中获取对应类别?
解决skfuzzy输出值映射到模糊类别问题
要把skfuzzy计算出的去模糊化数值映射到对应的类别(reduction、optimal、increase),核心思路是获取该数值在每个输出模糊集中的隶属度,取隶属度最高的类别作为结果,具体实现步骤如下:
1. 确认输出模糊集的定义
先确保你已明确输出变量的模糊集定义,比如示例代码:
import skfuzzy as fuzz import numpy as np # 定义输出变量论域与三个模糊集 x_output = np.arange(0, 101, 1) reduction = fuzz.trimf(x_output, [0, 0, 50]) optimal = fuzz.trimf(x_output, [30, 50, 70]) increase = fuzz.trimf(x_output, [50, 100, 100])
2. 计算输出值在各模糊集的隶属度
拿到去模糊化后的数值(如32.23415721908444),用fuzz.interp_membership计算它在每个模糊集中的隶属度:
output_value = 32.23415721908444 # 计算每个类别的隶属度 mem_reduction = fuzz.interp_membership(x_output, reduction, output_value) mem_optimal = fuzz.interp_membership(x_output, optimal, output_value) mem_increase = fuzz.interp_membership(x_output, increase, output_value)
3. 匹配隶属度最高的类别
将隶属度与类别一一对应,筛选出隶属度最高的类别:
# 构建隶属度-类别映射字典 membership_dict = { 'reduction': mem_reduction, 'optimal': mem_optimal, 'increase': mem_increase } # 获取隶属度最高的类别 assigned_category = max(membership_dict, key=membership_dict.get)
4. 批量写入DataFrame
定义批量处理函数,将类别列添加到DataFrame中:
import pandas as pd # 示例DataFrame df = pd.DataFrame({'output_value': [32.23415721908444, 65.123, 20.45]}) # 封装隶属度计算与类别匹配逻辑 def get_category(val): mem_r = fuzz.interp_membership(x_output, reduction, val) mem_o = fuzz.interp_membership(x_output, optimal, val) mem_i = fuzz.interp_membership(x_output, increase, val) return max({'reduction': mem_r, 'optimal': mem_o, 'increase': mem_i}, key=lambda k: locals()[f'mem_{k[0]}']) # 新增类别列 df['category'] = df['output_value'].apply(get_category)
注意事项
- 若输出值在两个模糊集的隶属度接近或相等,可根据业务规则添加优先级判断(比如优先归为
optimal类)。 - 确保计算隶属度时使用的模糊集定义与模型初始化时完全一致,避免隶属度计算错误。
内容的提问来源于stack exchange,提问作者Rafał
相关产品推荐
相关产品推荐

