Лабораторная работа №3
Введение в численные методы на Python: Аппроксимация и интерполяция данных измерений. Метод наименьших квадратов
Технические требования:
Среда разработки для написания кода на Python Компилятор Python 3 (+ стандартный набор библиотек)
Требования к знаниям студентов:
Основы синтаксиса Python 3:
-умение работать с переменными и знание типов данных
-умение работать со списками
-умение считывать данные из файла
-умение выводить данные в консоль/файл
-знание условных конструкций if-elif-else
-умение писать циклы for/while
-умение создавать и вызывать функции, возращать значения
-умение генерировать случайные числа с заданным распределением Базовое владение математическим аппаратом:
-понимание, что такое функция
Цель работы:
Знакомство с численными методами для решения задач: - линейная аппроксимация данных
Теоретическое введение:
Блок 1 “Аппроксимация и интерполяция данных измерений”
Аппроксимация и интерполяция — это два схожих по назначению, но различных по математичекой логике метода в математике и вычислительной технике, которые используются для определения (построения) функций, приближенно или точно проходящих через заданный набор точек.
Аппроксимация — это процесс подбора функции, которая близко проходит через заданные точки, но не обязательно точно через каждую точку. Основная цель аппроксимации — описать общую тенденцию набора данных или упростить сложную функцию до более простой формы
Интерполяция — это процесс построения функции, которая точно проходит через все заданные точки. Это особенно полезно, когда вам важно точно соответствовать исходным данным.
Положительные и отрицательные черты каждого метода видны из определений: интерполяция гарантирует точное прохождение через все точки, однако аппроксимация более гибкая и может с небольшими поправками учитывать шум или ошибки в данных, обеспечивая лучшее обобщение. Требование точного соответствия всем точкам у интерполяции зачастую приводит к переобучению: случайное отклонение при регистрации одной из точек параболы 2 степени может привести к тому, что интерполяция данных измерений выдаст сложную функцию 10 или даже 20 степени.
В разных задачах выбор между методами присходит исходя из целей обработки информации. Аппроксимация чаще применяется в задачах прогнозирования и анализа данных, где важны общие тенденции. Интерполяция полезна там, где необходимо точное восстановление сигнала или функции, например, в инженерных расчетах или обработке изображений.
Блок 2 “Линейная аппроксимация – метод наименьших квадратов”
Метод наименьших квадратов — это статистический метод, который используется для нахождения наилучшего приближенного решения системы линейных уравнений, когда количество уравнений превышает количество неизвестных переменных. Этот метод минимизирует сумму квадратов отклонений между наблюдаемыми значениями и предсказанными значениями модели.
Допустим, мы имеем набор точек (x1, y1), (x2, y2), …, (xn, yn) где xi — независимая переменная, а yi — зависимая переменная. Мы хотим найти прямую линию вида y=a+bx, которая наилучшим образом аппроксимирует эти данные.
Шаг 1: Определение целевой функции Целевой функцией является сумма квадратов ошибок:
где yi — наблюдаемое значение, а a+bxi — предсказанное значение. Шаг 2: Минимизация целевой функции
Чтобы минимизировать функцию S(a,b), нужно взять частные производные по параметрам a и b и приравнять их к нулю:
Шаг 3: Вычисление частных производных Частная производная по параметру a:
Приравниваем её к нулю:
Частная производная по параметру b:
Приравниваем её к нулю:
Шаг 4: Решение системы уравнений
Получили систему двух линейных уравнений относительно a и b. Решая эту систему, находим оптимальные значения параметров a и b:
Шаг 5: Подстановка найденных значений
Подставляем найденные значения a и b в уравнение прямой линии y=a+bx, чтобы получить искомую регрессию.
Практическая часть
Задание 1.1 (обязательная часть) “Аппроксимация данных с помощью МНК”
С помощью метода наименьших квадратов произведите линейную аппроксимацию массива заданных точек (xi, yi).
import random x = []
y = []
aInit = float(input ('Please enter a coef in y=a+bx: ')) bInit = float(input ('Please enter b coef in y=a+bx: ')) xStart = 0.0
xStop = 100.0 deviationPer = 0.05 for i in range (10000):
x.append(random.uniform(xStart, xStop))
y.append((aInit + bInit * x[i])*random.uniform(1.0 - deviationPer, 1.0 + deviationPer))
Всписке x хранятся 10000 независимых аргументов х в диапазоне от 0 до 100, в списке y хранятся соответствующие им значения некой линейной зависимости от х, так что y[i] = y(x[i]).
Впеременных aInit и bInit хранятся коэффициенты исходной зависимости. Переменная deviationPer показывает максимально возможное отклонение
измерения y от настоящей зависимости.
Для запуска разместите данный код в начале своего файла. По запросу программы введите коэффициенты a и b (выбрать можно самостоятельно). Далее напишите код Вашей программы по обработке массивов x и y. В конце программы введите посчитанные Вами коэффициенты a и b, сравните их с введёнными. Почему они отличаются? Что можно изменить в приведённом или Вашем коде, чтобы значения a и b стали ближе к истинным? В качестве проверки своего кода можно установить значение переменной deviationPer равным 0. В таком случае отклонений не будет, а все точки окажутся на одной прямой. Верно работающий метод наименьших квадратов должен выдать значения a и b полностью совпадающими с введёнными.
Заключение:
В качестве результата необходимо представить отчет, включающий в себя листинг программы (текст исходного кода), полученные результаты, а также их анализ.
При сдаче работы студент должен знать изученные численные методы, а также разбираться в коде написанной программы.
