简短且向量化(快速)的答案:
从scikit的成对距离使用“汉明”学习:
from sklearn.metrics.pairwise import pairwise_distancesjac_sim = 1 - pairwise_distances(df.T, metric = "hamming")# optionally convert it to a Dataframejac_sim = pd.Dataframe(jac_sim, index=df.columns, columns=df.columns)
说明:
假设这是您的数据集:
import pandas as pdimport numpy as npnp.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 E0 1 1 1 1 01 1 0 1 1 02 1 1 1 1 03 0 0 1 1 14 1 1 0 1 0
使用sklearn的jaccard_similarity_score,A列和B列之间的相似度为:
from sklearn.metrics import jaccard_similarity_scoreprint(jaccard_similarity_score(df['A'], df['B']))0.43
这是在总行数100中具有相同值的行数。
据我所知,没有jaccard_similarity_score的成对版本,但有距离的成对版本。
但是,SciPy定义Jaccard距离如下:
给定两个向量u和v,Jaccard距离是那些元素u [i]和v [i]在其中至少一个为非零的地方不一致的比例。
因此,它排除了两列均为0的行。jaccard_similarity_score没有。另一方面,汉明距离符合相似性定义:
这些向量元素在两个不同的n个向量u和v之间的比例。
因此,如果要计算jaccard_similarity_score,则可以使用1-汉明:
from sklearn.metrics.pairwise import pairwise_distancesprint(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. ]])
在Dataframe格式中:
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 EA 1.00 0.43 0.61 0.55 0.46B 0.43 1.00 0.52 0.56 0.49C 0.61 0.52 1.00 0.48 0.53D 0.55 0.56 0.48 1.00 0.49E 0.46 0.49 0.53 0.49 1.00
您可以通过遍历列的组合来执行相同的 *** 作,但是会慢得多。
import itertoolssim_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 EA 1.00 0.43 0.61 0.55 0.46B 0.43 1.00 0.52 0.56 0.49C 0.61 0.52 1.00 0.48 0.53D 0.55 0.56 0.48 1.00 0.49E 0.46 0.49 0.53 0.49 1.00
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)