jaccard相似度 java_如何从pandas数据框架计算jaccard相似度

本文介绍了如何使用scikit-learn库在Python中计算Pandas DataFrame中的Jaccard相似度。通过pairwise_distances函数和Hamming距离,可以快速计算数据集中两列之间的Jaccard相似度,并将其转换为DataFrame格式。此外,还提供了使用Jaccard_similarity_score函数进行计算的方法以及手动迭代计算的慢速方法。
摘要由CSDN通过智能技术生成

简短矢量化(快速)回答:

使用scikit成对距离中的“hamming”学习:from sklearn.metrics.pairwise import pairwise_distances

jac_sim = 1 - pairwise_distances(df.T, metric = "hamming")

# optionally convert it to a DataFrame

jac_sim = pd.DataFrame(jac_sim, index=df.columns, columns=df.columns)

说明:

假设这是您的数据集:import pandas as pd

import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.binomial(1, 0.5, size=(100, 5)), columns=list('ABCDE'))

print(df.head())

A B C D E

0 1 1 1 1 0

1 1 0 1 1 0

2 1 1 1 1 0

3 0 0 1 1 1

4 1 1 0 1 0

使用sklearn的jaccard_similarity_分数,A列和B列之间的相似度为:from sklearn.metrics import jaccard_similarity_score

print(jaccard_similarity_score(df['A'], df['B']))

0.43

这是在总行数100上具有相同值的行数。

据我所知,没有成对版本的雅卡相似性评分,但有成对版本的距离。Given two vectors, u and v, the Jaccard distance is the proportion of those elements u[i] and v[i] that disagree where at least one of them is non-zero.

所以它排除了两列都有0个值的行。jaccard_similarity_score没有。另一方面,Hamming distance与相似性定义是一致的:The proportion of those vector elements between two n-vectors u and v

which disagree.

因此,如果你想计算jaccard_similarity_分数,你可以使用1-hamming:from sklearn.metrics.pairwise import pairwise_distances

print(1 - pairwise_distances(df.T, metric = "hamming"))

array([[ 1. , 0.43, 0.61, 0.55, 0.46],

[ 0.43, 1. , 0.52, 0.56, 0.49],

[ 0.61, 0.52, 1. , 0.48, 0.53],

[ 0.55, 0.56, 0.48, 1. , 0.49],

[ 0.46, 0.49, 0.53, 0.49, 1. ]])

数据帧格式:jac_sim = 1 - pairwise_distances(df.T, metric = "hamming")

jac_sim = pd.DataFrame(jac_sim, index=df.columns, columns=df.columns)

# jac_sim = np.triu(jac_sim) to set the lower diagonal to zero

# jac_sim = np.tril(jac_sim) to set the upper diagonal to zero

A B C D E

A 1.00 0.43 0.61 0.55 0.46

B 0.43 1.00 0.52 0.56 0.49

C 0.61 0.52 1.00 0.48 0.53

D 0.55 0.56 0.48 1.00 0.49

E 0.46 0.49 0.53 0.49 1.00

您可以通过在列的组合上迭代来执行相同的操作,但速度会慢得多。import itertools

sim_df = pd.DataFrame(np.ones((5, 5)), index=df.columns, columns=df.columns)

for col_pair in itertools.combinations(df.columns, 2):

sim_df.loc[col_pair] = sim_df.loc[tuple(reversed(col_pair))] = jaccard_similarity_score(df[col_pair[0]], df[col_pair[1]])

print(sim_df)

A B C D E

A 1.00 0.43 0.61 0.55 0.46

B 0.43 1.00 0.52 0.56 0.49

C 0.61 0.52 1.00 0.48 0.53

D 0.55 0.56 0.48 1.00 0.49

E 0.46 0.49 0.53 0.49 1.00

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值