📜  Mamdani和Sugeno模糊推理系统的比较(1)

📅  最后修改于: 2023-12-03 15:32:48.414000             🧑  作者: Mango

Mamdani和Sugeno模糊推理系统的比较

在处理非精确信息时,模糊逻辑是一种非常有用的工具。其中,Mamdani和Sugeno是两种常用的模糊推理系统,本文将讨论它们之间的异同之处。

Mamdani模糊推理系统

Mamdani模糊推理系统在规则表达式方面非常灵活,并且具有较强的解释性。它使用了隶属度函数来测量变量的模糊程度,将输入模糊化后与规则进行匹配,并通过后件推理产生输出。Mamdani模糊推理系统可以实现很复杂的推理过程,但也存在性能问题。

以下是一个Mamdani模糊推理系统的代码示例:

import numpy as np
import skfuzzy as fuzz

# 设定输入和输出变量的隶属度函数
x = np.arange(0, 10, 0.1)
temperature = fuzz.trimf(x, [0, 5, 10]) 
pressure = fuzz.trimf(x, [0, 5, 10])
fan_speed = np.arange(0, 101, 1)

# 定义规则
rules = np.fmax(temperature, pressure)

# 模糊化
temperature_level = fuzz.interp_membership(x, temperature, 6.5)
pressure_level = fuzz.interp_membership(x, pressure, 9.8)
active_rule = np.fmin(temperature_level, pressure_level)

# 推理
fan_speed_activation = np.fmin(active_rule, rules)
fan_speed_result = fuzz.defuzz(fan_speed, fan_speed_activation, 'centroid')

print(fan_speed_result)

在这个示例中,我们定义了一个Mamdani模糊推理系统,用于确定风扇的速度。我们设定输入变量为温度和压力,输出变量为风扇的速度。然后,通过几个步骤计算出最终的风扇速度。

Sugeno模糊推理系统

Sugeno模糊推理系统在模糊推理中使用了加权平均的方法,即推理输出变量是根据输入变量的线性组合得出的。相比于Mamdani模糊推理系统,它更容易地实现和计算。

以下是一个Sugeno模糊推理系统的代码示例:

import numpy as np
import skfuzzy as fuzz

# 设定输入变量和参数
x_age = np.arange(0, 101)
x_income = np.arange(0, 101)
age_lo = fuzz.trimf(x_age, [0, 18, 30])
age_md = fuzz.trimf(x_age, [20, 50, 80])
age_hi = fuzz.trimf(x_age, [70, 90, 100])
income_lo = fuzz.trimf(x_income, [0, 20, 40])
income_md = fuzz.trimf(x_income, [30, 50, 70])
income_hi = fuzz.trimf(x_income, [60, 80, 100])

# 设定输出变量
output_weights = [1, 2, 3]

# 设定规则
rules = np.zeros((3,3,3))
rules[0,:,:] = np.array([0,0,1])
rules[1,:,:] = np.array([0,1,2])
rules[2,:,:] = np.array([1,2,3])

# 模糊化
age_level_lo = fuzz.interp_membership(x_age, age_lo, 24.5)
age_level_md = fuzz.interp_membership(x_age, age_md, 24.5)
age_level_hi = fuzz.interp_membership(x_age, age_hi, 24.5)

income_level_lo = fuzz.interp_membership(x_income, income_lo, 64.5)
income_level_md = fuzz.interp_membership(x_income, income_md, 64.5)
income_level_hi = fuzz.interp_membership(x_income, income_hi, 64.5)

# 推理
numerator_sum = 0.0
denominator_sum = 0.0
for i in range(3):
    for j in range(3):
        for k in range(3):
            weight = (rules[i,j,k] * output_weights[k])
            weight *= age_level_lo if i==0 else age_level_md if i==1 else age_level_hi
            weight *= income_level_lo if j==0 else income_level_md if j==1 else income_level_hi
            numerator_sum += weight
            denominator_sum += rules[i,j,k] * (age_level_lo if i==0 else age_level_md if i==1 else age_level_hi) * (income_level_lo if j==0 else income_level_md if j==1 else income_level_hi)

output = numerator_sum/denominator_sum

print(output)

在这个示例中,我们使用了Sugeno模糊推理系统,将输入变量——年龄和收入——用来预测家庭需求的输出变量。我们设定了隶属度函数、参数和规则,然后通过一系列公式计算出最终的输出。

总结

两种模糊推理方法都有各自的优势和缺点。Mamdani模糊推理灵活且可解释性强,但性能较低;相比而言,Sugeno模糊推理更容易实现和计算,但缺乏规则解释性。选择适当的方法应该基于具体的应用场景。