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

2 python numpy scipy

这是这个问题的另一面:余弦相似性产生'nan'值.在那个主题中,auther自己编写了指标,但我使用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
Run Code Online (Sandbox Code Playgroud)

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

PS:然后我从数组中删除"1"并执行:

m = np.argmax(books_similarity)
books_similarity[0,m]
Run Code Online (Sandbox Code Playgroud)

它返回"NaN"

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

War*_*ser 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
Run Code Online (Sandbox Code Playgroud)

这可能发生在您的代码中.在呼叫之前cosine,检查两个输入都不是全0.


PS我没有试图破译你用做什么Aratings,但我怀疑你最终要使用scipy.spatial.distance.cdist的说法method='cosine'.