Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 / main

.py
Скачиваний:
3
Добавлен:
07.04.2025
Размер:
7 Кб
Скачать
import numpy as np
import openpyxl

# Уравнение линейной множественной регрессии - это зависимость одного признака от других признаков, которая содержит неизвестные параметры.
# В матричном виде: Х*а + Е
# В векторном: y = a1x1 + a2x2 + ... + am*xm + ε, x - вектор независимых переменных, a - вектор неизвестных параметров,
# ε - случайная компонента, которая характеризует неучтенные признакию.
def print_matrix(matrix):
    if isinstance(matrix, list):
        for row in matrix:
            print("\t".join(map(str, row)))
    elif isinstance(matrix, np.ndarray):
        for row in matrix:
            print("\t".join(map(lambda x: f"{x:.4f}", row)))
    else:
        print("Неверный формат матрицы")


def load_excel_matrix(file_path, sheet_name, cols=None, exclude_cols=None):
    """
    Загрузка данных для Y и X.
    """
    matrix = []  # Создаем пустой список для хранения данных из Excel
    workbook = openpyxl.load_workbook(file_path)  # Загружаем Excel-файл по указанному пути
    sheet = workbook[sheet_name]  # Выбираем конкретный лист по его имени

    # Проходим по всем строкам в выбранном листе
    for row in sheet.iter_rows(values_only=True):
        # Если указаны столбцы для выбора (cols)
        if cols:
            # Выбираем только указанные столбцы из текущей строки
            selected_cols = [row[col] for col in cols]
            # Добавляем выбранные столбцы в матрицу
            matrix.append(selected_cols)

        # Если указаны столбцы для исключения (exclude_cols)
        elif exclude_cols:
            # Фильтруем строку, исключая столбцы с индексами из exclude_cols
            filtered_row = [value for i, value in enumerate(row) if i not in exclude_cols]
            # Добавляем отфильтрованную строку в матрицу
            matrix.append(filtered_row)

        # Если не указаны ни cols, ни exclude_cols
        else:
            # Добавляем всю строку в матрицу
            matrix.append(list(row))

    # Возвращаем заполненную матрицу
    return matrix


def calc_A(X, Y):
    """
    Находим вектор неизвестных параметров A по формуле МНК
    Формула: a = (X^T X)^(-1) X^T Y
    """
    dot1 = np.dot(X.T, X)  # X^T * X
    inv_matrix = np.linalg.inv(dot1)  # (X^T * X)^(-1)
    dot2 = np.dot(inv_matrix, X.T)  # (X^T * X)^(-1) * X^T
    A = np.dot(dot2, Y)  # (X^T * X)^(-1) * X^T * Y
    return A
# Суть "метода наименьших квадратов": в выборе параметров так, чтобы минимизировать сумму квадратов отклонений фактических значений от расчетных

# Свойства МНК: 1) МНК оценка является линейной по y 2) МНК оценка несмещенная 3) МНК оценка единственная, если ранг матрицы X равен m
def add_ones(matrix):
    """
    Изменяем матрицу X, добавляя свободный член
    """
    I = np.ones((matrix.shape[0], 1))  # Столбец из единиц
    X = np.append(matrix, I, axis=1)  # Добавляем столбец к X
    return X


def calc_mean_Y(Y):
    """
    Вычисление среднего значения фактических данных зависимой переменной Y
    """
    sum_Y = np.sum(Y)
    mean_Y = sum_Y / Y.shape[0]
    return mean_Y


def calc_mean_Y_r(X, A):
    """
    Вычисление среднего значения расчетных значений Y
    """
    Y = np.dot(X, A)  # Расчетное Y y^
    sum_Y = np.sum(Y) # сумма элементов
    mean_Y = sum_Y / Y.shape[0]
    return mean_Y


def coef_determination(Y, Y_r, mean_Y_r):
    """
    Вычисление коэффициента детерминации R^2
    Формула: R^2 = 1 - (∑(Y - Ŷ)² / ∑(Y - Ȳ)²)
    """
    e = Y - Y_r  # Остатки (e = Y - Ŷ)
    a = Y - mean_Y_r  # Отклонения от среднего

    e = e ** 2
    a = a ** 2

    e_sum = np.sum(e)  # ∑(Y - Ŷ)²
    a_sum = np.sum(a)  # ∑(Y - Ȳ)²

    R = 1 - e_sum / a_sum  # R²
    return R


# Путь к данным
file_path = "data.xlsx"
sheet_name = "data"

# Выбираем столбец 3 для Y
col = [2]
Y = load_excel_matrix(file_path, sheet_name, col)
Y = np.array(Y)

# Выбираем все столбцы для X
exclude_cols = col  # выбор независимых переменных
data = load_excel_matrix(file_path, sheet_name, exclude_cols=exclude_cols)
X = np.array(data)

# Добавляем свободный член
X = add_ones(X)
# Вычисляем коэффициенты МНК
A = calc_A(X, Y)  # вычисление МНК-оценки
print("МНК оценка неизвестных параметров:")
print_matrix(A)

# Проверка равенства средних значений
mean_Y_r = calc_mean_Y_r(X, A)
mean_Y_f = calc_mean_Y(Y)

if abs(mean_Y_r - mean_Y_f) < 1e-3:
    print("Среднее расчетное значение = среднему фактическому значению")
else:
    print("Среднее расчетное значение != среднему фактическому значению")
print("Cр. расч-ое зн-е: ", mean_Y_r, "\nСр. факт-ое зн-е: ", mean_Y_f)

# Вычисление коэффициента детерминации
Y_r = np.dot(X, A)  # расчетное Y
R = coef_determination(Y, Y_r, mean_Y_r)  # вычисление R²

print("Коэффициент детерминации: ", R)  # Теория: пункт 2.5 - вывод коэффициента детерминации
Соседние файлы в папке 2
  • #
    07.04.202512 Кб3data.xlsx
  • #
    07.04.20257 Кб3main.py