У меня проблемы с вычислением косинусного сходства между большим списком 100-мерных векторов.Когда я использую from sklearn.metrics.pairwise import cosine_similarity
, я получаю MemoryError
на моем компьютере с 16 ГБ.Каждый массив отлично вписывается в мою память, но я получаю MemoryError
во время np.dot()
внутреннего вызова
Вот мой пример использования и как я в настоящее время решаю его.
Вот мой родительский вектор 100-мерение, которое мне нужно сравнить с другими 500 000 различных векторов того же измерения (т.е. 100)
parent_vector = [1, 2, 3, 4 ..., 100]
Вот мои дочерние векторы (с некоторыми выдуманными случайными числами для этого примера)
child_vector_1 = [2, 3, 4, ....., 101]
child_vector_2 = [3, 4, 5, ....., 102]
child_vector_3 = [4, 5, 6, ....., 103]
.......
.......
child_vector_500000 = [3, 4, 5, ....., 103]
Моя конечная цель состоит в том, чтобы получить топ-N дочерних векторов (с их именами, такими как child_vector_1
и их соответствующий показатель косинуса), которые имеют очень высокое сходство косинусов с родительским вектором.
Мой текущий подход(который, как я знаю, неэффективен и занимает много памяти):
Шаг 1: Создание супердатафрейма следующей формы
parent_vector 1, 2, 3, ....., 100
child_vector_1 2, 3, 4, ....., 101
child_vector_2 3, 4, 5, ....., 102
child_vector_3 4, 5, 6, ....., 103
......................................
child_vector_500000 3, 4, 5, ....., 103
Шаг 2: Используйте
from sklearn.metrics.pairwise import cosine_similarity
cosine_similarity(df)
, чтобы получить парное косинусное сходство между всеми векторами (показано на приведенном выше кадре данных)
Шаг 3: Составьте список кортежей для храненияkey
, например child_vector_1
, и значение, такое какчисло сходства косинусов для всех таких комбинаций.
Шаг 4: Получите верхний N, используя sort()
списка - так что я получу имя дочернего вектора, а также его сходство косинусовоценка с родительским вектором.
PS: я знаю, что это крайне неэффективно, но я не мог придумать лучшего способа быстрее вычислить косинусное сходство между каждым из дочернего вектора и родительского вектора и получить верхнюю-N значения.
Любая помощь будет принята с благодарностью.