219 lines
123 KiB
Plaintext
Raw Normal View History

2025-03-01 09:55:06 +04:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"from pandas import DataFrame\n",
"import numpy as np\n",
"import skfuzzy as fuzz\n",
"import matplotlib.pyplot as plt\n",
"\n",
"df: DataFrame = pd.read_csv(\".//static//csv//Yamana_Gold_Inc._AUY.csv\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Формирование базы нечетких правил\n",
"Сформируем базу нечетких правил, которые связывают входные и выходные переменные."
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 800x900 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Определение диапазонов значений для входных переменных\n",
"x_high = np.linspace(0, 30, 100)\n",
"x_open = np.linspace(0, 30, 100)\n",
"x_volume = np.linspace(0, 20000000, 100)\n",
"\n",
"# Определение функций принадлежности для high\n",
"high_low = fuzz.trapmf(x_high, [0, 0, 4, 9.005])\n",
"high_medium = fuzz.trimf(x_high, [9, 13, 16.05])\n",
"high_high = fuzz.smf(x_high, 16, 25)\n",
"\n",
"# Определение функций принадлежности для Open\n",
"open_low = fuzz.trapmf(x_open, [0, 0, 4, 9.005])\n",
"open_medium = fuzz.trimf(x_open, [9, 13, 16.05])\n",
"open_high = fuzz.smf(x_open, 16, 25)\n",
"\n",
"# Определение функций принадлежности для Value\n",
"volume_low = fuzz.trapmf(x_volume, [0, 0, 50000, 800050])\n",
"volume_medium = fuzz.trimf(x_volume, [800000, 3000000, 8500050])\n",
"volume_high = fuzz.smf(x_volume, 8500000, 20000000)\n",
"\n",
"# Определение нечетких правил\n",
"fuzzy_rules = [\n",
" (\"Низкий\", \"Мало\", \"Низкий\"),\n",
" (\"Низкий\", \"Средне\", \"Средний\"),\n",
" (\"Низкий\", \"Много\", \"Высокий\"),\n",
" (\"Средний\", \"Мало\", \"Средний\"),\n",
" (\"Средний\", \"Средне\", \"Высокий\"),\n",
" (\"Средний\", \"Много\", \"Высокий\"),\n",
" (\"Высокий\", \"Мало\", \"Высокий\"),\n",
" (\"Высокий\", \"Средне\", \"Высокий\"),\n",
" (\"Высокий\", \"Много\", \"Высокий\")\n",
"]\n",
"\n",
"# Визуализация функций принадлежности\n",
"fig, (ax0, ax1, ax2) = plt.subplots(nrows=3, figsize=(8, 9))\n",
"\n",
"ax0.plot(x_high, high_low, 'b', linewidth=1.5, label='Низкий')\n",
"ax0.plot(x_high, high_medium, 'g', linewidth=1.5, label='Средний')\n",
"ax0.plot(x_high, high_high, 'r', linewidth=1.5, label='Высокий')\n",
"ax0.set_title('Функции принадлежности для Hight')\n",
"ax0.legend()\n",
"\n",
"ax1.plot(x_open, open_low, 'b', linewidth=1.5, label='Мало')\n",
"ax1.plot(x_open, open_medium, 'g', linewidth=1.5, label='Средне')\n",
"ax1.plot(x_open, open_high, 'r', linewidth=1.5, label='Много')\n",
"ax1.set_title('Функции принадлежности для Open')\n",
"ax1.legend()\n",
"\n",
"ax2.plot(x_volume, volume_low, 'b', linewidth=1.5, label='Низкий')\n",
"ax2.plot(x_volume, volume_medium, 'g', linewidth=1.5, label='Средний')\n",
"ax2.plot(x_volume, volume_high, 'r', linewidth=1.5, label='Высокий')\n",
"ax2.set_title('Функции принадлежности для Value')\n",
"ax2.legend() \n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## База нечётких правил\n",
"\n",
"\n",
"\n",
"\n",
"Для оценки качества системы создадим тестовые данные и применим нечеткие правила для получения предсказанных значений. Затем сравним их с реальными значениями."
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"High | Open | Value | Оцененная Value\n",
"10.26 | 10.39 | 10532700 | 4408286.95\n",
"3.65 | 3.75 | 581100 | 271034.51\n",
"3.74 | 3.89 | 522100 | 271034.51\n",
"3.94 | 3.95 | 427100 | 271039.24\n",
"3.65 | 3.68 | 383500 | 271034.51\n",
"\n",
"Средняя абсолютная ошибка (MAE): 1390814.06\n",
"Среднеквадратичная ошибка (RMSE): 2746074.04\n"
]
}
],
"source": [
"# Функция для вычисления нечеткой оценки\n",
"def fuzzy_inference(high, open):\n",
" # Определение степени принадлежности\n",
" high_low_degree = fuzz.interp_membership(x_high, high_low, high)\n",
" high_medium_degree = fuzz.interp_membership(x_high, high_medium, high)\n",
" high_high_degree = fuzz.interp_membership(x_high, high_high, high)\n",
"\n",
" open_low_degree = fuzz.interp_membership(x_open, open_low, open)\n",
" open_medium_degree = fuzz.interp_membership(x_open, open_medium, open)\n",
" open_high_degree = fuzz.interp_membership(x_open, open_high, open)\n",
"\n",
" # Применяем правила\n",
" # Активируем термы выходной переменной с использованием степени принадлежности\n",
" volume_low_activated = np.fmin(high_low_degree, volume_low)\n",
" volume_medium_activated = np.fmin(high_medium_degree, volume_medium)\n",
" volume_high_activated = np.fmin(high_high_degree, volume_high)\n",
"\n",
" # Агрегируем все активированные термы\n",
" aggregated = np.fmax(volume_low_activated, np.fmax(volume_medium_activated, volume_high_activated))\n",
"\n",
" # Дефуззификация\n",
" volume_defuzz = fuzz.defuzz(x_volume, aggregated, 'centroid')\n",
"\n",
" return volume_defuzz\n",
"\n",
"# Оценка системы на тестовом наборе данных\n",
"results = []\n",
"test_data = [\n",
" (10.26, 10.39, 10532700),\n",
" (3.65, 3.75, 581100),\n",
" (3.74, 3.89, 522100),\n",
" (3.94, 3.95, 427100),\n",
" (3.65, 3.68, 383500),\n",
"]\n",
"for high, open, actual_volume in test_data:\n",
" inferred_volume = fuzzy_inference(high, open)\n",
" results.append((high, open, actual_volume, inferred_volume))\n",
"\n",
"# Вывод результатов\n",
"print(\"High | Open | Value | Оцененная Value\")\n",
"for high, open, actual_volume, inferred_volume in results:\n",
" print(f\"{high:4} | {open:6} | {actual_volume:15} | {inferred_volume:.2f}\")\n",
"\n",
"# Вычисление метрик качества\n",
"actual_volumes = [actual for _, _, actual, _ in results]\n",
"inferred_volumes = [inferred for _, _, _, inferred in results]\n",
"\n",
"mae = np.mean(np.abs(np.array(actual_volumes) - np.array(inferred_volumes)))\n",
"rmse = np.sqrt(np.mean((np.array(actual_volumes) - np.array(inferred_volumes)) ** 2))\n",
"\n",
"print(f\"\\nСредняя абсолютная ошибка (MAE): {mae:.2f}\")\n",
"print(f\"Среднеквадратичная ошибка (RMSE): {rmse:.2f}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"В результате выполнения лабораторной работы была создана нечеткая система, которая позволяет оценивать общую стоимость транзакции на основе открытия золота и количества продаж золота. Система была протестирована на тестовых данных, и были вычислены метрики качества (MAE и RMSE). Полученные результаты указывают на необходимость дальнейшей настройки системы для повышения точности предсказаний."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "aisenv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}