Python 是否可以仅使用非空值使用行之间的余弦相似性?

Python 是否可以仅使用非空值使用行之间的余弦相似性?,python,pandas,trigonometry,Python,Pandas,Trigonometry,我想找到一个查询行和10个其他行之间的余弦相似性(或欧几里德距离,如果更容易的话)。这些行充满了nan值,因此如果列为nan,则将忽略这些值 比如说,, 查询: A B C D E F 3 2 NaN 5 NaN 4 df= 所以我只想得到查询的每个非空列和df中的行在列中的余弦相似性。因此,对于df中的行0,A、B和F在查询和df中都是非null的 然后我想打印每行的余弦相似性 提前感谢我能想到的最简单的方法就是使用 “忽略”NaN的最简单方法是在计算相似度时

我想找到一个查询行和10个其他行之间的余弦相似性(或欧几里德距离,如果更容易的话)。这些行充满了nan值,因此如果列为nan,则将忽略这些值

比如说,, 查询:

A   B   C   D   E   F
3   2  NaN  5  NaN  4
df=

所以我只想得到查询的每个非空列和df中的行在列中的余弦相似性。因此,对于df中的行0,A、B和F在查询和df中都是非null的

然后我想打印每行的余弦相似性


提前感谢

我能想到的最简单的方法就是使用

“忽略”NaN的最简单方法是在计算相似度时将其视为零

对于欧几里德-这忽略了计算中的nan

对于余弦相似性,您不能简单地填充NA,因为这将改变您的相似性分数。相反,取df的子集,计算不包含空值的列之间的余弦相似性

对于您的示例dataframe,这将计算所有行之间的余弦相似性,仅使用列A和F,跨查询和行1使用A、B和F,跨查询和行2使用A、D和F。您需要按照某种排序来选择分数

combinations = []
df.apply(lambda x: combinations.append(list(x.dropna().index)), axis=1)

# remove duplicate null combinations
combinations = [list(item) for item in set(tuple(row) for row in combinations)]

for i in combinations:
    pdist(df[i].dropna(), metric='cosine')

这难道不影响相似性吗?例如,如果我得到一个值20和0之间的余弦相似性,那么总的余弦相似性将远远不同于仅仅找到公共列?@toothsie为什么你认为会这样?我建议看一下余弦相似性的公式并找出它。是的,也许我脑子里的公式错了。Thanks@cs95这个答案是不正确的。考虑两个向量<代码> u=[1, 3, 4 ] < /代码>和<代码> v=(5, 6, 7,8)< /代码>,即,<代码> u>代码>的第二个元素是空的。在相似度计算过程中,您应该忽略
v
的第二个元素。通过将
u
的第二个元素设置为
0
,可以有效地将
v
的第二个元素包括在计算中,这会影响余弦距离的分母。请在此处同意@steptom。让我们看问题中的两行。如果忽略任一元素为NaN的对,
x=np.array([2,3,5])重塑(1,-1);y=np.数组([1,2,3])。重塑(1,-1)
cosine\u相似性(x,y)
返回
0.99717646
。然而,
x=np.array([2,1,3,0,4,5])。重塑(1,-1);y=np.数组([1,0,2,4,0,3])。重塑(1,-1)
返回
0.56622086
from sklearn.metrics.pairwise import cosine_similarity
cosine_similarity(df.fillna(0), df1.fillna(0))
# array([[0.51378309],
#        [0.86958199]])
combinations = []
df.apply(lambda x: combinations.append(list(x.dropna().index)), axis=1)

# remove duplicate null combinations
combinations = [list(item) for item in set(tuple(row) for row in combinations)]

for i in combinations:
    pdist(df[i].dropna(), metric='cosine')