Ошибка типа: невозможно выполнить уменьшение с гибким типом при применении самодельного фитинга Бернулли в списке
Я пытаюсь реализовать свой собственный класс Бернулли с его собственной функцией подгонки, чтобы соответствовать спискам поездов и тестов, которые содержат слова (обнаружение спама)
вот мой класс Бернулли:
class BernoulliNB(object):
def __init__(self, alpha=1.0):
self.alpha = alpha
def fit(self, X, y):
count_sample = len(X)
separated = [[x for x, t in zip(X, y) if t == c] for c in np.unique(y)]
self.class_log_prior_ = [np.log(len(i) / count_sample) for i in separated]
count = np.array([np.array(i).sum(axis=0) for i in separated]) + self.alpha
smoothing = 2 * self.alpha
n_doc = np.array([len(i) + smoothing for i in separated])
self.feature_prob_ = count / n_doc[np.newaxis].T
return self
def predict_log_proba(self, X):
return [(np.log(self.feature_prob_) * x + \
np.log(1 - self.feature_prob_) * np.abs(x - 1)
).sum(axis=1) + self.class_log_prior_ for x in X]
def predict(self, X):
return np.argmax(self.predict_log_proba(X), axis=1)
И вот моя реализация:
nb = BernoulliNB(alpha=1).fit(train_list, test_list)
Ожидаемый результат:
Я смог согласовать со своим классом мои списки поездов и тестов, но вместо этого я получаю следующую ошибку:
TypeError: cannot perform reduce with flexible type
на следующей строке:
count = np.array([np.array(i).sum(axis=0) for i in separated]) + self.alpha
Я не знаю, почему это терпит неудачу, хотя, возможно из-за того, что у меня есть списки вместо np? даже не уверен, как это исправить.
Может ли кто-нибудь мне помочь или объяснить, как добиться примерки?
1 ответ
Я получаю это сообщение об ошибке, применяя sum
в структурированный массив:
In [754]: np.array([(1,.2),(3,.3)], dtype='i,f')
Out[754]: array([(1, 0.2), (3, 0.3)], dtype=[('f0', '<i4'), ('f1', '<f4')])
In [755]: _.sum(axis=0)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-755-69a91062a784> in <module>()
----> 1 _.sum(axis=0)
/usr/local/lib/python3.6/dist-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims, initial)
34 def _sum(a, axis=None, dtype=None, out=None, keepdims=False,
35 initial=_NoValue):
---> 36 return umr_sum(a, axis, dtype, out, keepdims, initial)
37
38 def _prod(a, axis=None, dtype=None, out=None, keepdims=False,
TypeError: cannot perform reduce with flexible type
Я предполагаю, что ваша ошибка происходит в
np.array(i).sum(axis=0)
и это i
производит или является структурированным массивом.
Я не могу воссоздать твой бег, просто прочитав твой fit
код. Вам нужно будет запустить его с некоторыми диагностическими отпечатками (сфокусируйтесь на форме и типе). Общее наблюдение при беге numpy
код, никогда не думайте, что вы правильно поняли формы и dtype. Проверьте!