zadacha 4
This commit is contained in:
parent
a69f05e1da
commit
0543d68978
|
@ -1,6 +1,8 @@
|
||||||
from app.utils.system import clear_console
|
from app.utils.system import clear_console
|
||||||
from app.zadachi.zadacha1 import zadacha1
|
from app.zadachi.zadacha1 import zadacha1
|
||||||
from app.zadachi.zadacha2 import zadacha2
|
from app.zadachi.zadacha2 import zadacha2
|
||||||
|
from app.zadachi.zadacha3 import zadacha3
|
||||||
|
from app.zadachi.zadacha4 import zadacha4
|
||||||
|
|
||||||
class menu:
|
class menu:
|
||||||
|
|
||||||
|
@ -13,6 +15,10 @@ class menu:
|
||||||
print('\nMain Menu:')
|
print('\nMain Menu:')
|
||||||
print('1. Задача 1')
|
print('1. Задача 1')
|
||||||
print('2. Задача 2')
|
print('2. Задача 2')
|
||||||
|
print('3. Задача 3')
|
||||||
|
print('4. Задача 4')
|
||||||
|
print('5. Задача 5 (недоступно)')
|
||||||
|
print('6. Задача 6 (недоступно)')
|
||||||
print('0. Exit')
|
print('0. Exit')
|
||||||
|
|
||||||
choice = input('Select an option: ')
|
choice = input('Select an option: ')
|
||||||
|
@ -22,6 +28,14 @@ class menu:
|
||||||
self.zadacha1_menu() # Переход к подменю Задачи 1
|
self.zadacha1_menu() # Переход к подменю Задачи 1
|
||||||
elif choice == '2':
|
elif choice == '2':
|
||||||
self.zadacha2_menu() # Переход к подменю Задачи 2
|
self.zadacha2_menu() # Переход к подменю Задачи 2
|
||||||
|
elif choice == '3':
|
||||||
|
self.zadacha3_menu() # Переход к подменю Задачи 3
|
||||||
|
elif choice == '4':
|
||||||
|
self.zadacha4_menu() # Добавлен вызов меню задачи 4
|
||||||
|
elif choice == '5':
|
||||||
|
print('Временно недоступно')
|
||||||
|
elif choice == '6':
|
||||||
|
print('Временно недоступно')
|
||||||
elif choice == '0':
|
elif choice == '0':
|
||||||
print('Exiting program...')
|
print('Exiting program...')
|
||||||
break
|
break
|
||||||
|
@ -33,8 +47,8 @@ class menu:
|
||||||
clear_console()
|
clear_console()
|
||||||
while True:
|
while True:
|
||||||
print('\nЗадача 1:')
|
print('\nЗадача 1:')
|
||||||
print('1. линейно')
|
print('1. Линейно сгенерировать массив Y, зависящий от x')
|
||||||
print('2. квадратично')
|
print('2. Квадратично сгенерировать массив Y, зависящий от x')
|
||||||
print('0. Назад')
|
print('0. Назад')
|
||||||
|
|
||||||
choice = input('Выберите подкатегорию: ')
|
choice = input('Выберите подкатегорию: ')
|
||||||
|
@ -93,3 +107,51 @@ class menu:
|
||||||
break # Вернуться в основное меню
|
break # Вернуться в основное меню
|
||||||
else:
|
else:
|
||||||
print('Неверный выбор, попробуйте снова.')
|
print('Неверный выбор, попробуйте снова.')
|
||||||
|
|
||||||
|
def zadacha3_menu(self):
|
||||||
|
"""Меню для задачи 3 (построение графика регрессии и расчет метрик)."""
|
||||||
|
clear_console()
|
||||||
|
z1 = zadacha1() # Используем объект задачи 1 для генерации данных
|
||||||
|
z2 = zadacha2() # Используем объект задачи 2 для расчета коэффициентов
|
||||||
|
|
||||||
|
while True:
|
||||||
|
print('\nЗадача 3:')
|
||||||
|
print('1. Построить график регрессии и рассчитать метрики')
|
||||||
|
print('0. Назад')
|
||||||
|
|
||||||
|
choice = input('Выберите подкатегорию: ')
|
||||||
|
|
||||||
|
clear_console()
|
||||||
|
|
||||||
|
if choice == '1':
|
||||||
|
x_data, y_data = z1.create_lin_array()
|
||||||
|
b0, b1 = z2.calculate_coefficients(x_data, y_data)
|
||||||
|
|
||||||
|
# Создаем объект задачи 3 и выполняем построение графика
|
||||||
|
z3 = zadacha3(x_data, y_data, b0, b1)
|
||||||
|
z3.plot_regression()
|
||||||
|
elif choice == '0':
|
||||||
|
break # Вернуться в основное меню
|
||||||
|
else:
|
||||||
|
print('Неверный выбор, попробуйте снова.')
|
||||||
|
def zadacha4_menu(self):
|
||||||
|
"""Меню для задачи 4 (работа с полиномиальными данными)."""
|
||||||
|
clear_console()
|
||||||
|
z4 = zadacha4() # Создаем объект задачи 4
|
||||||
|
|
||||||
|
while True:
|
||||||
|
print('\nЗадача 4:')
|
||||||
|
print('1. Провести визуальный анализ остатков')
|
||||||
|
print('0. Назад')
|
||||||
|
|
||||||
|
choice = input('Выберите подкатегорию: ')
|
||||||
|
|
||||||
|
clear_console()
|
||||||
|
|
||||||
|
if choice == '1':
|
||||||
|
z4 = zadacha4()
|
||||||
|
z4.analyze_residuals()
|
||||||
|
elif choice == '0':
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
print('Неверный выбор, попробуйте снова.')
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
import numpy as np
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
|
class zadacha3:
|
||||||
|
def __init__(self, X, Y, b0, b1):
|
||||||
|
self.X = X
|
||||||
|
self.Y = Y
|
||||||
|
self.b0 = b0
|
||||||
|
self.b1 = b1
|
||||||
|
|
||||||
|
def calculate_sse(self):
|
||||||
|
"""
|
||||||
|
Функция для расчета суммы квадратов ошибок (SSE)
|
||||||
|
:return: SSE
|
||||||
|
"""
|
||||||
|
Y_pred = self.b0 + self.b1 * self.X
|
||||||
|
sse = np.sum((self.Y - Y_pred) ** 2)
|
||||||
|
return sse
|
||||||
|
|
||||||
|
def calculate_r_squared(self):
|
||||||
|
"""
|
||||||
|
Функция для расчета коэффициента детерминации R^2
|
||||||
|
:return: R^2
|
||||||
|
"""
|
||||||
|
y_mean = np.mean(self.Y)
|
||||||
|
ss_total = np.sum((self.Y - y_mean) ** 2)
|
||||||
|
ss_residual = self.calculate_sse()
|
||||||
|
r_squared = 1 - (ss_residual / ss_total)
|
||||||
|
return r_squared
|
||||||
|
|
||||||
|
def plot_regression(self):
|
||||||
|
"""
|
||||||
|
Функция для построения графика регрессии и отображения метрик SSE и R^2
|
||||||
|
"""
|
||||||
|
Y_pred = self.b0 + self.b1 * self.X
|
||||||
|
|
||||||
|
plt.figure(figsize=(10, 6))
|
||||||
|
|
||||||
|
# График рассеяния и регрессионная прямая
|
||||||
|
plt.subplot(2, 1, 1)
|
||||||
|
plt.scatter(self.X, self.Y, label='Данные')
|
||||||
|
plt.plot(self.X, Y_pred, color='red', label='Регрессия')
|
||||||
|
plt.title("Линейная регрессия")
|
||||||
|
plt.xlabel("X")
|
||||||
|
plt.ylabel("Y")
|
||||||
|
plt.legend()
|
||||||
|
|
||||||
|
# Расчет метрик и отображение на графике
|
||||||
|
sse = self.calculate_sse()
|
||||||
|
r_squared = self.calculate_r_squared()
|
||||||
|
plt.text(0.05, 0.95, f"SSE: {sse:.2f}\nR^2: {r_squared:.2f}",
|
||||||
|
transform=plt.gca().transAxes, verticalalignment='top')
|
||||||
|
|
||||||
|
plt.show()
|
|
@ -0,0 +1,62 @@
|
||||||
|
import numpy as np
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
from app.zadachi.zadacha2 import zadacha2
|
||||||
|
from app.zadachi.zadacha1 import zadacha1
|
||||||
|
|
||||||
|
class zadacha4:
|
||||||
|
def __init__(self):
|
||||||
|
self.z1 = zadacha1()
|
||||||
|
self.z2 = zadacha2()
|
||||||
|
|
||||||
|
def analyze_residuals(self):
|
||||||
|
"""
|
||||||
|
Выполняет визуальный анализ остатков по линейной модели.
|
||||||
|
Строит графики 2*2: скаттерограмма, график исходной зависимости,
|
||||||
|
распределение остатков и гистограмму остатков.
|
||||||
|
"""
|
||||||
|
# Генерируем данные
|
||||||
|
X, Y = self.z1.create_lin_array()
|
||||||
|
|
||||||
|
# Рассчитываем коэффициенты методом наименьших квадратов
|
||||||
|
b0, b1 = self.z2.calculate_coefficients(X, Y)
|
||||||
|
|
||||||
|
# Предсказанные значения
|
||||||
|
Y_pred = self.z2.predict(X, b0, b1)
|
||||||
|
|
||||||
|
# Вычисляем остатки
|
||||||
|
residuals = Y - Y_pred
|
||||||
|
|
||||||
|
# Создаем графики 2*2
|
||||||
|
fig, axs = plt.subplots(2, 2, figsize=(12, 8))
|
||||||
|
|
||||||
|
# Первый график: скаттерограмма с линией МНК
|
||||||
|
axs[0, 0].scatter(X, Y, label='Данные с шумом', alpha=0.6)
|
||||||
|
axs[0, 0].plot(X, Y_pred, color='red', label='Прямая по МНК')
|
||||||
|
axs[0, 0].set_title('Скаттерограмма и прямая по МНК')
|
||||||
|
axs[0, 0].legend()
|
||||||
|
|
||||||
|
# Второй график: исходная зависимость и линия МНК
|
||||||
|
axs[0, 1].scatter(X, Y, label='Данные', alpha=0.6)
|
||||||
|
axs[0, 1].plot(X, self.z1.create_lin_array(b0, b1, len(X))[1], color='green', label='Истинная линия')
|
||||||
|
axs[0, 1].plot(X, Y_pred, color='red', linestyle='--', label='Прямая по МНК')
|
||||||
|
axs[0, 1].set_title('Истинная линия и прямая по МНК')
|
||||||
|
axs[0, 1].legend()
|
||||||
|
|
||||||
|
# Третий график: распределение остатков
|
||||||
|
axs[1, 0].scatter(X, residuals, color='purple', alpha=0.6)
|
||||||
|
axs[1, 0].axhline(y=0, color='red', linestyle='--')
|
||||||
|
axs[1, 0].set_title('Распределение остатков')
|
||||||
|
|
||||||
|
# Четвертый график: гистограмма остатков
|
||||||
|
axs[1, 1].hist(residuals, bins=30, color='orange', edgecolor='black', alpha=0.7)
|
||||||
|
axs[1, 1].set_title('Гистограмма остатков')
|
||||||
|
|
||||||
|
# Выравниваем графики и отображаем
|
||||||
|
plt.tight_layout()
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
# Отдельное окно для гистограммы
|
||||||
|
plt.figure()
|
||||||
|
plt.hist(residuals, bins=30, color='orange', edgecolor='black', alpha=0.7)
|
||||||
|
plt.title('Гистограмма остатков (отдельно)')
|
||||||
|
plt.show()
|
7
main.py
7
main.py
|
@ -1,6 +1,11 @@
|
||||||
|
from app.utils.config import debug
|
||||||
from app.menu_load import menu
|
from app.menu_load import menu
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
if debug == True:
|
||||||
|
print("Running in debug mode...")
|
||||||
|
from test_module.debug_main import debug_main_start
|
||||||
|
debug_main_start()
|
||||||
|
else:
|
||||||
mn = menu()
|
mn = menu()
|
||||||
mn.main_menu()
|
mn.main_menu()
|
||||||
|
|
Loading…
Reference in New Issue