Как я могу использовать sklearn.naive_bayes с (несколькими) категориальными функциями?

Я нашел эту ветку несколько дней назад и повторно написал решение nibot , и, сократив количество итераций пополам и выполняя некоторые другие незначительные улучшения производительности, я смог улучшить производительность с помощью фактор ~ 2.4:

def isqrt(n):
    a = 0 # a is the current answer.
    r = 0 # r is the current remainder.
    for s in reversed(range(0, n.bit_length(), 2)): # Shift n by s bits.
        t = n >> s & 3 # t is the two next most significant bits of n.
        r = r << 2 | t # Increase the remainder as if no new bit is set.
        c = a << 2 | 1 # c is an intermediate value used for comparison.
        b = r >= c     # b is the next bit in the remainder.
        if b: 
            r -= c     # b has been set, so reduce the remainder.
        a = a << 1 | b # Update the answer to include b.
    return (a, r)

Вот результаты из timeit:

>>> timeit('isqrt(12345678901234567890)', setup='from __main__ import isqrt')
8.862877120962366

Затем для сравнения я применил наиболее часто используемый алгоритм с квадратным корнем: Метод Ньютона . Это определение гораздо более компактно.

def isqrt(n):
    x, y = n, n >> 1
    while x > y:
        x, y = y, (y + n//y) >> 1
    return (x, n - x*x)

Оказывается, что даже оптимизированная версия длинномерных квадратных корней медленнее метода Ньютона, занимая примерно в 1,5 раза.

>>> timeit('isqrt(12345678901234567890)', setup='from __main__ import isqrt')
5.74083631898975

Итак, в заключение, если вам нужна быстрая чистая функция квадратного корня Python, посмотрите не дальше, чем приведенная выше.

Изменить: я исправил ошибку в методе Ньютона выше. На моей машине он работает на ~ 10% быстрее, чем user448810. .

18
задан Ami Tavory 29 July 2016 в 05:56
поделиться

1 ответ

  1. CategoricalNB scikit-учатся, новый класс, который будет добавлен в naive_bayes модуле. Это находится в ночной сборке здесь .

  2. Смешанный Наивный Байесов ( https://github.com/remykarem/mixed-naive-bayes). Это может принять соединение Гауссовых и категориальных (multinoulli) дистрибутивов на функциях обучающих данных. Библиотека записана таким образом, что API подобны scikit-learn's.

from mixed_naive_bayes import MixedNB
X = [[0, 0],
     [1, 1],
     [2, 1],
     [1, 1],
     [0, 2]]
y = [0, 0, 1, 1, 0]
clf = MixedNB(categorical_features='all')
clf.fit(X,y)
clf.predict(X)

Посмотрите мой ответ в подобном вопросе здесь https://stackoverflow.com/a/58428035/4570466.

0
ответ дан 30 November 2019 в 04:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: