Я пытаюсь использовать аппроксимация низкого ранга для скрытой семантической индексации . Я думал, что приближение низкого ранга уменьшает размеры матрицы, но это противоречит полученным результатам.
Предположим, у меня есть словарь с 40 000 слов и 2000 документов. Тогда моя матрица по документам составляет 40 000 x 2000.
Согласно википедии, я должен сделать SVD матрицы и затем применить
Это код, который я использую для 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 для начала ( мешок слов ). Согласно той же странице википедии, это то, что я должен сделать:
код:
user_vec = np.diag((1 / s)) @ u.T @ user_vec
И он производит матрицу 20 х 1, что я и ожидал!
((20 х 20) * (20 х 40 000) * (40 000 х 1) = (20 х 1)). Но теперь у него есть измерения, которые не соответствуют search_matrix, с которым я хочу умножить его.
Итак ... Что я делаю не так и почему?
Источники: