Классификация Байеса с многомерным окном Парзена с использованием сферического ядра

У меня проблема с реализацией байесовского классификатора с алгоритмом окна Парзена с использованием сферического (или изотропного) ядра.

Я запускаю алгоритм с тестовыми данными, содержащими 2 измерения и 3 разных класса (для каждого класса у меня есть 10 тестовых точек и 40 тренировочных точек, все в 2 измерениях). Когда я изменяю значение моего гиперпараметра (sigma_sq для сферического ядра Гаусса), я обнаруживаю, что это не влияет на то, как точки классифицируются.

Это моя оценка плотности. Мой self.sigma_sq одинаков во всех измерениях моих данных (2 измерения)

 for i in range(test_data.shape[0]):
     log_prob_intermediate = 0 
     for j in range(n): #n is size of training set
         c = -self.n_dims * np.log(2*np.pi)/2.0 - self.n_dims*np.log(self.sigma_sq)/2.0
         log_prob_intermediate += (c - np.sum((test_data[i,:] -  self.train_data[j,:])**2.0) / (2.0 * self.sigma_sq))
     log_prob.append(log_prob_intermediate / n)

Как я реализовал свой байесовский классификатор: есть 3 класса, которые мой байесовский классификатор должен различать. Я создал 3 тренировочных набора и 3 тестовых набора (по одному тренировочному и тестовому набору на класс). Для каждой точки в моем тестовом наборе я запускаю оценку плотности для каждого класса точки. Это дает мне вектор из 3 значений: логарифмическая вероятность того, что моя новая точка находится в классе 1, классе 2 или классе 3. Затем я выбираю максимальное значение и назначаю новую точку этому классу.

  1. Поскольку я использую сферическое ядро ​​Гаусса, я понимаю, что мой sigma_sq должен быть общим для каждой оценки плотности (одна оценка плотности для каждого класса). Это правильно? Если бы у меня был другой sigma_sq для каждой пары измерений, разве это не дало бы мне что-то вроде диагонального ядра Гаусса?

  2. Для моего списка из 30 тестовых точек (по 10 для каждого класса) я обнаружил, что запуск байесовского классификатора по этим точкам продолжает давать мне одну и ту же классификацию для каждой точки, независимо от того, какую сигму я использую. Это нормально? Поскольку это сферическое ядро ​​​​Гаусса, и все мои измерения используют одно и то же ядро, увеличивает или уменьшает мой sigma_sq просто пропорциональный эффект на мою логарифмическую вероятность без изменения классификации? ИЛИ у меня есть какая-то проблема с моей оценкой плотности, которую я не могу понять.


person telefunken    schedule 02.11.2015    source источник


Ответы (1)


Давайте рассмотрим каждую вещь отдельно

  1. Использование одной и той же сигмы для каждого измерения делает ваше ядро ​​радиальным, это верно; однако вы можете (и должны!) использовать разные сигмы для каждого класса, поскольку для каждого распределения обычно требуется разная оценка плотности, для простой эвристики прочитайте, например, эмпирическое правило Скотта для выбора ширины ядра в гауссовом случай или более поздняя работа Сильвермана.
  2. Трудно сказать, должен ли в вашем конкретном случае выбор сигмы изменить классификацию - в целом это должно быть верно; но у каждого набора данных есть свои свойства. Однако ваши данные только двухмерные, что делает их идеальными для визуализации. Нарисуйте свои данные, затем нарисуйте каждый KDE и просто визуально исследуйте, что происходит.
person lejlot    schedule 02.11.2015