418 KiB
418 KiB
Управление потоком жидкости¶
Создание лингвистических переменных¶
Входные X: level (уровень жидкости) и flow (расход жидкости) \ Выходные Y: influx (приток жидкости)
In [1]:
import numpy as np
from skfuzzy import control as ctrl
level = ctrl.Antecedent(np.arange(1.5, 9.0, 0.1), "level")
flow = ctrl.Antecedent(np.arange(0, 0.6, 0.01), "flow")
influx = ctrl.Consequent(np.arange(0, 0.6, 0.01), "influx")
Формирование нечетких переменных для лингвистических переменных и их визуализация¶
In [2]:
import skfuzzy as fuzz
level["low"] = fuzz.zmf(level.universe, 2, 4)
level["average"] = fuzz.trapmf(level.universe, [2, 4, 6, 8])
level["high"] = fuzz.smf(level.universe, 6, 8)
level.view()
flow["low"] = fuzz.zmf(flow.universe, 0.2, 0.3)
flow["average"] = fuzz.trapmf(flow.universe, [0.15, 0.25, 0.35, 0.45])
flow["high"] = fuzz.smf(flow.universe, 0.3, 0.4)
flow.view()
influx["low"] = fuzz.zmf(influx.universe, 0.2, 0.3)
influx["average"] = fuzz.trapmf(influx.universe, [0.15, 0.25, 0.35, 0.45])
influx["high"] = fuzz.smf(influx.universe, 0.3, 0.4)
influx.view()
Формирование и визуализация базы нечетких правил¶
В случае ошибки необходимо в файле
.venv/lib/python3.13/site-packages/skfuzzy/control/visualization.py
удалить лишний отступ на 182 строке, должно быть:
if not matplotlib_present:
raise ImportError("`ControlSystemVisualizer` can only be used "
"with `matplotlib` present in the system.")
self.ctrl = control_system
self.fig, self.ax = plt.subplots()
In [3]:
rule1 = ctrl.Rule(level["low"] & flow["high"], influx["high"])
rule2 = ctrl.Rule(level["low"] & flow["average"], influx["high"])
rule3 = ctrl.Rule(level["low"] & flow["low"], influx["average"])
rule4 = ctrl.Rule(level["average"] & flow["high"], influx["high"])
rule5 = ctrl.Rule(level["average"] & flow["average"], influx["average"])
rule6 = ctrl.Rule(level["average"] & flow["low"], influx["average"])
rule7 = ctrl.Rule(level["high"] & flow["high"], influx["average"])
rule8 = ctrl.Rule(level["high"] & flow["average"], influx["low"])
rule9 = ctrl.Rule(level["high"] & flow["low"], influx["low"])
rule1.view()
Out[3]:
Создание нечеткой системы и добавление нечетких правил в базу знаний нечеткой системы¶
In [4]:
influx_ctrl = ctrl.ControlSystem(
[
rule1,
rule2,
rule3,
rule4,
rule5,
rule6,
rule7,
rule8,
rule9,
]
)
influxes = ctrl.ControlSystemSimulation(influx_ctrl)
Пример расчета выходной переменной influx на основе входных переменных level и flow¶
Система также формирует подробный журнал выполнения процесса нечеткого логического вывода
In [5]:
influxes.input["level"] = 2.5
influxes.input["flow"] = 0.4
influxes.compute()
influxes.print_state()
influxes.output["influx"]
Out[5]:
Визуализация функции принадлежности для выходной переменной influx¶
Функция получена в процессе аккумуляции и используется для дефаззификации значения выходной переменной influx
In [6]:
influx.view(sim=influxes)
Пример решения задачи регрессии на основе нечеткого логического вывода¶
Загрузка данных¶
In [7]:
import pandas as pd
density_train = pd.read_csv("data/density/density_train.csv", sep=";", decimal=",")
density_test = pd.read_csv("data/density/density_test.csv", sep=";", decimal=",")
display(density_train.head(3))
display(density_test.head(3))
Инициализация лингвистических переменных и автоматическое формирование нечетких переменных¶
In [8]:
temp = ctrl.Antecedent(density_train["T"].sort_values().unique(), "temp")
al = ctrl.Antecedent(np.arange(0, 0.3, 0.005), "al")
ti = ctrl.Antecedent(np.arange(0, 0.3, 0.005), "ti")
density = ctrl.Consequent(np.arange(1.03, 1.22, 0.00001), "density")
temp.automf(3, variable_type="quant")
temp.view()
al.automf(3, variable_type="quant")
al.view()
ti.automf(3, variable_type="quant")
ti.view()
density.automf(5, variable_type="quant")
density.view()
Нечеткие правила¶
In [9]:
rule11 = ctrl.Rule(
temp["low"] & al["low"] & ti["low"],
density["low"],
)
rule12 = ctrl.Rule(
temp["average"] & al["low"] & ti["low"],
density["lower"],
)
rule13 = ctrl.Rule(
temp["high"] & al["low"] & ti["low"],
density["lower"],
)
rule21 = ctrl.Rule(
temp["low"] & al["average"] & ti["low"],
density["low"],
)
rule22 = ctrl.Rule(
temp["average"] & al["average"] & ti["low"],
density["low"],
)
rule23 = ctrl.Rule(
temp["high"] & al["average"] & ti["low"],
density["lower"],
)
rule31 = ctrl.Rule(
temp["low"] & al["high"] & ti["low"],
density["high"],
)
rule32 = ctrl.Rule(
temp["low"] & al["high"] & ti["low"],
density["high"],
)
rule33 = ctrl.Rule(
temp["high"] & al["high"] & ti["low"],
density["average"],
)
rule41 = ctrl.Rule(
temp["low"] & al["low"] & ti["average"],
density["low"],
)
rule42 = ctrl.Rule(
temp["average"] & al["low"] & ti["average"],
density["low"],
)
rule43 = ctrl.Rule(
temp["high"] & al["low"] & ti["average"],
density["lower"],
)
rule51 = ctrl.Rule(
temp["low"] & al["low"] & ti["high"],
density["higher"],
)
rule52 = ctrl.Rule(
temp["average"] & al["low"] & ti["high"],
density["high"],
)
rule53 = ctrl.Rule(
temp["high"] & al["low"] & ti["high"],
density["high"],
)
Создание нечеткой системы¶
In [10]:
fuzzy_rules = [
rule11,
rule12,
rule13,
rule21,
rule22,
rule23,
rule31,
rule32,
rule33,
rule41,
rule42,
rule43,
rule51,
rule52,
rule53,
]
density_cntrl = ctrl.ControlSystem(fuzzy_rules)
sim = ctrl.ControlSystemSimulation(density_cntrl)
fuzzy_rules
Out[10]:
Пример использования полученной нечеткой системы¶
In [11]:
sim.input["temp"] = 20
sim.input["al"] = 0.3
sim.input["ti"] = 0.0
sim.compute()
sim.print_state()
display(sim.output["density"])
Функция для автоматизации вычисления целевой переменной Y на основе вектора признаков X¶
In [12]:
def fuzzy_pred(row):
sim.input["temp"] = row["T"]
sim.input["al"] = row["Al2O3"]
sim.input["ti"] = row["TiO2"]
sim.compute()
return sim.output["density"]
Тестирование нечеткой системы на обучающей выборке¶
In [14]:
result_train = density_train.copy()
result_train["DensityPred"] = result_train.apply(fuzzy_pred, axis=1)
result_train.head(15)
Out[14]:
Тестирование нечеткой системы на тестовой выборке¶
In [15]:
result_test = density_test.copy()
result_test["DensityPred"] = result_test.apply(fuzzy_pred, axis=1)
result_test
Out[15]:
Оценка результатов на основе метрик для задачи регрессии¶
In [16]:
import math
from sklearn import metrics
rmetrics = {}
rmetrics["RMSE_train"] = math.sqrt(
metrics.mean_squared_error(result_train["Density"], result_train["DensityPred"])
)
rmetrics["RMSE_test"] = math.sqrt(
metrics.mean_squared_error(result_test["Density"], result_test["DensityPred"])
)
rmetrics["RMAE_test"] = math.sqrt(
metrics.mean_absolute_error(result_test["Density"], result_test["DensityPred"])
)
rmetrics["R2_test"] = metrics.r2_score(
result_test["Density"], result_test["DensityPred"]
)
rmetrics
Out[16]: