余弦相似性产生'nan'值pt.II

时间:2016-08-30 15:29:05

标签: python numpy scipy

这是这个问题的另一面:Cosine similarity yields 'nan' values。 在那个主题中,作者自己编码了指标,但我使用了scipy的余弦:( ratings是71869x10000)

A = ratings[:,100]
A = A.reshape(1,A.shape[0])
books_similarity = np.empty([1, ratings.shape[0]])

for book in range(10000):
    books_similarity[0,book] = -cosine(A, ratings[:,book].reshape(1,A.shape[1]))+1

但它输出:0,一个1(对于它自己)和NaN。因此,我之前提到的主题中的解决方案不适合我,因为我使用scipy。我该怎么办?

P.S:然后我从数组中删除“1”并执行:

m = np.argmax(books_similarity)
books_similarity[0,m]

返回“NaN”

P.S.S:首先,我有一个pickle文件,将其解码为CSR,但随后使用了numpy。我想,我应该将所有内容都视为np数组,对吧?

1 个答案:

答案 0 :(得分:6)

如果其中一个输入向量全为0,则不定义余弦距离。scipy.spatial.distance.cosine在这种情况下返回nan

In [70]: a
Out[70]: array([0, 1, 1, 1, 0, 0, 0, 1, 0, 0])

In [71]: b
Out[71]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

In [72]: cosine(a, b)
/Users/warren/miniconda3/lib/python3.5/site-packages/scipy/spatial/distance.py:329: RuntimeWarning: invalid value encountered in true_divide
  dist = 1.0 - np.dot(u, v) / (norm(u) * norm(v))
Out[72]: nan

这可能发生在您的代码中。在调用cosine之前,请检查两个输入都不是全0。

P.S。我还没有尝试使用Aratings破译你正在做的事情,但我怀疑你最终会想要scipy.spatial.distance.cdist使用参数method='cosine' }。