我有一个1x1000的超级数组。
su = np.ones(1000)
3个列表,(1,1000)之间的指数。
l1=random.sample(range(1, 1000), 320)
l2=random.sample(range(1, 1000), 340)
l3=random.sample(range(1, 1000), 412)
基本上这些列表代表w.r.t超级数组的索引,它们的值为1。
如何比较这三个列表,甚至不对它们进行膨胀或在超级数组上进行插值。
一个小例子--->
考虑这两个数组a1=[0,1,1,0,0];a2= [1,1,0,0,0]
它们都可以表示为a1_=[1,2]; a2_=[0,1]
,其索引值为1。现在很容易比较a1,a1的表示为
In [593]:cosine_distances(a1,a2)
Out[594]: array([[ 0.5]])
但如果以a1_, a2_
的形式给出,你会如何比较?这就是我正在问的问题
答案 0 :(得分:0)
我认为你正在寻找l1,l2,l3中的共同元素?您可以使用集合:
s1 = set(l1)
s2 = set(l2)
s3 = set(l3)
然后分别使用s1.intersection(s2)
和s1.difference(s2)
找到共同/不同的索引。一个简单的长度检查:
assert len(s1) == len(s1.intersection(s2)) + len(s1.difference(s2))
没有输出,因此长度按预期正确加起来。
答案 1 :(得分:0)
应该可以很容易地比较这两个向量之间的余弦相似性。对于余弦相似性,您需要每个向量的模数以及两个向量的点积。
由于向量只包含1和0,因此模数很容易,向量中的1的数量为平方根。
l1_mod = math.sqrt(len(l1))
l2_mod = math.sqrt(len(l2))
现在点积很棘手,你需要找出两个向量之间的共同元素的数量。您应该使用np.intersect1d
,因为您正在处理一维数组。
dot = len(np.intersect1d(l1, l2))
simililarity = dot / (l1_mod*l2_mod)
毋庸置疑,将其包装成单一功能!
答案 2 :(得分:0)
将a_
表单转换为a
表单很容易,其功能如下:
def foo(a_, n):
a = np.zeros(n,int)
a[a_] = 1
return a
In [1565]: foo([1,2],5)
Out[1565]: array([0, 1, 1, 0, 0])
In [1566]: foo([0,1],5)
Out[1566]: array([1, 1, 0, 0, 0])
使用简单列表,该函数会提供所需的值,但会显示警告。
In [1572]: a1=[0,1,1,0,0];a2= [1,1,0,0,0]
In [1573]: pairwise.cosine_distances(a1,a2)
/usr/lib/python3/dist-packages/sklearn/utils/validation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.
Out[1573]: array([[ 0.5]])
所以我需要修改我的foo
,这样它也会创建(1,5)数组:
def foo(a_, n):
a = np.zeros((1,n),int)
a[:,a_] = 1
return a
In [1575]: pairwise.cosine_distances(foo([1,2],5),foo([0,1],5))
Out[1575]: array([[ 0.5]])
cosine_distance
接受稀疏矩阵输入。
制作稀疏矩阵的最简单方法是使用密集数组,甚至使用a1
列表
In [1580]: from scipy import sparse
In [1592]: sparse.csr_matrix(a1)
Out[1592]:
<1x5 sparse matrix of type '<class 'numpy.int32'>'
with 2 stored elements in Compressed Sparse Row format>
In [1593]: sparse.csr_matrix(a1).A # view it as a dense array
Out[1593]: array([[0, 1, 1, 0, 0]], dtype=int32)
In [1594]: pairwise.cosine_distances( sparse.csr_matrix(a1), sparse.csr_matrix(a2))
Out[1594]: array([[ 0.5]])
作为中间步骤,我可以做到:
In [1581]: sparse.csr_matrix(foo([1,2],5))
Out[1581]:
<1x5 sparse matrix of type '<class 'numpy.int32'>'
with 2 stored elements in Compressed Sparse Row format>
下一步是直接从a_
格式制作稀疏矩阵。这需要更多关于稀疏矩阵的知识。
使用稀疏coo
输入样式:
In [1601]: sparse.csr_matrix(([1,1],([0,0],[1,2])), shape=(1,5)).A
Out[1601]: array([[0, 1, 1, 0, 0]], dtype=int32)
def mkcsr(a_, n):
col = np.array(a_)
row = np.zeros_like(col)
data = np.ones_like(col)
return sparse.csr_matrix((data, (row, col)), shape=(1,n))
In [1611]: mkcsr([1,2],5).A
Out[1611]: array([[0, 1, 1, 0, 0]], dtype=int32)
In [1614]: pairwise.cosine_distances(mkcsr([1,2],5), mkcsr([0,1],5))
Out[1614]: array([[ 0.5]])