- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有 20,000 个文档要为其计算真正的 Jaccard 相似度,以便我稍后可以检查 MinWise 哈希对其进行近似的准确度。
每个文档都表示为 numpy 矩阵中的一列,其中每一行都是一个出现在文档中 (entry=1) 或不出现 (entry=0) 的词。大约有 600 个单词(行)。
例如,第 1 列将是 [1 0 0 0 0 0 1 0 0 0 1 0],这意味着单词 1、7、11 出现在其中,没有其他单词出现。
除了我的逐元素比较方法之外,还有更有效的方法来计算相似度吗?我看不出如何使用集合来提高速度,因为集合刚刚变为 (0,1),但就目前而言,代码慢得不可思议。
import numpy as np
#load file into python
rawdata = np.loadtxt("myfile.csv",delimiter="\t")
#Convert the documents from rows to columns
rawdata = np.transpose(rawdata)
#compute true jacard similarity
ndocs = rawdata.shape[1]
nwords = rawdata.shape[0]
tru_sim = np.zeros((ndocs,ndocs))
#computes jaccard similarity of 2 documents
def jaccard(c1, c2):
n11 = sum((c1==1)&(c2==1))
n00 = sum((c1==0)&(c2==0))
jac = n11 / (nfeats-n00)
return (jac)
for i in range(0,ndocs):
tru_sim[i,i]=1
for j in range(i+1,ndocs):
tru_sim[i,j] = jaccard(rawdata[:,i],rawdata[:,j])
最佳答案
这是一个向量化的方法-
# Get the row, col indices that are to be set in output array
r,c = np.tril_indices(ndocs,-1)
# Use those indicees to slice out respective columns
p1 = rawdata[:,c]
p2 = rawdata[:,r]
# Perform n11 and n00 vectorized computations across all indexed columns
n11v = ((p1==1) & (p2==1)).sum(0)
n00v = ((p1==0) & (p2==0)).sum(0)
# Finally, setup output array and set final division computations
out = np.eye(ndocs)
out[c,r] = n11v / (nfeats-n00v)
用np.einsum
计算n11v
和n00v
的替代方法| -
n11v = np.einsum('ij,ij->j',(p1==1),(p2==1).astype(int))
n00v = np.einsum('ij,ij->j',(p1==0),(p2==0).astype(int))
如果 rawdata
仅由 0s
和 1
组成,获取它们的更简单方法是 -
n11v = np.einsum('ij,ij->j',p1,p2)
n00v = np.einsum('ij,ij->j',1-p1,1-p2)
基准测试
函数定义-
def original_app(rawdata, ndocs, nfeats):
tru_sim = np.zeros((ndocs,ndocs))
for i in range(0,ndocs):
tru_sim[i,i]=1
for j in range(i+1,ndocs):
tru_sim[i,j] = jaccard(rawdata[:,i],rawdata[:,j])
return tru_sim
def vectorized_app(rawdata, ndocs, nfeats):
r,c = np.tril_indices(ndocs,-1)
p1 = rawdata[:,c]
p2 = rawdata[:,r]
n11v = ((p1==1) & (p2==1)).sum(0)
n00v = ((p1==0) & (p2==0)).sum(0)
out = np.eye(ndocs)
out[c,r] = n11v / (nfeats-n00v)
return out
验证和计时 -
In [6]: # Setup inputs
...: rawdata = (np.random.rand(20,10000)>0.2).astype(int)
...: rawdata = np.transpose(rawdata)
...: ndocs = rawdata.shape[1]
...: nwords = rawdata.shape[0]
...: nfeats = 5
...:
In [7]: # Verify results
...: out1 = original_app(rawdata, ndocs, nfeats)
...: out2 = vectorized_app(rawdata, ndocs, nfeats)
...: print np.allclose(out1,out2)
...:
True
In [8]: %timeit original_app(rawdata, ndocs, nfeats)
1 loops, best of 3: 8.72 s per loop
In [9]: %timeit vectorized_app(rawdata, ndocs, nfeats)
10 loops, best of 3: 27.6 ms per loop
那里有一些神奇的 300x+
加速!
那么,为什么它这么快?嗯,这涉及很多因素,最重要的一个因素是 NumPy 数组是为提高性能而构建的,并针对矢量化计算进行了优化。通过提议的方法,我们很好地利用了它,因此看到了这样的加速。
这是一个related Q&A
详细讨论了这些性能标准。
关于python - 在 Python 中计算 Jaccard 相似度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40579415/
我的表如下所示: author | group daniel | group1,group2,group3,group4,group5,group8,group10 adam | group2,g
我正在参加分布式系统考试,我试图解决去年考试中的一个 MapReduce 问题。但我很难弄清楚我将创建哪些 MR 功能。该练习是关于处理包含 {userID, movieID, timestamp}
我想根据标准代码列表的存在/不存在来计算两个数据集之间的 Jaccard 相似度。例如(x,y,z 是数据集):数据集 x 和 y 没有任何标准代码(Null),因此我将列表值设置为零。 x = [
是否可以使用 scikit-learn(或另一个著名的 python 包)来获取一对集合之间的 Jaccard 相似度? 我只看到 sklearn jaccard_similarity_score f
我想使用 Jaccard 计算距离矩阵距离。并尽快这样做。我曾经使用 scikit-learn's pairwise_distances功能。但是 scikit-learn 并不打算支持 GPU,甚至
我希望能够计算一个矩形相对于矩形网格的 Jaccard 分数/距离(距离为 1 分)。我的网格是 50x50(总共 1625625 个矩形)。 我能够在 0.34 秒内针对所有这些计算出我的输入矩形的
我需要什么 我正在寻找非常快速和准确的方法来找到多个庞大数据集之间的 Jaccard 相似性。我最多可以进行 10.000-20.000 次计算 Jaccard 相似度的操作。由于需要在转储该数据集后
是否有一种有效的方法可以使用 Jaccard 相似度对图中的节点进行聚类,使得每个聚类至少有 K 个节点? 节点i和j之间的Jaccard相似度: 令S为i的邻居集code> 和 T 是 j 的邻居集
我没有意识到 Python set 函数实际上将字符串分成单独的字符。我为 Jaccard 编写了 python 函数并使用了 python 交集方法。我将两个集合传递给此方法,在将这两个集合传递给我
有人可以提供一个关于如何在 pytorch 中为语义分割计算 IoU(交集对联合)的玩具示例吗? 最佳答案 我在某处找到了它并为我改编了它。如果我能再次找到它,我会发布链接。抱歉,如果这是重复的。 这
我想在 stringdist 函数中使用 Jaccard 相似度来确定词袋的相似度。据我所知,使用 Jaccard 只能匹配字符串中的字母。 c <- c('cat', 'dog', 'person'
我需要使用 Jaccard similarity over n-grams 计算 Lucene 中查询和文档的相似性。由于 Jaccard 相似度是 IR 中非常常见的度量,我希望找到它的 Lucen
Rand 和 Jaccard 相似性/验证指数之间的理论区别是什么? 我对方程式不感兴趣,但对它们的差异的解释感兴趣。 我知道 Jaccard 指数会忽略真负值,但为什么呢?这会产生什么样的影响? 谢
我需要计算所有文本行对的杰卡德相似度。我只希望输出相似度高于 80% 的对。过去我研究过 Hadoop MapReduce 框架,这就是我如何使用 Map 和 Reduce 函数解决这个问题: map
我试图理解 2 个 double 型数组之间的“Jaccard 相似性”,这些数组的值大于零且小于一。 到目前为止,我已经在很多网站上搜索过这个,但我发现两个数组的大小应该相同(数组 1 中的元素数应
我有一批形状为 (bs, m, n) 的向量(即维度为 mxn 的 bs 向量)。对于每个批处理,我想计算第一个向量与其余 (m-1) 个向量的 Jaccard 相似度 例子: a = [ [
给定 2 个巨大的值列表,我正在尝试计算 jaccard similarity它们之间使用 Scala 在 Spark 中。 假设 colHashed1包含第一个值列表和 colHashed2包含第二
我有一个数据框,如: animal ids cat 1,3,4 dog 1,2,4 hamster 5 dolphin 3,5 数据框非常大,有超过
我正在尝试计算大名称向量中每对名称之间的 jaccard 相似度(请参阅下面的小示例)并将它们的 jaccard 相似度存储在矩阵中。我的函数只是返回 NULL。我做错了什么? library(dpl
我正在尝试使用 Lucene 获得基于 Jaccard 的分数。我已成功获取每个文档的术语数量,我只需要找到每个文档中找到的查询术语数量。在搜索 Lucene 的 Javadocs 时,我遇到了 sc
我是一名优秀的程序员,十分优秀!