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