我正在尝试使用自己的 fit 函数实现我自己的 Bernoulli 类,以适应包含单词的训练和测试列表(垃圾邮件检测)
这是我的伯努利课程:
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?甚至不知道如何解决它。
有人可以帮助我或向我解释如何实现拟合吗?