Я думаю, что легче объяснить мою проблему на примере.SQL для расчета коэффициента Tanimoto нескольких векторов
У меня есть один стол с ингредиентами для рецептов, и я внедрил функцию для вычисления Tanimoto coefficient между ингредиентами. Это достаточно быстро, чтобы вычислить коэффициент между двумя ингредиентами (требуется 3 sql-запроса), но он недостаточно масштабируется. Чтобы вычислить коэффициент между комбинацией всех возможных ингредиентов, ему нужны N + (N * (N-1))/2 запроса или 500500 запросов всего за 1 000 ингредиентов. Есть ли более быстрый способ сделать это? Вот что я получил до сих пор:
class Filtering():
def __init__(self):
self._connection=sqlite.connect('database.db')
def n_recipes(self, ingredient_id):
cursor = self._connection.cursor()
cursor.execute('''select count(recipe_id) from recipe_ingredient
where ingredient_id = ? ''', (ingredient_id,))
return cursor.fetchone()[0]
def n_recipes_intersection(self, ingredient_a, ingredient_b):
cursor = self._connection.cursor()
cursor.execute('''select count(drink_id) from recipe_ingredient where
ingredient_id = ? and recipe_id in (
select recipe_id from recipe_ingredient
where ingredient_id = ?) ''', (ingredient_a, ingredient_b))
return cursor.fetchone()[0]
def tanimoto(self, ingredient_a, ingredient_b):
n_a, n_b = map(self.n_recipes, (ingredient_a, ingredient_b))
n_ab = self.n_recipes_intersection(ingredient_a, ingredient_b)
return float(n_ab)/(n_a + n_b - n_ab)
Действительно любопытно, почему вы решили использовать Tanimoto, а не косинус или другие алгоритмы подобия. Я смотрю на выполнение подобных вычислений и хотел бы услышать ваши причины. –