Python 如何计算scipy.sparse.csr.csr_矩阵列表的余弦相似性

Python 如何计算scipy.sparse.csr.csr_矩阵列表的余弦相似性,python,numpy,scipy,scikit-learn,cosine-similarity,Python,Numpy,Scipy,Scikit Learn,Cosine Similarity,我有一个稀疏向量列表: print(type(downsample_matrix)) # Display <class 'list'> print(type(downsample_matrix[0])) # Display <class 'scipy.sparse.csr.csr_matrix'> 当我的列表由nd.array组成时,我没有问题: print(type(downsample_matrix)) # Display <class 'list'>

我有一个稀疏向量列表:

print(type(downsample_matrix)) # Display <class 'list'>
print(type(downsample_matrix[0])) # Display <class 'scipy.sparse.csr.csr_matrix'>
当我的列表由
nd.array
组成时,我没有问题:

print(type(downsample_matrix)) # Display <class 'list'>
print(type(downsample_matrix[0])) # Display <class 'numpy.ndarray'>
打印(类型(下采样矩阵))#显示
打印(类型(下采样矩阵[0]))#显示
如何在Space向量列表上应用余弦相似性?

试试这个

from sklearn.metrics.pairwise import cosine_similarity
from scipy import sparse
import numpy as np

A =  np.array([[0, 1, 2, 0, 0], [0, 0, 1, 1, 2],[0, 1, 0, 1, 0]])
A_sparse = sparse.csr_matrix(A)

similarities = cosine_similarity(A_sparse)
print('pairwise dense output:\n {}\n'.format(similarities))
结果

pairwise dense output:
 [[ 1.          0.36514837  0.31622777]
 [ 0.36514837  1.          0.28867513]
 [ 0.31622777  0.28867513  1.        ]]
我的孩子

print (scipy.__version__)
0.19.0
试试这个

from sklearn.metrics.pairwise import cosine_similarity
from scipy import sparse
import numpy as np

A =  np.array([[0, 1, 2, 0, 0], [0, 0, 1, 1, 2],[0, 1, 0, 1, 0]])
A_sparse = sparse.csr_matrix(A)

similarities = cosine_similarity(A_sparse)
print('pairwise dense output:\n {}\n'.format(similarities))
结果

pairwise dense output:
 [[ 1.          0.36514837  0.31622777]
 [ 0.36514837  1.          0.28867513]
 [ 0.31622777  0.28867513  1.        ]]
我的孩子

print (scipy.__version__)
0.19.0

创建一个小的稀疏矩阵。请注意,它不是
ndarray
的子类。它将数据存储在3个数组中-数据和索引:

In [196]: M = sparse.csr_matrix([[0,1,0],[1,0,1]])
In [197]: M
Out[197]: 
<2x3 sparse matrix of type '<class 'numpy.int32'>'
    with 3 stored elements in Compressed Sparse Row format>
In [198]: M.data
Out[198]: array([1, 1, 1], dtype=int32)
In [199]: M.indices
Out[199]: array([1, 0, 2], dtype=int32)
In [200]: M.indptr
Out[200]: array([0, 1, 3], dtype=int32)
它无法将列表转换为数字数组

但如果是密集阵列列表,我会得到一个3d阵列:

In [204]: np.array([M.A,M.A,M.A],dtype=int)
Out[204]: 
array([[[0, 1, 0],
        [1, 0, 1]],

       [[0, 1, 0],
        [1, 0, 1]],

       [[0, 1, 0],
        [1, 0, 1]]])
In [205]: _.shape
Out[205]: (3, 2, 3)
我还可以将稀疏矩阵与稀疏版本的
vstack
hstack
连接起来

In [206]: sparse.vstack(alist)
Out[206]: 
<6x3 sparse matrix of type '<class 'numpy.int32'>'
    with 9 stored elements in Compressed Sparse Row format>
In [207]: _.A
Out[207]: 
array([[0, 1, 0],
       [1, 0, 1],
       [0, 1, 0],
       [1, 0, 1],
       [0, 1, 0],
       [1, 0, 1]], dtype=int32)

创建一个小的稀疏矩阵。请注意,它不是
ndarray
的子类。它将数据存储在3个数组中-数据和索引:

In [196]: M = sparse.csr_matrix([[0,1,0],[1,0,1]])
In [197]: M
Out[197]: 
<2x3 sparse matrix of type '<class 'numpy.int32'>'
    with 3 stored elements in Compressed Sparse Row format>
In [198]: M.data
Out[198]: array([1, 1, 1], dtype=int32)
In [199]: M.indices
Out[199]: array([1, 0, 2], dtype=int32)
In [200]: M.indptr
Out[200]: array([0, 1, 3], dtype=int32)
它无法将列表转换为数字数组

但如果是密集阵列列表,我会得到一个3d阵列:

In [204]: np.array([M.A,M.A,M.A],dtype=int)
Out[204]: 
array([[[0, 1, 0],
        [1, 0, 1]],

       [[0, 1, 0],
        [1, 0, 1]],

       [[0, 1, 0],
        [1, 0, 1]]])
In [205]: _.shape
Out[205]: (3, 2, 3)
我还可以将稀疏矩阵与稀疏版本的
vstack
hstack
连接起来

In [206]: sparse.vstack(alist)
Out[206]: 
<6x3 sparse matrix of type '<class 'numpy.int32'>'
    with 9 stored elements in Compressed Sparse Row format>
In [207]: _.A
Out[207]: 
array([[0, 1, 0],
       [1, 0, 1],
       [0, 1, 0],
       [1, 0, 1],
       [0, 1, 0],
       [1, 0, 1]], dtype=int32)

我的用例不同,如果所有稀疏向量都具有相同的维度(即位于相同的特征空间),我的矩阵A将充满稀疏向量@mel,首先将此列表转换为稀疏矩阵,然后按照建议使用sklearn的
cosine\u similarity
函数。我的用例不同,我的矩阵A将充满稀疏向量@mel,如果所有稀疏向量具有相同的维度(即生活在相同的特征空间中),请首先将此列表转换为稀疏矩阵,然后按照建议使用sklearn的
cosine\u similarity
函数。
np.array(array,…)
尝试将输入列表转换为一个数组。使用一个匹配的numpy数组列表进行测试。它不适用于稀疏矩阵。测试你的self.
sparse.hstack
sparse.vstack
是否可以将矩阵合并为一个。
np.array(array,…)
尝试将输入列表转换为一个数组。使用一个匹配的numpy数组列表进行测试。它不适用于稀疏矩阵。测试你的self.
sparse.hstack
sparse.vstack
是否可以将矩阵组合成一个矩阵。