Ближайший сосед лечение ортогональных векторов - PullRequest
0 голосов
/ 22 января 2019

При использовании ближайших соседей (scikit) при классификации текста иногда нет сходства ни с одним из классов. Когда это происходит, алгоритм scikit возвращает расстояние 1 и, кажется, выбирает, казалось бы, случайный класс (он одинаков для каждого бега, но иногда меняется при повторном запуске). Было бы полезно, чтобы векторы были ортогональными и возвращали что-то конкретное, например None.

    vec = CountVectorizer(strip_accents='ascii', stop_words = stopwords, ngram_range=(1, 3))
    bag_of_words = vec.fit_transform(list(map(str, Property))) #reference
    tfidf_transformer = TfidfTransformer()
    X_train_tfidf = tfidf_transformer.fit_transform(bag_of_words.minimum(1))

    neigh = NearestNeighbors(n_neighbors = neighbors) 
    neigh.fit(X_train_tfidf)

    X_test_counts = vec.transform(wines_strings).minimum(1)

    res = neigh.kneighbors(X_test_counts, return_distance = True)

1 Ответ

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

Я решил просто добавить вычисление, чтобы определить, являются ли векторы ортогональными. Когда они ортогональны, я не обращаю внимания на то, что из ближайших соседей выплевывает

    a = X_train_tfidf@X_test_counts.transpose()
    indicator = a.transpose()*np.ones(a.get_shape()[0])
...