Как нормализовать оценку плотности ядра с помощью scikit?

Я использую KDE для многоклассовой классификации. Я реализую его с помощью scikit. Как указано на веб-сайте, KDE для точки x определяется как

Должен ли я нормализовать результат при сравнении различных оценок плотности ядра для разных классов?

Ссылка для KDE:
http://scikit-learn.org/stable/modules/density.html#kernel-density-estimation


person lostboy_19    schedule 11.05.2016    source источник
comment
KDE оценивает плотность вероятности - если я не ошибаюсь, плотность нормирована по определению. Не уверен, почему формула не нормирована - ИМО равенство не выполняется.   -  person cel    schedule 11.05.2016


Ответы (1)


Равенство не выполняется, это явно плохой пример документации. Вы можете видеть в коде, что он нормализован, как здесь

log_density -= np.log(N)
return log_density

так что вы четко делите на N.

Правильная формула с математической точки зрения на самом деле либо

1/N SUM_i K(x_i - x)

or

1/(hN) SUM_i K((x_i - x)/h)

вы также можете углубиться в код .c фактически вычисляющие ядра, и вы обнаружите, что они внутренне нормализованы

 case __pyx_e_7sklearn_9neighbors_9ball_tree_GAUSSIAN_KERNEL:

 /* "binary_tree.pxi":475
 *     cdef ITYPE_t k
 *     if kernel == GAUSSIAN_KERNEL:
 *         factor = 0.5 * d * LOG_2PI             # <<<<<<<<<<<<<<
 *     elif kernel == TOPHAT_KERNEL:
 *         factor = logVn(d)
 */
    __pyx_v_factor = ((0.5 * __pyx_v_d) * __pyx_v_7sklearn_9neighbors_9ball_tree_LOG_2PI);
    break;

Таким образом, каждый K фактически интегрируется в 1, и, следовательно, вы просто берете среднее значение, чтобы получить правильную плотность для всего KDE, и это именно то, что происходит внутри.

person lejlot    schedule 11.05.2016
comment
Спасибо за Ваш ответ. Чтобы было ясно, мне не нужно ничего делать, потому что это нормализуется внутри? Я могу просто сравнить разные KDE? - person lostboy_19; 12.05.2016
comment
Да, есть нормированные. В плане сравнения - смотря чего ты хочешь добиться таким сравнением, но в принципе да, они сравнимы. Если делать классификацию, то нет. Классификация также должна включать предшествующие классы, KDE - это просто генеративная модель, поэтому вам нужно добавить вес, пропорциональный размеру класса, чтобы иметь модель, основанную на точности. Если вы не добавите это, вы сделаете сбалансированную точность - person lejlot; 12.05.2016