Сглаживание ядром Эпанечникова и оценка ядра Пристли-Чао (PC)

Вопрос или проблема

Я написал код на Python ниже, чтобы попытаться автоматизировать применение сглаживания ядром, используя ядро Эпанечникова с шириной окна h = 0.4, вычисляя оценку ядра Пристли-Чао функции f при x = 0.5.

(Y_i, x_i)

x_vals = [0, 1/3, 2/3, 1]
y_vals = [2.1, 2.9, -8.3, 5.2]

Ядро Эпанечникова:

$K(u) = {3\over4}(1-u^2)I(|u| \le 1)$

Пристли-Чао:

$f(x) = {b\ -\ a \over nh} \sum_{i = 1}^{n} K(x – x_i)/h)Y_i$

Вот мои функции:

def epanechnikov_kernel(u):

    if abs(u) <= 1:
        return 3/4 * (1 - u**2)
    else:
        return 0

def pc_kernel_estimate(x, x_vals, y_vals, h):
    numerator = 0
    denominator = 0
    for i in range(len(x_vals)):
        u = (x - x_vals[i]) / h
        k = epanechnikov_kernel(u)
        numerator += k * y_vals[i]
        denominator += k
    f_hat = numerator / denominator
    return f_hat

n = 4
x = 0.5
h = 0.4
x_vals = [0, 1/3, 2/3, 1]
y_vals = [2.1, 2.9, -8.3, 5.2]

f_hat = pc_kernel_estimate(x, x_vals, y_vals, h)

Я знаю, что результат, который я должен получить, равен -2.09. Однако мой программный код здесь выдает -2.7. Я подумал, что это может быть связано с тем, что при ‘f_hat = numerator / denominator’ у меня не было ((b-a)/nh) * (numerator/denominator), и это была моя проблема. Когда я вношу это изменение, правильного ответа все равно нет. Что я упускаю?

Ваш знаменатель неверен, как вы упомянули, вот исправленный код:

def epanechnikov_kernel(u):

    if abs(u) <= 1:
        return 3/4 * (1 - u**2)
    else:
        return 0

def pc_kernel_estimate(x, x_vals, y_vals, h, n):
    numerator = 0
    denominator = n*h
    for i in range(len(x_vals)):
        u = (x - x_vals[i]) / h
        k = epanechnikov_kernel(u)
        numerator += k * y_vals[i]
    f_hat = numerator / denominator
    return f_hat

n = 4
x = 0.5
h = 0.4
x_vals = [0, 1/3, 2/3, 1]
y_vals = [2.1, 2.9, -8.3, 5.2]

f_hat = pc_kernel_estimate(x, x_vals, y_vals, h, n)
f_hat

ваш оригинальный код будет работать для оценки ядра Надарджа-Уотсона (NW).

Ответ или решение

Епанечниковское сглаживание с использованием ядра и оценка ядром Прийстли-Чао (PC) являются важными методами в не параметрической регрессии, которые позволяют строить более гладкие функции из наблюдаемых данных. В этом ответе мы рассмотрим задачу, описанную вами, с акцентом на корректности используемого кода и математических основах.

Основные понятия

  1. Епанечниковское ядро — это симметричное свертка, обладающее формой:
    [
    K(u) = \frac{3}{4}(1 – u^2)I(|u| \le 1)
    ]
    Это ядро используется для «размягчения» значений функции за пределами точки оценки, однако, оно не учитывает значений, которые выходят за границы [-1, 1].

  2. Оценка ядром Прийстли-Чао — является способом оценки функции ( f(x) ) в точке ( x ) с использованием формулы:
    [
    f(x) = \frac{(b – a)}{nh} \sum_{i = 1}^{n} K\left(\frac{x – x_i}{h}\right)Y_i
    ]
    Здесь ( n ) — количество наблюдений, ( h ) — ширина окна (bandwidth), а ( (b – a) ) — разность между максимальным и минимальным значением по оси x.

Ошибки в исходном коде

В вашем первоначальном коде есть несколько ошибок, которые мешают получить правильный результат:

  • Правильный расчет знаменателя. В формуле оценка ядром Прийстли-Чао знаменатель должен включать параметр n и ширину h:
    [
    \text{denominator} = n \cdot h
    ]

  • Реализация ядра. Согласно вашему коду, формула ядра реализована корректно, и она будет работать, если правильно указывать значения входных параметров.

  • Учет поправок. При расчете следует убедиться, что используются правильные формулы, без избыточных корректировок в вычислениях.

Исправленный код

Вот исправленная версия вашей функции, учитывающая все вышеперечисленные замечания:

def epanechnikov_kernel(u):
    if abs(u) <= 1:
        return 3/4 * (1 - u**2)
    else:
        return 0

def pc_kernel_estimate(x, x_vals, y_vals, h, n):
    numerator = 0
    denominator = n * h  # Корректный расчет знаменателя
    for i in range(len(x_vals)):
        u = (x - x_vals[i]) / h
        k = epanechnikov_kernel(u)
        numerator += k * y_vals[i]
    f_hat = numerator / denominator  # Оценка функции
    return f_hat

n = 4
x = 0.5
h = 0.4
x_vals = [0, 1/3, 2/3, 1]
y_vals = [2.1, 2.9, -8.3, 5.2]

f_hat = pc_kernel_estimate(x, x_vals, y_vals, h, n)
print(f_hat)  # Ожидаемый результат: -2.09

Заключение

Используя исправленный подход, вы сможете корректно рассчитать оценку функции в точке ( x = 0.5 ) с использованием ядра Епанечникова и оценки Прийстли-Чао. Это важно для правильного применения методов не параметрической регрессии. Всегда проверяйте формулы и код на наличие логических ошибок, чтобы избежать неожиданных результатов.

Применяя этот подход, вы не только улучшите свои навыки программирования, но и научитесь лучше справляться с вызовами в анализе данных и статистическом моделировании.

Оцените материал
Добавить комментарий

Капча загружается...