Низкое приближение ранга с использованием scipy - PullRequest
0 голосов
/ 18 мая 2019

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

Предположим, у меня есть словарь с 40 000 слов и 2000 документов. Тогда моя матрица по документам составляет 40 000 x 2000. Согласно википедии, я должен сделать SVD матрицы и затем применить

enter image description here

Это код, который я использую для SVD и аппроксимации низкого ранга (матрица разрежена):

import scipy
import numpy as np

u, s, vt = scipy.sparse.linalg.svds(search_matrix, k=20)
search_matrix = u @ np.diag(s) @ vt

print('u: ', u.shape) # (40000, 20)
print('s: ', s.shape) # (20, )
print('vt: ', vt.shape) # (20, 2000)

Матрица результатов: (40 000 x 20) * (20 x 20) * (20, 2000) = 40 000 x 2000, что я и начал.

Итак ... как приближение низкого ранга точно уменьшает размеры матрицы?

Кроме того, я буду выполнять запросы к этой приближенной матрице, чтобы найти корреляцию между вектором пользователя и каждым документом (наивная поисковая система). Пользовательский вектор имеет размеры 40 000 x 1 для начала ( мешок слов ). Согласно той же странице википедии, это то, что я должен сделать:

enter image description here

код:

user_vec = np.diag((1 / s)) @ u.T @ user_vec

И он производит матрицу 20 х 1, что я и ожидал! ((20 х 20) * (20 х 40 000) * (40 000 х 1) = (20 х 1)). Но теперь у него есть измерения, которые не соответствуют search_matrix, с которым я хочу умножить его.

Итак ... Что я делаю не так и почему?

Источники:

...