Я пытаюсь сделать многочленный наивный байесовский классификатор без использования SKlearn MNB.
Вот код для классификатора:
class MultinomialNaiveBayes:
def __init__(self):
# count is a dictionary which stores several dictionaries corresponding to each news category
# each value in the subdictionary represents the freq of the key corresponding to that news category
self.count = {}
# classes represents the different news categories
self.classes = None
def fit(self,X_train,Y_train):
# This can take some time to complete
self.classes = set(Y_train)
for class_ in self.classes:
self.count[class_] = {}
for i in range(len(X_train[0])):
self.count[class_][i] = 0
self.count[class_]['total'] = 0
self.count[class_]['total_points'] = 0
self.count['total_points'] = len(X_train)
for i in range(len(X_train)):
for j in range(len(X_train[0])):
self.count[Y_train[i]][j]+=X_train[i][j]
self.count[Y_train[i]]['total']+=X_train[i][j]
self.count[Y_train[i]]['total_points']+=1
def __probability(self,test_point,class_):
log_prob = np.log(self.count[class_]['total_points']) - np.log(self.count['total_points'])
total_words = len(test_point)
for i in range(len(test_point)):
current_word_prob = test_point[i]*(np.log(self.count[class_][i]+1)-np.log(self.count[class_]['total']+total_words))
log_prob += current_word_prob
return log_prob
def __predictSinglePoint(self,test_point):
best_class = None
best_prob = None
first_run = True
for class_ in self.classes:
log_probability_current_class = self.__probability(test_point,class_)
if (first_run) or (log_probability_current_class > best_prob) :
best_class = class_
best_prob = log_probability_current_class
first_run = False
return best_class
def predict(self,X_test):
# This can take some time to complete
Y_pred = []
for i in range(X_test.size):
# print(i) # Uncomment to see progress
Y_pred.append( self.__predictSinglePoint(X_test[i]) )
return Y_pred
def score(self,Y_pred,Y_true):
# returns the mean accuracy
count = 0
for i in range(len(Y_pred)):
if Y_pred[i] == Y_true[i]:
count+=1
return count/len(Y_pred)
Однако, когда я пытаюсь подогнать данные обучения к в этой модели есть ошибка, подобная этой.
TypeError: длина разреженной матрицы неоднозначна; используйте getnnz () или shape [0]
, затем я пытаюсь изменить данные поезда на плотный массив. Но это привело к ошибке, подобной этой.
IndexError: слишком много индексов для массива
Что мне делать? я выполнил предварительную обработку с использованием векторизатора tfidf для своих данных поезда, поэтому мои данные поезда выглядят следующим образом.
(0, 3838) 0.3188116041495794
(0, 1314) 0.47611391519517965
(0, 3852) 0.6748521310739798
(0, 4460) 0.46502613045074925
(1, 2997) 0.5124730713021854
(1, 7283) 0.37699134972197723
(1, 7363) 0.29325712956005184
(1, 3226) 0.3049856710575078
(1, 7461) 0.44783186231025657
(1, 2275) 0.3687679018146693
(1, 3308) 0.28229369020160777
Извините, если мой вопрос дублируется, потому что я до сих пор не получил решение для этого. Спасибо.