Производительность различных продуктов с разреженной матрицей с использованием Scipy - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть матрица терминов документа в качестве разреженной матрицы (или матрицы csr, или матрицы coo), и вектор признаков, для которого я хочу провести сравнение сходства.У меня есть следующие методы, которые я хочу попробовать:

1.) С матрицей doc в качестве матрицы csr, превратить ее в ndarray, а затем перебрать строки и выполнить аналогичный косинус, используя scikit, узнает сходство косинусовndarrays.

2.) с матрицей doc в качестве матрицы csr, превратите ее в ndarray, а затем произведите матричное произведение матрицы на вектор и поделите на величины и обратный косинус, чтобы получить оценки подобия

3.) С матрицей doc в качестве матрицы охлаждения, используйте функцию zip для быстрой итерации по индексам (отслеживая, в какой строке вы находитесь) и выполняйте косинусное сходство, не используя преимущества векторизации ndarrays

Метод fisrt имеет низкую производительность памяти для больших матриц (поскольку необходимо преобразовать его в плотную форму), хотя он использует преимущества метода быстрой векторизации и подобия встроенного косинуса.

Второй метод также имеетнизкая производительность памяти, но использует векторизациюe, чем первый метод, хотя он требует больше операций (хотя эти операции также будут векторизованы), но не может использовать встроенный метод сходства косинусов

Третий метод сохраняет разреженность матрицы за счет скорости векторизации, но метод zip итерации по матрице coo быстр для больших матриц.Эта реализация была бы более грязным кодом и не имела бы векторизации.

Какой метод был бы лучшим?

Наконец, мне было интересно, есть ли способ перебирать строки матрицы csr (как ndarrays), а затем сделать сходство векторизованного косинуса.Этот метод только превращает отдельные строки в плотную форму и учитывает косинусное сходство, используя встроенные функции, таким образом, являясь промежуточным способом, который сохраняет разреженность до некоторой степени, а также допускает векторизованные операции.Есть ли способ сделать это легко?

1 Ответ

0 голосов
/ 10 декабря 2018

Вам не нужно приводить свою разреженную матрицу в виде плотного массива с нолью, вы можете использовать ее атрибут .dot(): term_doc.dot(feat_vec)

sparse.linalg полезен для вычисления нормы по строке безприведение к массиву:

from scipy import sparse
sparse.linalg.norm(term, axis=1)

Это дает вам все необходимое для вычисления косинусного сходства

...