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

2 / main

.py
Скачиваний:
0
Добавлен:
07.04.2025
Размер:
6.62 Кб
Скачать
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.31 Кб0data.xlsx
  • #
    07.04.20256.62 Кб0main.py