TypeError: длина разреженной матрицы неоднозначна; используйте getnnz () или shape [0] - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь сделать многочленный наивный байесовский классификатор без использования 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

Извините, если мой вопрос дублируется, потому что я до сих пор не получил решение для этого. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...