1. Главная
  2. Библиотека
  3. Статистика
  4. Реализовать на Python: Функция regression(X, y, alpha):...
Решение задачи

Реализовать на Python: Функция regression(X, y, alpha): Вход: X - матрица признаков (n объектов x m признаков) y - вектор ответов (n) alpha - коэффициент регуляризации Шаги: 1. Определить n, m = размеры X 2. Создать вектор весов c длины n с небольшим

  • Статистика

Условие:

Реализовать на Python:
Функция regression(X, y, alpha):
Вход:
X - матрица признаков (n объектов x m признаков)
y - вектор ответов (n)
alpha - коэффициент регуляризации

Шаги:
1. Определить n, m = размеры X
2. Создать вектор весов c длины n с небольшим шумом (например, ci = 1 + 0.5 * случайноечисло)
3. Построить диагональную матрицу C из вектора c
4. Вычислить матрицу A = XT C X
5. Вычислить вектор b = XT C y
6. Создать матрицу второй разности D размером (m-2) x m:
Для j от 0 до m-3:
D[j, j] = 1
D[j, j+1] = -2
D[j, j+2] = 1
7. Вычислить регуляризатор R = DT * D
8. Сформировать матрицу Areg = A + alpha * R
9. Решить систему линейных уравнений Areg * w = b относительно w
10. Вернуть вектор коэффициентов w

Основной алгоритм:
1. Сгенерировать данные:
- x равномерно от 0 до 2π, n=100 точек
- ytrue = sin(x)
- y = ytrue + небольшой гауссовский шум

2. Для заданной степени полинома degree:
- Построить матрицу признаков X с помощью np.vander(x, degree+1, increasing=True)
- Вызвать regression(X, y, alpha) для получения коэффициентов w
- Вычислить предсказания ypred = X * w

3. Визуализировать:
- Истинную функцию ytrue
- Наблюдаемые данные y
- Аппроксимацию ypred

4. Для нескольких значений degree и alpha повторить шаги 2-3 и построить сетку графиков для сравнения влияния параметров.

Решение:

Ниже приведён пошаговый алгоритм решения задачи и финальный код на Python. 1. Определяем функцию regression(X, y, alpha). Внутри функции: 1.1. Находим размеры входной матрицы X: n – число объектов, m – число признаков. 1.2. Генерируем вектор c длины n, где каждый элемент равен 1 плюс случайное отклонение: c[i] = 1 + 0.5 * случайное_число. Для генерации случайного числа можно воспользоваться функцией np.random.rand(). 1.3. Создаём диагональную матрицу C из вектора c с помощью np.diag(c). 1.4. Вычисляем матрицу A = XT C X (используем оператор @ для матричного умножения). 1.5. Вычисляем в...

if == : np.random.seed(0) # для воспроизводимости результатов # 1. Генерация исходных данных noints = 100 x = np.linspace(0, 2 * np.pi, noints) yrue = np.sin(x) noise = np.random.normal(scale=0.2, size=noints) y = yrue + noise # Параметры для исследования degrees = [3, 5, 7] # степени полинома для эксперимента alphas = [0, 0.1, 1] # коэффициенты регуляризации # Создаем фигуру с подграфиками fig, axes = plt.subplots(len(degrees), len(alphas), figsize=(15, 10), sharex=True, sharey=True) fig.suptitle(Аппроксимация полиномами для разных степеней и коэффициентов регуляризации, fontsize=16) # Перебор значений степени и alpha for i, degree in enumerate(degrees): # Формирование матрицы признаков X с использованием np.vander X = np.vander(x, degree + 1, increasing=True) for j, alpha in enumerate(alphas): # Вычисление коэффициентов с помощью функции regression w = regression(X, y, alpha) # Вычисляем предсказанные значения yred = X * w yred = X @ w ax = axes[i, j] # Визуализируем истинную функцию, наблюдаемые данные и предсказанную аппроксимацию ax.plot(x, ytrue, color=green) ax.scatter(x, y, label=y (наблюдения), color=blue, s=10) ax.plot(x, ypred, color=red) ax.setitle(fdegree={degree}, alpha={alpha}) if i == len(degrees) - 1: ax.setlabel(x) if j == 0: ax.setlabel(y) ax.legend(fontsize=8) plt.tightayout(rect=[0, 0, 1, 0.95]) plt.show() Пошагово: 1. Импортируются необходимые библиотеки numpy и matplotlib. 2. Функция regression принимает матрицу признаков X, вектор ответов y и коэффициент регуляризации alpha. Внутри функции выполняется генерация случайного вектора c, создание диагональной матрицы C, вычисление матрицы A и вектора b, построение матрицы второй разности D, вычисление регуляризатора R и формирование модифицированной матрицы Areg. Затем решается система линейных уравнений и возвращается вектор коэффициентов w. 3. В блоке if == : генерируются данные: x в диапазоне [0, 2π], истинные значения sin(x) и добавляется гауссовский шум, чтобы получить y. 4. Для набора степеней полинома (degrees) и коэффициентов регуляризации (alphas) строится матрица признаков X с помощью функции np.vander, затем вызывается функция regression для получения коэффициентов, после чего рассчитываются предсказания yred. 5. Результаты визуализируются на сетке графиков, где для каждого сочетания параметров показываются истинная функция, наблюдаемые данные и аппроксимация. Такой код позволяет исследовать влияние изменения степени полинома и коэффициента регуляризации на аппроксимацию функции sin(x) при наличии зашумлённых данных.

Не нашел нужную задачу?

Воспользуйся поиском

Выбери предмет