这是这个问题的另一面: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数组,对吧?答案 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。我还没有尝试使用A
和ratings
破译你正在做的事情,但我怀疑你最终会想要scipy.spatial.distance.cdist
使用参数method='cosine'
}。