【问题标题】:Cosine similarity yields 'nan' values pt.II余弦相似度产生“nan”值 pt.II
【发布时间】:2016-08-31 00:35:22
【问题描述】:

这是这个问题的另一面: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 数组,对吧?

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    如果输入向量之一全为 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。


    附:我没有尝试破译你在用Aratings 做什么,但我怀疑你最终会想要使用scipy.spatial.distance.cdistmethod='cosine' 参数。

    【讨论】:

    • 它很有用,但是,这无疑是我的代码中没有发生的事情。所有 vectros 至少有一个“1”元素
    • 你能找到导致nan的特定向量对吗?如果是这样,请将其添加到问题中。没有您的数据,我们只能猜测。
    猜你喜欢
    • 2016-02-12
    • 2020-08-12
    • 2011-01-01
    • 2017-12-12
    • 2013-05-24
    • 1970-01-01
    • 2011-08-16
    • 2021-06-13
    相关资源
    最近更新 更多