501 lines
340 KiB
Plaintext
Raw Permalink Normal View History

2025-02-09 22:37:05 +04:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Начало 1-й лабораторной работы по мии в этом семаке, еее "
2025-02-09 22:37:05 +04:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Перечислим атрибуты датасета\n",
2025-02-09 22:37:05 +04:00
"\n",
"name - Название или обозначение астероида.\n",
"\n",
"absolute_magnitude - Абсолютная звездная величина астероида.\n",
"\n",
"estimated_diameter_min - Минимальный оценочный диаметр астероида (в километрах).\n",
"\n",
"estimated_diameter_max - Максимальный оценочный диаметр астероида (в километрах).\n",
"\n",
"hazardous - Является ли астероид потенциально опасным.\n",
"\n",
"relative_velocity - Относительная скорость астероида по отношению к Земле (в километрах в секунду).\n",
"\n",
"miss_distance - Расстояние между Землёй и астероидом в момент его максимального сближения.\n",
"\n",
"orbiting_body - Центральное небесное тело, вокруг которого движется астероид.\n",
"\n",
"sentry_object - Указывает, отслеживается ли данный объект системой мониторинга NASA Sentry."
2025-02-09 22:37:05 +04:00
]
},
{
"cell_type": "code",
"execution_count": 2,
2025-02-09 22:37:05 +04:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" id name est_diameter_min est_diameter_max \\\n",
"0 2162635 162635 (2000 SS164) 1.198271 2.679415 \n",
"1 2277475 277475 (2005 WK4) 0.265800 0.594347 \n",
"2 2512244 512244 (2015 YE18) 0.722030 1.614507 \n",
"3 3596030 (2012 BV13) 0.096506 0.215794 \n",
"4 3667127 (2014 GE35) 0.255009 0.570217 \n",
"\n",
" relative_velocity miss_distance orbiting_body sentry_object \\\n",
"0 13569.249224 5.483974e+07 Earth False \n",
"1 73588.726663 6.143813e+07 Earth False \n",
"2 114258.692129 4.979872e+07 Earth False \n",
"3 24764.303138 2.543497e+07 Earth False \n",
"4 42737.733765 4.627557e+07 Earth False \n",
"\n",
" absolute_magnitude hazardous \n",
"0 16.73 False \n",
"1 20.00 True \n",
"2 17.83 False \n",
"3 22.20 False \n",
"4 20.09 True \n"
]
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"from scipy.cluster.hierarchy import dendrogram, linkage, fcluster\n",
"from sklearn.cluster import KMeans\n",
"from sklearn.decomposition import PCA\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.metrics import silhouette_score\n",
"\n",
"df = pd.read_csv(\".//static//csv//neo.csv\")\n",
"df = df.head(30000)\n",
2025-02-09 22:37:05 +04:00
"print(df.head())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Выбирем входные и выходные переменные\n",
2025-02-09 22:37:05 +04:00
"\n",
"* Входные переменные - переменные-факторы, влияющие на целевую переменную\n",
"* Выходная переменная - целевая перменная, для которой будет строиться нечеткая система\n",
"\n",
"Применительно к нашей задаче:\n",
"\n",
"* Входные переменные: estimated_diameter_max(максимальный оценочный диаметр астреоида) и relative_velocity(скорость относительно Земли)\n",
"* Выходные переменные: miss_distance(минимальное расстояние до Земли)"
2025-02-09 22:37:05 +04:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Настроим параметры лингвистических переменных"
2025-02-09 22:37:05 +04:00
]
},
{
"cell_type": "markdown",
2025-02-09 22:37:05 +04:00
"metadata": {},
"source": [
"##### 1. Термы (нечеткие термы)\n",
"Термы — лингвистические значения, которые описывают возможные состояния нечеткой переменной. Они используются для качественного описания значений переменной, например:\n",
2025-02-09 22:37:05 +04:00
"\n",
"* Для переменной \"Температура\" термы могут быть: \"холодно\", \"тепло\", \"горячо\".\n",
"* Для переменной \"Скорость\" термы могут быть: \"медленно\", \"средне\", \"быстро\".\n",
2025-02-09 22:37:05 +04:00
"\n",
"Каждый терм связан с функцией принадлежности, которая определяет, насколько значение переменной соответствует этому терму.\n",
2025-02-09 22:37:05 +04:00
"\n",
"##### 2. Функция принадлежности\n",
"Функция принадлежности (membership function) — математическая функция, которая определяет степень принадлежности элемента к нечеткому множеству. Она возвращает значение от 0 до 1, где:\n",
2025-02-09 22:37:05 +04:00
"\n",
"* 0 — элемент точно не принадлежит множеству.\n",
2025-02-09 22:37:05 +04:00
"\n",
"* 1 — элемент точно принадлежит множеству.\n",
2025-02-09 22:37:05 +04:00
"\n",
"Значения между 0 и 1 — частичная принадлежность.\n",
"\n",
"Функция принадлежности задается для каждого терма.\n",
"\n",
"##### 3. Параметры функции принадлежности\n",
"Параметры функции принадлежности — числа, которые определяют форму и положение функции на числовой оси. Форма функции зависит от выбранного типа (например, треугольная, трапециевидная, гауссова). \n",
"\n",
"##### В нашем случае:\n",
"\n",
"Термы: \n",
"* Маленький (Small) \n",
"* Средний (Medium) \n",
"* Большой (Large)\n",
"\n",
"Параметры:\n",
"\n",
"Маленький (Small):\n",
"* Нижняя граница: 0 \n",
"* Средняя граница: 250 \n",
"* Верхняя граница: 500\n",
"\n",
"Средний (Medium): \n",
"* Нижняя граница: 400\n",
"* Средняя граница: 1000\n",
"* Верхняя граница: 2000\n",
"\n",
"Большой (Large): \n",
"* Нижняя граница: 1800\n",
"* Средняя граница: 5000\n",
"* Верхняя граница: 10000"
2025-02-09 22:37:05 +04:00
]
},
{
"cell_type": "code",
"execution_count": 8,
2025-02-09 22:37:05 +04:00
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
2025-02-09 22:37:05 +04:00
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
2025-02-09 22:37:05 +04:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import skfuzzy as fuzz\n",
2025-02-09 22:37:05 +04:00
"\n",
"volume_range = np.arange(0, 10000, 1)\n",
2025-02-09 22:37:05 +04:00
"\n",
"# Определение функций принадлежности для термов\n",
2025-02-09 22:37:05 +04:00
"\n",
"small = fuzz.trapmf(volume_range, [500, 500, 1500, 2500])\n",
"\n",
"medium = fuzz.trimf(volume_range, [2000, 3000, 5000])\n",
"\n",
"large = fuzz.trapmf(volume_range, [4500, 7500, 10000, 10000])\n",
"\n",
"# Визуализация функций принадлежности\n",
"plt.figure(figsize=(10, 6))\n",
"plt.plot(volume_range, small, label='Маленький (Small)', color='blue')\n",
"plt.plot(volume_range, medium, label='Средний (Medium)', color='orange')\n",
"plt.plot(volume_range, large, label='Большой (Large)', color='green')\n",
"plt.title('Функции принадлежности для максимального оценочного диаметра астероида')\n",
"plt.xlabel('Максимальный оценочный диаметр астероида')\n",
"plt.ylabel('Принадлежность')\n",
"plt.ylim(-0.1, 1.1)\n",
"plt.axhline(0, color='black', lw=0.5)\n",
"plt.axvline(0, color='black', lw=0.5)\n",
"plt.legend()\n",
"plt.grid()\n",
2025-02-09 22:37:05 +04:00
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Формируем базу нечетких правил"
2025-02-09 22:37:05 +04:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Нечеткие правила (fuzzy rules) — основа нечетких систем вывода, которые используются для моделирования сложных, нечетко определенных процессов. Эти правила позволяют описать взаимосвязь между входными и выходными переменными в терминах лингвистических значений (термов)."
2025-02-09 22:37:05 +04:00
]
},
{
"cell_type": "code",
"execution_count": 12,
2025-02-09 22:37:05 +04:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Нечеткие правила:\n",
"Если Цена открытия Низкая И Объем Низкий, Тогда Цена закрытия Низкая.\n",
"Если Цена открытия Низкая И Объем Средний, Тогда Цена закрытия Средняя.\n",
"Если Цена открытия Низкая И Объем Высокий, Тогда Цена закрытия Средняя.\n",
"Если Цена открытия Средняя И Объем Низкий, Тогда Цена закрытия Средняя.\n",
"Если Цена открытия Средняя И Объем Средний, Тогда Цена закрытия Высокая.\n",
"Если Цена открытия Средняя И Объем Высокий, Тогда Цена закрытия Высокая.\n",
"Если Цена открытия Высокая И Объем Низкий, Тогда Цена закрытия Средняя.\n",
"Если Цена открытия Высокая И Объем Средний, Тогда Цена закрытия Высокая.\n",
"Если Цена открытия Высокая И Объем Высокий, Тогда Цена закрытия Высокая.\n"
2025-02-09 22:37:05 +04:00
]
},
{
"data": {
"image/png": "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S8XZ2Vl56qmnjP52UVFRCqDMnj070+PXqlXL6Lk+ePBASUlJMTrmzp07ir+/v/LKK69kOv/rr79WAOXw4cOGfZ07d8702lEURUlLS1MAZcqUKZmeb1RUlKIoinLhwgXF3t5emTZtmtG5J06cUBwcHDLtj4iIUHx8fJQXX3xRURRFCQ0NVfT/7o4cOaK4u7srw4YNyxRLq1atlFq1amXaP3v2bKN4bt68qTg5OSnt2rVT0tPTDcd98cUXCqAsXbpUURRduVWqVEmpWLGicufOHaNr6l/zj8rptWPq3zYnZ86cUQBlzpw52T6/jFq0aKE89dRThtv6182yZcsM+55//nnF29tbSUpKMuzL6fWdlebNmyu1a9c23M7v+9PU16z++Tz//POKg4ODEh0dbbjvmWeeUV544YVM75PBgwcrZcuWzfS/5rnnnlNKlCihJCYmZnp+AwYMyPZvpH99duvWzWj/m2++qQDKsWPHDPuyunb79u2VypUrZ3ltYVnSPCfMcv/+ffz8/HI9zt/fH9B92wOoXr06TZs25fvvvzccExsby6+//kr//v0z1ZLcv3+fmJgYo5/sJCcn061bN27dusXWrVspVapUXp5alq5evcr8+fOZNGlSriMEN2zYwKFDh5g5c6bFHv9Rr732mqEGA+CNN97I1MSUUWJiIh9++CHDhw+nQoUK2R7zaFmnp6cbHWNvb2/on6bVaomNjeXBgwc0btyYf//9N9M19d/OXVxccn1OqampAFnWCOlt2LABrVZLv379jOIsU6YM1apVy9TkUr16ddavX8/333/PRx99ZNh//fp1unbtSrNmzQzNY49KT0/PVB6JiYlGx/z++++kpqYyatQo7Owe/hsdMmQIXl5ebN68GYAjR44QFRXFqFGj8Pb2NrpGdjWDpjLlb5sVc/42oPv75PS3Ad371c3NzeRrZheXuefn9P409zXbsGFDatWqZagdunjxIn/88Uem5lBFUVi/fj1du3ZFURSj10n79u25d+9eltc3xaM1RW+99RaA0fvb1dXVsH3v3j1iYmJo1aoV58+f5969e3l6XGE6SZqEWQICAjh37lyux0VGRgJQrlw5w76XX36Zffv2cfHiRUDXFyMtLY2XXnop0/mvvPIKpUuXNvpJSEjI8rEGDRrE3r17uX//vqEfk6WEhoYSEBBg6HOVnfT0dN577z369++fqcrdkqpVq2Z028PDg7Jly2bZFwVg7ty5JCcn895772V7zdDQ0Exlffr06UzHrVixgrp16+Li4kKpUqUoXbo0mzdvzvIftT7JLVGiRK7PSd8HKKek9OzZsyiKQrVq1TLFGh4ezs2bNzOdc+vWLRRFYfLkyYYkpnv37ly5ciXL4/VOnz6d6TFCQ0ONjtG/hmvUqGG038nJicqVKxvu179XsuonlV+m/G2zYs7fBnR/n9y+MDRr1oxr167xwQcfcOnSJWJiYsz+AI+JiTE5Jr3c3p/mvGZB979k2bJlgK5fXvPmzTO9527dusXdu3f5+uuvM71OBg0aBJDj6ysnjz5WlSpVsLOzM3p/79u3jzZt2uDu7o63tzelS5c2vAYkabI+6dMkzNKlSxcWLFjAN998w+DBg7M85saNG6xYsYLSpUvz+OOPG/Y/99xzjB49mu+//5733nuPlStX0rhx40wfPAC
2025-02-09 22:37:05 +04:00
"text/plain": [
"<Figure size 600x1200 with 3 Axes>"
2025-02-09 22:37:05 +04:00
]
},
"metadata": {},
"output_type": "display_data"
},
2025-02-09 22:37:05 +04:00
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeXxcVf3/8de95947SdqkW7rSQtlE2REVAZFFoKwKLgio7HwVwS+LX5VNKiCgLAIii4iACgWEXwUVBMrSvbRQKFsp3dI2SZfsyewz997z+yNtbNq0zTa5c2c+z8cj0MzcmfueZDL3fu7ZDK21RgghhBBCCCGEEP3ODDqAEEIIIYQQQghRqKToFkIIIYQQQgghckSKbiGEEEIIIYQQIkek6BZCCCGEEEIIIXJEim4hhBBCCCGEECJHpOgWQgghhBBCCCFyRIpuIYQQQgghhBAiR6ToFkIIIYQQQgghckSKbiGEEEIIIYQQIkek6BZCCCGEEEIIIXJEim4hhChCjz/+OIZhdPoaNWoURx99NP/5z3+CjieEEEIIUTCsoAMIIYQIzk033cSuu+6K1poNGzbw+OOPc9JJJ/Gvf/2LU045Jeh4QgghhBChJ0W3EEIUsRNPPJEvfOELHd9feOGFjB49mqeeekqKbiGEEEKIfiDdy4UQQnQYOnQopaWlWNZ/r8muWrUKwzB4/PHHO2176aWXYhgG5513XsdtU6dO5Utf+hLDhw+ntLSUz372s/z2t79Faw3Am2++iWEY/OMf/9hq31OmTMEwDObNmwfABx98wHnnncduu+1GSUkJY8aM4YILLqCxsbHL7BMnTtyqy7xhGEyfPr3TNpvnBXj22WcxDIOJEyd23Pbpp59yzDHHMGbMGCKRCBMmTOBHP/oRTU1NHdtkMhluuOEGDj74YIYMGcKgQYM44ogjePPNNzs9/6af35133rlV5n333Zejjjqq021HHXXUVre9/fbbHa9nc7FYjJ/+9Kfstttu2Lbd6XU3NDR0+XPafD/77rvvVrffeeedGIbBqlWrOt3+n//8hyOOOIJBgwZRXl7OySefzMcff9xpm65+vtOnT9/q9wAwf/58TjjhBIYMGUJZWRlHHnkkc+bM6bj/V7/6VZe/z65+t139zG655RZM02TKlCmdXnN3fraPPfYYhmHw6KOPdtr21ltvxTAMXnrppa1+blv+HLaXe3OGYXDZZZfx5JNPstdee1FSUsLBBx/MzJkzO223evVqfvzjH7PXXntRWlrKiBEj+M53vrPV72nLoSNlZWXst99+PPLII522O++88zq95wGqq6spLS3t8ve/6fe45deWzyGEEGJr0tIthBBFrLW1lYaGBrTW1NXVcd999xGLxfj+97+/3cctX76cP/3pT1vd3tbWxiGHHMK5556Lbdu8/PLLXH311ViWxU9/+lOOOuooJkyYwJNPPsnpp5/e6bFPPvkku+++O4ceeigA06ZNY+XKlZx//vmMGTOGjz/+mIcffpiPP/6Yt956a6viBeCII47gf/7nfwD45JNPuPXWW7f7OlzX5brrrtvq9ng8zvjx4zn11FOpqKjgo48+4v7776e2tpZ//etfHa/1kUce4ayzzuLiiy8mGo3y5z//mUmTJrFgwQIOPPDA7e67J37xi190efvPfvYzHnroIS688EIOP/xwbNtm6tSpXV7U6Iu//e1vnHvuuUyaNInf/va3JBIJHnzwQb7yla/w3nvv9bjweuONNzjxxBM5+OCDmTx5MqZp8thjj3HMMccwa9YsvvSlL/HNb36TPfbYo+MxV155JZ/73Oc6fr8An/vc57p8/scee4zrr7+eu+66i7PPPnu7Wbr62Z5//vlMnTqVq666iuOOO44JEybw4YcfcuONN3LhhRdy0kkn7fA1Hnjggfz0pz/tdNtf//pXpk2bttW2M2bM4JlnnuF///d/iUQiPPDAA5xwwgksWLCg48LI22+/zdy5cznzzDMZP348q1at4sEHH+Soo45i8eLFlJWVdXrOu+++m8rKStra2nj00Ue5+OKLmThxIscee+w2M99www2kUqntvq5rr7224+f+8MMPs2bNmh3+LIQQouhpIYQQReexxx7TwFZfkUhEP/744522raqq0oB+7LHHOm4744wz9L777qsnTJigzz333O3ua++999annHJKx/fXXHONjkQiuqWlpeO2uro6bVmWnjx5csdtiURiq+d66qmnNKBnzpy51X077bSTPv/88zu+f/PNNzWg33zzzY7bdtlll055H3jgAR2JRPTRRx+td9lll+2+jh//+Md68ODBHd+7rqvT6XSnbZqbm/Xo0aP1BRdc0HHbpp/fHXfcsdVz7rPPPvrII4/sdNuRRx7Z6baXXnpJA/qEE07QWx62x44dqydNmtTptsmTJ2tA19fXb/f1HHnkkXqfffbZ6vY77rhDA7qqqkprrXU0GtVDhw7VF198caft1q9fr4cMGdLp9l133VWfc845nbbb8vfg+77ec8899aRJk7Tv+x3bJRIJveuuu+rjjjuuy7xb/u62fC2bfmYvvviitixL//SnP93udlpv/2e7bt06PXz4cH3cccfpdDqtDzroIL3zzjvr1tbWLjNsmfXkk0/e6vZLL710q/1s+tt75513Om5bvXq1Likp0aeffnrHbV39PcybN08D+q9//WvHbZv+tjf9/rTWeunSpRrQt99+e8dt5557bqf3/EcffaRN09QnnnjiVo/XWutp06ZpQM+YMWObzyGEEKJr0r1cCCGK2P3338+0adOYNm0aTzzxBEcffTQXXXQRU6dO3eZjFi5cyLPPPsttt92GaXZ9GGloaKCmpobHH3+c5cuX89WvfrXjvnPOOYd0Os1zzz3XcdszzzyD67qdWthLS0s7/p1KpWhoaODLX/4yAO++++5W+8xkMkQikW6/9kQiwU033cRll13Gzjvv3OU2ra2tbNiwgddff50XX3yx0+tQSuE4DgC+79PU1ITrunzhC1/oMl9vaK255ppr+Na3vsUhhxyy1f3RaJQRI0b0+vk9z6OhoaHTVyKR6LTNtGnTaGlp4ayzzuq0nVKKQw45pFN3+lGjRlFTU7PdfS5atIhly5Zx9tln09jY2PF88Xicr33ta8ycORPf93v1ehYsWMAZZ5zBt771Le64447tbrujn+2YMWM6/j6OOOIIFi1axKOPPkpFRUWvsm3PoYceysEHH9zx/c4778w3vvENXnnlFTzPAzr/PWSzWRobG9ljjz0YOnRol++35uZmGhoaWLlyJXfffTdKKY488shtZrjmmmv4/Oc/z3e+850u789kMgA9+hsTQgjRTrqXCyFEEfvSl77UaSK1s846i4MOOojLLruMU045paOo3NzVV1/NEUccwSmnnMJll1221f2pVIqRI0cC7eNVr732Wn72s5913P/Zz36WL37xizz55JNceOGFQHvX8i9/+cuduhM3NTVx44038vTTT1NXV9dpH62trVvtt7W1lcGDB3f7tf/ud78jlUpx7bXXctVVV3W5zaRJk5g/fz4AJ5xwAs8880yn+//yl79w1113sWTJErLZbMftu+66a7dzbM+TTz7Jxx9/zN///vdOY5M3OfTQQ/nHP/7Bc88919G9fMuieXuWLFnS8bvalmXLlgFwzDHHdHn/5kXoYYcdxu9//3uefvppjjnmGEzT3Op3ten5zj333G3us7W1lWHDhnXrNWxSW1vLySefTDwep7GxscvhB5vb0c8W4Mwzz+SJJ57gxRdf5H/+53/42te+1qNM3bXnnntuddtnPvMZEokE9fX1jBkzhmQyyW233cZjjz1GbW1txzwJ0PXfw+c///mOf0ciEf7whz/wpS99qcv9z549m3/961+8/vrr2+wu3tLSAtCjvzEhhBDtpOgWQgjRwTRNjj76aO69916WLVvGPvvs0+n+V199lddee61jsrOuOI7DtGnTSCQSzJo1i9/+9rdMmDCBH/7whx3bnHPOOVx++eXU1NSQTqd56623+MMf/tDpec444wzmzp3Lz372Mw488EAGDx6M7/uccMIJW7WENjU
2025-02-09 22:37:05 +04:00
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
2025-02-09 22:37:05 +04:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import skfuzzy as fuzz\n",
"import matplotlib.pyplot as plt\n",
2025-02-09 22:37:05 +04:00
"\n",
"# Определяем диапазоны значений для входных переменных\n",
"x_diameter = np.linspace(0, 10000, 100) \n",
"x_velocity = np.arange(0, 40, 1) \n",
"x_distance = np.linspace(0, 50000000, 100) \n",
"\n",
"# Определение функций принадлежности для диаметра\n",
"low_diameter = fuzz.trapmf(x_diameter, [500, 500, 1500, 2500])\n",
"medium_diameter = fuzz.trimf(x_diameter, [2000, 3000, 5000])\n",
"high_diameter = fuzz.trapmf(x_diameter, [4500, 7500, 10000, 10000])\n",
"\n",
"# Определение функций принадлежности для скорости\n",
"low_velocity = fuzz.trapmf(x_velocity, [0, 0, 5, 10])\n",
"medium_velocity = fuzz.trimf(x_velocity, [10, 15, 20])\n",
"high_velocity = fuzz.trapmf(x_velocity, [18, 25, 40, 40])\n",
"\n",
"# Определение функций принадлежности для цены дистанции\n",
"low_distance = fuzz.trapmf(x_distance, [5000000, 5000000, 15000000, 25000000])\n",
"medium_distance = fuzz.trimf(x_distance, [20000000, 30000000, 50000000])\n",
"high_distance = fuzz.trapmf(x_distance, [45000000, 75000000, 100000000, 100000000])\n",
"\n",
"# Определение нечетких правил\n",
"fuzzy_rules = [\n",
" (\"Низкая\", \"Низкий\", \"Низкая\"),\n",
" (\"Низкая\", \"Средний\", \"Средняя\"),\n",
" (\"Низкая\", \"Высокий\", \"Средняя\"),\n",
" (\"Средняя\", \"Низкий\", \"Средняя\"),\n",
" (\"Средняя\", \"Средний\", \"Высокая\"),\n",
" (\"Средняя\", \"Высокий\", \"Высокая\"),\n",
" (\"Высокая\", \"Низкий\", \"Средняя\"),\n",
" (\"Высокая\", \"Средний\", \"Высокая\"),\n",
" (\"Высокая\", \"Высокий\", \"Высокая\"),\n",
"]\n",
"\n",
"print(\"Нечеткие правила:\")\n",
"for rule in fuzzy_rules:\n",
" print(f\"Если Цена открытия {rule[0]} И Объем {rule[1]}, Тогда Цена закрытия {rule[2]}.\")\n",
"\n",
"# Визуализация функций принадлежности\n",
"fig, axs = plt.subplots(3, 1, figsize=(6, 12))\n",
"\n",
"axs[0].plot(x_diameter, low_diameter, label='Маленький (Small)', color='blue')\n",
"axs[0].plot(x_diameter, medium_diameter, label='Средний (Medium)', color='green')\n",
"axs[0].plot(x_diameter, high_diameter, label='Большой (Large)', color='red')\n",
"axs[0].set_title('Функции принадлежности для диаметра')\n",
"axs[0].set_xlabel('Величина диаметра')\n",
"axs[0].set_ylabel('Степень принадлежности')\n",
"axs[0].legend()\n",
"axs[0].grid()\n",
"\n",
"axs[1].plot(x_velocity, low_velocity, label='Низкая (Low)', color='blue')\n",
"axs[1].plot(x_velocity, medium_velocity, label='Средняя (Medium)', color='orange')\n",
"axs[1].plot(x_velocity, high_velocity, label='Высокая (High)', color='green')\n",
"axs[1].set_title('Функции принадлежности для скорости')\n",
"axs[1].set_xlabel('Величина скорости')\n",
"axs[1].set_ylabel('Степень принадлежности')\n",
"axs[1].legend()\n",
"axs[1].grid()\n",
"\n",
"axs[2].plot(x_distance, low_distance, label='Маленькая', color='blue')\n",
"axs[2].plot(x_distance, medium_distance, label='Средняя', color='green')\n",
"axs[2].plot(x_distance, high_distance, label='Большая', color='red')\n",
"axs[2].set_title('Функции принадлежности для дистанции')\n",
"axs[2].set_xlabel('Величина дистанции')\n",
"axs[2].set_ylabel('Степень принадлежности')\n",
"axs[2].legend()\n",
"axs[2].grid()\n",
2025-02-09 22:37:05 +04:00
"\n",
"plt.tight_layout()\n",
"plt.show()\n",
2025-02-09 22:37:05 +04:00
"\n",
"# Визуализация нечетких правил\n",
"fig, ax = plt.subplots(figsize=(10, 6))\n",
"\n",
"# Пример нечеткого вывода для визуализации\n",
"for rule in fuzzy_rules:\n",
" if rule[0] == \"Низкая\" and rule[1] == \"Низкий\":\n",
" ax.fill_between(x_diameter, low_diameter, low_distance, color='lightblue', alpha=0.5, label='Маленький #1')\n",
" elif rule[0] == \"Низкая\" and rule[1] == \"Средний\":\n",
" ax.fill_between(x_diameter, medium_diameter, medium_distance, color='lightgreen', alpha=0.5, label='Средний #2')\n",
" elif rule[0] == \"Низкая\" and rule[1] == \"Высокий\":\n",
" ax.fill_between(x_diameter, low_diameter, medium_distance, color='lightcoral', alpha=0.5, label='Большой #3')\n",
" elif rule[0] == \"Средняя\" and rule[1] == \"Низкий\":\n",
" ax.fill_between(x_diameter, medium_diameter, medium_distance, color='orange', alpha=0.5, label='Маленький #4')\n",
" elif rule[0] == \"Высокая\" and rule[1] == \"Высокий\":\n",
" ax.fill_between(x_diameter, high_diameter, high_distance, color='salmon', alpha=0.5, label='Большой #5')\n",
"\n",
"ax.set_title('Визуализация нечетких правил')\n",
"ax.set_xlabel('Величина дистанции')\n",
"ax.set_ylabel('Величина диаметра')\n",
"ax.legend()\n",
"ax.grid()\n",
2025-02-09 22:37:05 +04:00
"\n",
"plt.tight_layout()\n",
2025-02-09 22:37:05 +04:00
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Оценим качество полученной нечеткой системы с помощью метрик регрессии"
2025-02-09 22:37:05 +04:00
]
},
{
"cell_type": "code",
"execution_count": 16,
2025-02-09 22:37:05 +04:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Величина диаметра | Величина скорости | Фактическая величина дистанции | Полученная величина дистанции \n",
"============================================================================================\n",
"1500 | 10 | 0 | 0.00 \n",
"5000 | 25 | 40330398 | 48330398.79 \n",
"8000 | 15 | 35000000 | 0.00 \n",
"4000 | 35 | 100000000 | 0.00 \n",
"\n",
"Средняя абсолютная ошибка (MAE): 35750000.20\n",
"Среднеквадратичная ошибка (RMSE): 53124852.97\n"
2025-02-09 22:37:05 +04:00
]
}
],
"source": [
"import numpy as np\n",
"import skfuzzy as fuzz\n",
2025-02-09 22:37:05 +04:00
"import matplotlib.pyplot as plt\n",
"\n",
"# Определяем диапазоны значений для входных переменных\n",
"x_diameter = np.linspace(0, 10000, 100) \n",
"x_velocity = np.arange(0, 40, 1) \n",
"x_distance = np.linspace(0, 50000000, 100) \n",
"\n",
"# Определение функций принадлежности для диаметра\n",
"low_diameter = fuzz.trapmf(x_diameter, [500, 500, 1500, 2500])\n",
"medium_diameter = fuzz.trimf(x_diameter, [2000, 3000, 5000])\n",
"high_diameter = fuzz.trapmf(x_diameter, [4500, 7500, 10000, 10000])\n",
"\n",
"# Определение функций принадлежности для скорости\n",
"low_velocity = fuzz.trapmf(x_velocity, [0, 0, 5, 10])\n",
"medium_velocity = fuzz.trimf(x_velocity, [10, 15, 20])\n",
"high_velocity = fuzz.trapmf(x_velocity, [18, 25, 40, 40])\n",
"\n",
"# Определение функций принадлежности для цены дистанции\n",
"low_distance = fuzz.trapmf(x_distance, [5000000, 5000000, 15000000, 25000000])\n",
"medium_distance = fuzz.trimf(x_distance, [20000000, 30000000, 50000000])\n",
"high_distance = fuzz.trapmf(x_distance, [45000000, 75000000, 100000000, 100000000])\n",
"\n",
"# Создаем тестовые данные\n",
"test_data = [\n",
" (1500, 10, 0),\n",
" (5000, 25, 40330398), \n",
" (8000, 15, 35000000),\n",
" (4000, 35, 100000000), \n",
"]\n",
"\n",
"# Функция для вычисления нечеткой оценки\n",
"def fuzzy_inference(open_price, volume):\n",
" # Определяем степень принадлежности\n",
" open_low = fuzz.interp_membership(x_diameter, low_diameter, open_price)\n",
" open_medium = fuzz.interp_membership(x_diameter, medium_diameter, open_price)\n",
" open_high = fuzz.interp_membership(x_diameter, high_diameter, open_price)\n",
"\n",
" volume_low = fuzz.interp_membership(x_velocity, low_velocity, volume)\n",
" volume_medium = fuzz.interp_membership(x_velocity, medium_velocity, volume)\n",
" volume_high = fuzz.interp_membership(x_velocity, high_velocity, volume)\n",
"\n",
" # Применяем правила\n",
" close_low = np.fmin(open_low, volume_low)\n",
" close_medium = np.fmin(open_medium, volume_medium)\n",
" close_high = np.fmin(open_high, volume_high)\n",
"\n",
" # Вычисление выходных значений с учетом ненулевых областей\n",
" close0 = fuzz.defuzz(x_distance, low_distance * close_low, 'centroid') if close_low > 0 else 0\n",
" close1 = fuzz.defuzz(x_distance, medium_distance * close_medium, 'centroid') if close_medium > 0 else 0\n",
" close2 = fuzz.defuzz(x_distance, high_distance * close_high, 'centroid') if close_high > 0 else 0\n",
"\n",
" return max(close0, close1, close2)\n",
"\n",
"# Список для хранения результатов\n",
"results = []\n",
"\n",
"# Оценка системы на тестовом наборе данных\n",
"for open_price, volume, actual_close in test_data:\n",
" inferred_close = fuzzy_inference(open_price, volume)\n",
" results.append((open_price, volume, actual_close, inferred_close))\n",
"\n",
"# Вывод результатов с более структурированным оформлением\n",
"print(f\"{'Величина диаметра':<18} | {'Величина скорости':<10} | {'Фактическая величина дистанции':<30} | {'Полученная величина дистанции':<30}\")\n",
"print(\"=\" * 92) # Строка-разделитель\n",
"\n",
"for open_price, volume, actual_close, inferred_close in results:\n",
" print(f\"{open_price:<18} | {volume:<10} | {actual_close:<30} | {inferred_close:<30.2f}\")\n",
"\n",
"# Вычисление метрик качества\n",
"actual_closes = [actual for _, _, actual, _ in results]\n",
"inferred_closes = [inferred for _, _, _, inferred in results]\n",
"\n",
"mae = np.mean(np.abs(np.array(actual_closes) - np.array(inferred_closes)))\n",
"rmse = np.sqrt(np.mean((np.array(actual_closes) - np.array(inferred_closes)) ** 2))\n",
"\n",
"print(f\"\\nСредняя абсолютная ошибка (MAE): {mae:.2f}\")\n",
"print(f\"Среднеквадратичная ошибка (RMSE): {rmse:.2f}\")\n"
2025-02-09 22:37:05 +04:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Даже если учесть немалый объем данных и большие принимаемые значения переменных, в с связи с которыми метрики ошибок приняли немаленькие значения, результат можно охарактеризовать как не самый точный "
2025-02-09 22:37:05 +04:00
]
}
],
"metadata": {
"kernelspec": {
"display_name": "aimenv",
"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
}