Ниже приведён пошаговый алгоритм решения задачи и финальный код на Python.
- Определяем функцию 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()
Пошагово:
- Импортируются необходимые библиотеки numpy и matplotlib.
- Функция regression принимает матрицу признаков X, вектор ответов y и коэффициент регуляризации alpha. Внутри функции выполняется генерация случайного вектора c, создание диагональной матрицы C, вычисление матрицы A и вектора b, построение матрицы второй разности D, вычисление регуляризатора R и формирование модифицированной матрицы Areg. Затем решается система линейных уравнений и возвращается вектор коэффициентов w.
- В блоке if == : генерируются данные: x в диапазоне [0, 2π], истинные значения sin(x) и добавляется гауссовский шум, чтобы получить y.
- Для набора степеней полинома (degrees) и коэффициентов регуляризации (alphas) строится матрица признаков X с помощью функции np.vander, затем вызывается функция regression для получения коэффициентов, после чего рассчитываются предсказания yred.
- Результаты визуализируются на сетке графиков, где для каждого сочетания параметров показываются истинная функция, наблюдаемые данные и аппроксимация.
Такой код позволяет исследовать влияние изменения степени полинома и коэффициента регуляризации на аппроксимацию функции sin(x) при наличии зашумлённых данных.