Почему это логическое значение в этом байесовском классификаторе?(Вопрос Python?) - PullRequest
0 голосов
/ 24 января 2019

Я изучаю GAN (и я начинающий в Python), и я нашел эту часть кода в предыдущих упражнениях, которые я не понимаю.Конкретно я не понимаю, почему используется логическое значение 9-й строки ( Xk = X [Y == k] ) по причинам, которые я записываю ниже

class BayesClassifier:
  def fit(self, X, Y):
    # assume classes are numbered 0...K-1
    self.K = len(set(Y))

    self.gaussians = []
    self.p_y = np.zeros(self.K)
    for k in range(self.K):
      Xk = X[Y == k]
      self.p_y[k] = len(Xk)
      mean = Xk.mean(axis=0)
      cov = np.cov(Xk.T)
      g = {'m': mean, 'c': cov}
      self.gaussians.append(g)
    # normalize p(y)
    self.p_y /= self.p_y.sum()
  1. Это логическое значение возвращает 0 или 1 в зависимости от правильности Y == k, и по этой причине всегда Xk будет первым или вторым значением списка X.Y не находит полезности этого.
  2. В 10-й строке len (Xk) всегда будет 1, почему он использует этот аргумент вместо одного 1?
  3. Среднееи ковариация следующих строк рассчитывается только с одним значением каждый раз.

Я чувствую, что не понимаю чего-то очень простого.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Спасибо, Артем,

Вы правы.Я нашел другой ответ по другому каналу, вот он:

Это массив Numpy - это особая функция массивов NumPy, называемая логическим индексированием, которая позволяет отфильтровывать только те значения в массиве, где находится фильтрвозвращает True:

https://docs.scipy.org/doc/numpy-1.13.0/user/basics.indexing.html?fbclid=IwAR3sGlgSwhv3i7IETsIxp4ROu9oZvNaaaBxZS01DrM5ShjWWRz22ShP2rIg#boolean-or-mask-index-arrays

импортировать numpy как np

a = np.array ([1, 2, 3, 4, 5]) filter = a>3

печать (фильтр)

[Ложь, Ложь, Ложь, Правда, Правда]

print (a [filter])

[4, 5]

0 голосов
/ 24 января 2019

Следует учитывать, что X, Y, k являются массивами NumPy, а не скалярами, и некоторые операторы для них перегружены.В частности, == и булево индексирование.== будет поэлементным сравнением, а не сравнением всего массива.

Посмотрите, как это работает:

In [9]: Y = np.array([0,1,2])                                                                                        
In [10]: k = np.array([0,1,3])                                                                                       
In [11]: Y==k                                                                                                        

Out[11]: array([ True,  True, False])

Итак, результатом == является логический массив.

In [12]: X=np.array([0,2,4])                                                                                         
In [13]: X[Y==k]                                                                                                     

Out[13]: array([0, 2])

В результате получается массив с элементами, выбранными из X, когда условие имеет значение True

Следовательно, len(Xk) будет количеством подходящих элементов между X и k.

...