62 lines
2.9 KiB
Python
62 lines
2.9 KiB
Python
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() |