405 KiB
Начало лабораторной работы №7¶
import pandas as pd
df = pd.read_csv("..//static//csv//ndtv_data_final.csv")
print(df.columns)
display(df.head())
Создание лингвистических переменных
Входные переменные: Battery capacity (mAh) (емкость батареи) и RAM (MB) (объем оперативной памяти).
Выходная переменная: Price (цена).
import numpy as np
from skfuzzy import control as ctrl
data = pd.read_csv("..//static//csv//ndtv_data_final.csv")
# Инициализация лингвистических переменных
battery_capacity = ctrl.Antecedent(np.arange(data['Battery capacity (mAh)'].min(), data['Battery capacity (mAh)'].max(), 100), "battery_capacity")
ram = ctrl.Antecedent(np.arange(data['RAM (MB)'].min(), data['RAM (MB)'].max(), 100), "ram")
price = ctrl.Consequent(np.arange(data['Price'].min(), data['Price'].max(), 10), "price")
Формирование нечетких переменных для лингвистических переменных и их визуализация
import skfuzzy as fuzz
battery_capacity['low'] = fuzz.zmf(battery_capacity.universe, 2000, 3000)
battery_capacity['average'] = fuzz.trapmf(battery_capacity.universe, [2000, 3000, 4000, 5000])
battery_capacity['high'] = fuzz.smf(battery_capacity.universe, 4000, 5000)
ram['low'] = fuzz.zmf(ram.universe, 1000, 2000)
ram['average'] = fuzz.trapmf(ram.universe, [1000, 2000, 4000, 6000])
ram['high'] = fuzz.smf(ram.universe, 4000, 6000)
price['low'] = fuzz.zmf(price.universe, 10000, 20000)
price['average'] = fuzz.trapmf(price.universe, [10000, 20000, 40000, 60000])
price['high'] = fuzz.smf(price.universe, 40000, 60000)
battery_capacity.view()
ram.view()
price.view()
Формирование и визуализация базы нечетких правил
# Нечеткие правила
rule1 = ctrl.Rule(battery_capacity["low"] & ram["low"], price["low"])
rule2 = ctrl.Rule(battery_capacity["low"] & ram["average"], price["low"])
rule3 = ctrl.Rule(battery_capacity["low"] & ram["high"], price["average"])
rule4 = ctrl.Rule(battery_capacity["average"] & ram["low"], price["low"])
rule5 = ctrl.Rule(battery_capacity["average"] & ram["average"], price["average"])
rule6 = ctrl.Rule(battery_capacity["average"] & ram["high"], price["high"])
rule7 = ctrl.Rule(battery_capacity["high"] & ram["low"], price["average"])
rule8 = ctrl.Rule(battery_capacity["high"] & ram["average"], price["high"])
rule9 = ctrl.Rule(battery_capacity["high"] & ram["high"], price["high"])
rule1.view()
Создание нечеткой системы и добавление нечетких правил в базу знаний нечеткой системы
price_ctrl = ctrl.ControlSystem(
[
rule1,
rule2,
rule3,
rule4,
rule5,
rule6,
rule7,
rule8,
rule9,
]
)
# Создание симулятора нечеткой системы
price_sim = ctrl.ControlSystemSimulation(price_ctrl)
Пример расчета выходной переменной influx на основе входных переменных level и flow
Система также формирует подробный журнал выполнения процесса нечеткого логического вывода
price_sim.input['battery_capacity'] = 4000
price_sim.input['ram'] = 2000
price_sim.compute()
price_sim.print_state()
price_sim.output["price"]
Визуализация функции принадлежности для выходной переменной influx / Функция получена в процессе аккумуляции и используется для дефаззификации значения выходной переменной influx
price.view(sim=price_sim)
Пример решения задачи регрессии на основе нечеткого логического вывода¶
Загрузка данных
import pandas as pd
data_train = pd.read_csv("..//static//csv//ndtv_data_final.csv", sep=",")
data_test = pd.read_csv("..//static//csv//ndtv_data_final.csv", sep=",")
display(data_train.head(3))
display(data_test.head(3))
Инициализация лингвистических переменных и автоматическое формирование нечетких переменных
data = pd.read_csv("..//static//csv//ndtv_data_final.csv")
# Инициализация нечетких переменных
battery_capacity = ctrl.Antecedent(data["Battery capacity (mAh)"].sort_values().unique(), "battery_capacity")
ram = ctrl.Antecedent(data["RAM (MB)"].sort_values().unique(), "ram")
price = ctrl.Consequent(np.arange(0, 100001, 1000), "price")
battery_capacity.automf(3, variable_type="quant")
battery_capacity.view()
ram.automf(3, variable_type="quant")
ram.view()
price.automf(5, variable_type="quant")
price.view()
Нечеткие правила
rule1 = ctrl.Rule(
battery_capacity["low"] & ram["low"],
price["low"],
)
rule2 = ctrl.Rule(
battery_capacity["average"] & ram["low"],
price["low"],
)
rule3 = ctrl.Rule(
battery_capacity["high"] & ram["low"],
price["average"],
)
rule4 = ctrl.Rule(
battery_capacity["low"] & ram["average"],
price["low"],
)
rule5 = ctrl.Rule(
battery_capacity["average"] & ram["average"],
price["average"],
)
rule6 = ctrl.Rule(
battery_capacity["high"] & ram["average"],
price["high"],
)
rule7 = ctrl.Rule(
battery_capacity["low"] & ram["high"],
price["average"],
)
rule8 = ctrl.Rule(
battery_capacity["average"] & ram["high"],
price["high"],
)
rule9 = ctrl.Rule(
battery_capacity["high"] & ram["high"],
price["high"],
)
Создание нечеткой системы
fuzzy_rules = [
rule1,
rule2,
rule3,
rule4,
rule5,
rule6,
rule7,
rule8,
rule9,
]
price_cntrl = ctrl.ControlSystem(fuzzy_rules)
sim = ctrl.ControlSystemSimulation(price_cntrl)
fuzzy_rules
Пример использования полученной нечеткой системы
example_row = data.iloc[3] # Используем строку в качестве примера
sim.input["battery_capacity"] = example_row["Battery capacity (mAh)"]
sim.input["ram"] = example_row["RAM (MB)"]
sim.compute()
sim.print_state()
display(sim.output["price"])
Функция для автоматизации вычисления целевой переменной Y на основе вектора признаков X
print(data_train.columns)
def fuzzy_pred(row):
sim.input["battery_capacity"] = row["Battery capacity (mAh)"]
sim.input["ram"] = row["RAM (MB)"]
sim.compute()
return sim.output["price"]
Тестирование нечеткой системы на обучающей выборке
result_train = data_train.copy()
result_train["Predicted Price"] = result_train.apply(fuzzy_pred, axis=1)
result_train.head(15)
Тестирование нечеткой системы на тестовой выборке
result_test = data_test.copy()
result_test["Predicted Price"] = result_test.apply(fuzzy_pred, axis=1)
result_test
Оценка результатов на основе метрик для задачи регрессии
import math
from sklearn import metrics
rmetrics = {}
rmetrics["RMSE_train"] = math.sqrt(
metrics.mean_squared_error(result_train["Price"], result_train["Predicted Price"])
)
rmetrics["RMSE_test"] = math.sqrt(
metrics.mean_squared_error(result_test["Price"], result_test["Predicted Price"])
)
rmetrics["RMAE_test"] = math.sqrt(
metrics.mean_absolute_error(result_test["Price"], result_test["Predicted Price"])
)
rmetrics["R2_test"] = metrics.r2_score(
result_test["Price"], result_test["Predicted Price"]
)
rmetrics