Вычисление косинусного сходства: ValueError: вход должен быть 1- или 2-мерным - PullRequest
0 голосов
/ 16 июня 2020

надеюсь, что все в порядке. Я пытаюсь использовать следующий метод для эффективного вычисления косинусного сходства разреженной матрицы (29805, 40), созданной HashingVectorizing (Sklearn) в моем наборе данных. Метод ниже взят из ответа @Waylon Flinn на этот вопрос.

def cosine_sim(A):

    similarity = np.dot(A, A.T)

    # squared magnitude of preference vectors (number of occurrences)
    square_mag = np.diag(similarity)

    # inverse squared magnitude
    inv_square_mag = 1 / square_mag

    # if it doesn't occur, set it's inverse magnitude to zero (instead of inf)
    inv_square_mag[np.isinf(inv_square_mag)] = 0

    # inverse of the magnitude
    inv_mag = np.sqrt(inv_square_mag)

    # cosine similarity (elementwise multiply by inverse magnitudes)
    cosine = similarity * inv_mag
    return cosine.T * inv_mag

Когда я пытаюсь использовать фиктивную матрицу, все работает нормально.

A = np.random.randint(0, 2, (10000, 100)).astype(float)
cos_sim = cosine_sim(A)

но когда я пытаюсь использовать свою собственную матрицу ...

cos_sim = cosine_sim(sparse_matrix)

I get

ValueError: Input must be 1- or 2-d.

Теперь вызов .shape в моей матрице возвращает (29805, 40). Как это не 2-й? Может кто подскажет, что я здесь делаю не так? Ошибка возникает здесь (из трассировки ноутбука jupyter):

----> 6     square_mag = np.diag(similarity)

Спасибо за чтение! Для контекста вызов sparse_matrix возвращает это

<29805x40 sparse matrix of type '<class 'numpy.float64'>'
with 1091384 stored elements in Compressed Sparse Row format> 

Ответы [ 2 ]

1 голос
/ 16 июня 2020

np.diag начинается с

 v = asanyarray(v)

similarity = np.dot(A, A.T) работает с A sparse, потому что делегирует действие умножению разреженной матрицы. Результатом будет матрица sparse - вы можете проверить это сами.

Но затем попробуйте передать это на np.asanyarray.

0 голосов
/ 16 июня 2020

Хорошо, при вводе вопроса я попытался преобразовать в объект ndarray , и это сработало. По-прежнему публикуя вопрос и ответ, это может помочь кому-то другому. Ура!

Решение:

cos_sim = cosine_sim(sparse_matrix.A)
...