1 и 2 задача
This commit is contained in:
parent
700492ca5f
commit
f061197107
|
@ -2,6 +2,12 @@ chezahuynya1
|
||||||
=============
|
=============
|
||||||
|
|
||||||
bts metodi 1
|
bts metodi 1
|
||||||
|
1 +
|
||||||
|
2 +
|
||||||
|
3 -
|
||||||
|
4 -
|
||||||
|
5 -
|
||||||
|
6 -
|
||||||
|
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
from app.utils.system import clear_console
|
||||||
|
from app.zadachi.zadacha1 import zadacha1
|
||||||
|
from app.zadachi.zadacha2 import zadacha2
|
||||||
|
|
||||||
|
class pod_menu:
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
pass # Конструктор пока пустой, при необходимости можно добавить параметры
|
||||||
|
|
||||||
|
def zadacha1_menu():
|
||||||
|
"""Меню для задачи 1 с подкатегориями."""
|
||||||
|
clear_console()
|
||||||
|
while True:
|
||||||
|
print('\nЗадача 1:')
|
||||||
|
print('1. линейно')
|
||||||
|
print('2. квадратично')
|
||||||
|
print('0. Назад')
|
||||||
|
|
||||||
|
choice = input('Выберите подкатегорию: ')
|
||||||
|
|
||||||
|
clear_console()
|
||||||
|
z1 = zadacha1() # создаем объект для задачи 1
|
||||||
|
|
||||||
|
if choice == '1':
|
||||||
|
z1.plot_lin_data() # Выполнить первую подзадачу
|
||||||
|
#return # Вернуться в основное меню после выполнения
|
||||||
|
elif choice == '2':
|
||||||
|
z1.plot_sqr_data() # Выполнить вторую подзадачу
|
||||||
|
#return # Вернуться в основное меню после выполнения
|
||||||
|
elif choice == '0':
|
||||||
|
break # Вернуться в основное меню
|
||||||
|
else:
|
||||||
|
print('Неверный выбор, попробуйте снова.')
|
||||||
|
|
||||||
|
def zadacha2_menu():
|
||||||
|
"""Меню для задачи 2 (расчет коэффициентов методом наименьших квадратов)."""
|
||||||
|
clear_console()
|
||||||
|
z1 = zadacha1() # Используем объект задачи 1 для генерации данных
|
||||||
|
z2 = zadacha2() # Создаем объект для задачи 2
|
||||||
|
|
||||||
|
while True:
|
||||||
|
print('\nЗадача 2:')
|
||||||
|
print('1. Рассчитать коэффициенты b0 и b1 для линейной модели')
|
||||||
|
print('2. Сделать прогноз по рассчитанным коэффициентам')
|
||||||
|
print('0. Назад')
|
||||||
|
|
||||||
|
choice = input('Выберите подкатегорию: ')
|
||||||
|
|
||||||
|
clear_console()
|
||||||
|
|
||||||
|
if choice == '1':
|
||||||
|
# Генерация линейных данных с помощью функции из задачи 1
|
||||||
|
x_data, y_data = z1.create_lin_array()
|
||||||
|
|
||||||
|
# Рассчет коэффициентов b0 и b1 методом наименьших квадратов
|
||||||
|
b0, b1 = z2.calculate_coefficients(x_data, y_data)
|
||||||
|
|
||||||
|
print(f'Рассчитанные коэффициенты:')
|
||||||
|
print(f'b0 (свободный член) = {b0}')
|
||||||
|
print(f'b1 (коэффициент наклона) = {b1}')
|
||||||
|
elif choice == '2':
|
||||||
|
# Пример предсказания на новых данных
|
||||||
|
x_data, y_data = z1.create_lin_array() # Сначала генерируем данные
|
||||||
|
b0, b1 = z2.calculate_coefficients(x_data, y_data) # Рассчитываем коэффициенты
|
||||||
|
|
||||||
|
# Выполняем прогноз
|
||||||
|
predicted_y = z2.predict(x_data, b0, b1)
|
||||||
|
|
||||||
|
print(f'Предсказанные значения Y на основе рассчитанных коэффициентов:')
|
||||||
|
print(predicted_y)
|
||||||
|
elif choice == '0':
|
||||||
|
break # Вернуться в основное меню
|
||||||
|
else:
|
||||||
|
print('Неверный выбор, попробуйте снова.')
|
|
@ -0,0 +1,60 @@
|
||||||
|
import numpy as np
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
|
class zadacha1:
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
pass # Конструктор пока пустой, при необходимости можно добавить параметры
|
||||||
|
|
||||||
|
# Метод для генерации линейного массива данных
|
||||||
|
def create_lin_array(self, b0=2, b1=4, N=500, noise_std=10):
|
||||||
|
"""
|
||||||
|
Генерация массива данных по линейной зависимости Y = b0 + b1 * X + error
|
||||||
|
:param b0: свободный коэффициент
|
||||||
|
:param b1: коэффициент при X
|
||||||
|
:param N: количество точек данных
|
||||||
|
:param noise_std: стандартное отклонение для случайной ошибки
|
||||||
|
:return: массивы X и Y
|
||||||
|
"""
|
||||||
|
X = np.linspace(1, 500, N) # создаем массив X с равномерным шагом
|
||||||
|
error = np.random.normal(0, noise_std, N) # генерируем шум
|
||||||
|
Y = b0 + b1 * X + error # генерируем Y по линейному закону
|
||||||
|
return X, Y
|
||||||
|
|
||||||
|
# Метод для генерации квадратичного массива данных
|
||||||
|
def create_sqr_array(self, a=1, b=3, c=2, N=500, noise_std=10):
|
||||||
|
"""
|
||||||
|
Генерация массива данных по квадратичной зависимости Y = a * X^2 + b * X + c + error
|
||||||
|
:param a: коэффициент при X^2
|
||||||
|
:param b: коэффициент при X
|
||||||
|
:param c: свободный коэффициент
|
||||||
|
:param N: количество точек данных
|
||||||
|
:param noise_std: стандартное отклонение для случайной ошибки
|
||||||
|
:return: массивы X и Y
|
||||||
|
"""
|
||||||
|
X = np.linspace(1, 500, N) # создаем массив X
|
||||||
|
error = np.random.normal(0, noise_std, N) # генерируем шум
|
||||||
|
Y = a * X**2 + b * X + c + error # генерируем Y по квадратичному закону
|
||||||
|
return X, Y
|
||||||
|
|
||||||
|
# Метод для отображения графика линейных данных
|
||||||
|
def plot_lin_data(self, b0=2, b1=4, N=500, noise_std=10):
|
||||||
|
"""
|
||||||
|
Отображение сгенерированных линейных данных и теоретической линии
|
||||||
|
"""
|
||||||
|
X, Y = self.create_lin_array(b0, b1, N, noise_std) # Генерация данных
|
||||||
|
plt.scatter(X, Y) # График рассеяния
|
||||||
|
plt.plot(X, b0 + b1 * X, color='red') # Линейная функция без шума
|
||||||
|
plt.title("Линейная зависимость с шумом")
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
# Метод для отображения графика квадратичных данных
|
||||||
|
def plot_sqr_data(self, a=1, b=3, c=2, N=500, noise_std=10):
|
||||||
|
"""
|
||||||
|
Отображение сгенерированных квадратичных данных и теоретической кривой
|
||||||
|
"""
|
||||||
|
X, Y = self.create_sqr_array(a, b, c, N, noise_std) # Генерация данных
|
||||||
|
plt.scatter(X, Y) # График рассеяния
|
||||||
|
plt.plot(X, a * X**2 + b * X + c, color='red') # Квадратичная функция без шума
|
||||||
|
plt.title("Квадратичная зависимость с шумом")
|
||||||
|
plt.show()
|
|
@ -0,0 +1,35 @@
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
class zadacha2:
|
||||||
|
def calculate_coefficients(self, X, Y):
|
||||||
|
"""
|
||||||
|
Функция для расчета коэффициентов b0 и b1 по методу наименьших квадратов (МНК)
|
||||||
|
:param X: массив значений независимой переменной
|
||||||
|
:param Y: массив значений зависимой переменной
|
||||||
|
:return: коэффициенты b0 и b1
|
||||||
|
"""
|
||||||
|
n = len(X)
|
||||||
|
|
||||||
|
# Вычисляем средние значения X и Y
|
||||||
|
mean_x = np.mean(X)
|
||||||
|
mean_y = np.mean(Y)
|
||||||
|
|
||||||
|
# Вычисляем коэффициент b1
|
||||||
|
numerator = np.sum((X - mean_x) * (Y - mean_y))
|
||||||
|
denominator = np.sum((X - mean_x) ** 2)
|
||||||
|
b1 = numerator / denominator
|
||||||
|
|
||||||
|
# Вычисляем коэффициент b0
|
||||||
|
b0 = mean_y - b1 * mean_x
|
||||||
|
|
||||||
|
return b0, b1
|
||||||
|
|
||||||
|
def predict(self, X, b0, b1):
|
||||||
|
"""
|
||||||
|
Функция для предсказания значений Y на основе коэффициентов b0 и b1
|
||||||
|
:param X: массив значений независимой переменной
|
||||||
|
:param b0: коэффициент b0 (свободный член)
|
||||||
|
:param b1: коэффициент b1 (коэффициент при X)
|
||||||
|
:return: предсказанные значения Y
|
||||||
|
"""
|
||||||
|
return b0 + b1 * X
|
11
main.py
11
main.py
|
@ -1,23 +1,24 @@
|
||||||
|
|
||||||
from app.utils.config import debug
|
from app.utils.config import debug
|
||||||
from app.utils.system import clear_console
|
from app.utils.system import clear_console
|
||||||
#from test_module import *
|
from app.menu_load import pod_menu
|
||||||
|
|
||||||
|
|
||||||
def main_menu():
|
def main_menu():
|
||||||
clear_console()
|
clear_console()
|
||||||
while True:
|
while True:
|
||||||
print('\nMain Menu:')
|
print('\nMain Menu:')
|
||||||
print('1. Start')
|
print('1. Задача 1')
|
||||||
|
print('2. Задача 2')
|
||||||
print('0. Exit')
|
print('0. Exit')
|
||||||
|
|
||||||
choice = input('Select an option: ')
|
choice = input('Select an option: ')
|
||||||
|
|
||||||
clear_console()
|
clear_console()
|
||||||
if choice == '1':
|
if choice == '1':
|
||||||
#return test()
|
pod_menu.zadacha1_menu() # Переход к подменю Задачи 1
|
||||||
return
|
elif choice == '2':
|
||||||
|
pod_menu.zadacha2_menu() # Переход к подменю Задачи 2
|
||||||
elif choice == '0':
|
elif choice == '0':
|
||||||
print('Exiting program...')
|
print('Exiting program...')
|
||||||
break
|
break
|
||||||
|
|
Loading…
Reference in New Issue