Numpy相似度过滤结果异常:不同分组计算出现矛盾
分组计算余弦相似度结果不符合预期问题
我有一个样本DataFrame(共98行,原始数据有数百万行),包含4个数值列、1个ID列和1个集群ID列。我编写了一个函数,通过两种方式应用于该DataFrame:
- 场景A:按
individual分组后应用函数 - 场景B:同时按
individual和cluster分组后应用函数
函数代码
def vectorized_similarity_filtering2(df, cols = ["scaledPrice", "scaledAirlines", "scaledFlights", "scaledTrip"]): from sklearn.metrics.pairwise import cosine_similarity arr = df[cols].to_numpy() b = arr[..., None] c = arr.T[None, ...] # 过滤条件:当前行所有维度值均小于等于另一行,且至少一个维度值更小 mask = (((b <= c).all(axis=1)) & ((b < c).any(axis=1))) mask |= mask.T sims = np.where(mask, np.nan, cosine_similarity(arr)) return np.sum(sims >= 0.6, axis = 1)
函数执行步骤
- 将当前行与所有其他行进行比较
- 过滤掉所有在所有维度上当前行值均小于等于,且至少在一个维度上值更小的行
- 对剩余行,计算其与当前行的余弦相似度
- 统计相似度矩阵中大于等于0.6的元素数量并返回结果
按逻辑,场景A中每个individual下所有行的计算结果应不小于场景B的对应结果——因为场景B的分组内可比较的元素更少。但实际发现部分行的场景B结果反而更多,这不符合预期,希望有人能解释代码或我的理解中存在的问题。
复现步骤代码
# df为目标DataFrame g = df.groupby("individual") gc = df.groupby(["individual", "cluster"]) caseA = np.concatenate(g.apply(lambda x: vectorized_similarity_filtering2(x)).values) caseB = np.concatenate(gc.apply(lambda x: vectorized_similarity_filtering2(x)).values) caseA >= caseB
执行结果
array([ True, True, True, True, True, True, True, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, False, True, True, True, True, True, True, True, True, True, True, True, True, False, True, True, True, True, True, True, True, True, True, True, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True])
内容的提问来源于stack exchange,提问作者Emil Mirzayev
相关产品推荐
相关产品推荐

