使用稀疏向量在非常高的维空间中找到紧密对


9

我有N(约一百万个)特征向量。有(〜一百万)个二元特征,但是在每个向量中,只有(〜一千)为,其余为。我正在寻找具有至少(〜一百)个共同特征(两个都为)的向量对。此类对的数量与(〜一百万)相似。K 1 0 L 1 NMK10L1N

我认为这可以在非常高维的空间中寻找闭合点对来解决。距离函数可以基于两个向量共有多少个特征。但这对于更常规的距离度量(例如欧几里得)可能也很有用。

哪些知名算法对解决此问题有用?或二次方都是不切实际的。中号NM


问题的现实表达示例是考虑个人在多个位置之间移动。如果两个人同时在同一地点,我们说他们会面。(存在至少1个人的位置时间组合的数量为)我们正在寻找朋友:至少遇到次的人。M LNML


1
如果向量1的特征1为,向量2的特征1也为,那么它们具有“共同的”特征吗?000
gung-恢复莫妮卡

@ user777,我假设为no,在这种情况下,您的答案是完美的,但是由OP明确声明这一点将是很好的。
gung-恢复莫妮卡

@gung,你假设是对的。我已编辑问题以澄清问题。谢谢!
Daniel Darabos 2015年

1
大约有几对向量具有> 100个共同特征-随机样本+蛮力?1M x 1M的尺寸是一个真正的问题,还是构成了?另请参见关于stackoverflow的位字符串最近邻搜索中的方法。
丹尼斯,

1
一个可能疯狂的建议:将您的1 Mbit长特征向量查看为1000 x 1000像素的图像,并查找图像聚类的方法,例如stackoverflow.com/search?q=[image]+clustering。Afaik,您必须找到良好的功能(而不是单个像素)才能正常工作,但我不是专家。
denis

Answers:


6

看起来您正在寻找的方法是将minhash签名与本地敏感哈希(LSH)结合使用;大量数据集挖掘(免费提供)pdf 在第3章中详细介绍了这种方法(以及其他相似性度量),但简要介绍了:

最小哈希签名是原始的矩阵的压缩表示,其通过施加一些数目构造Ñ的散列函数对特征,从而减少每次观测的特征的数量。这样可以减少数据的大小,但是您可能会注意到,这仍然给您带来问题。O(N2)

为了解决这个问题,MMDS建议,如果您要查找的所有对都在某个相似性阈值之上(这似乎适用于您的情况),那么您只能关注那些最可能相似的对-这种方法称为“ 本地敏感哈希”,在3.4节中,他们将通过一个示例将minhash签名方法与LSH相结合。

除课文外,还提供同名Coursera课程的讲座。


7

我正在寻找共有至少特征的向量对。L

这只是二进制特征向量的内在产物。当内积大于,一对将具有至少大号中共同的元件。这应该是一个相对较快的计算-至少比欧几里得距离快,这对于该数据将是浪费且缓慢的。因为你规定你要找对,这本身意味着你必须做 ñL1L计算以比较每个向量。(N2)

找到彼此靠近的点确实是一个聚类问题。但是,我所熟悉的聚类算法的第一步是计算成对的距离或相似度。我敢肯定有人已经开发出更有效的替代方法。关于术语的要点:至少有共同邻居被表述为相似性,而不是距离!在这种情况下,内积是未归一化的余弦相似度。L

通过仅当观察的特征向量之和(在这种情况下与范数相同)大于,才执行内积计算,可以使此操作更容易处理,因为该二进制特征向量是不可能的具有与另一个二进制特征向量的内积,当该总和小于时,它将满足我的标准。显然,计算这些和仅是复杂度,因此我是降低内积步骤幅度的一种廉价方法。L O N L1LO(N)

但是,减小此问题范围的经典方法是执行附加的预过滤。当一个不太常见的功能取值为1时,您是否特别感兴趣?如果是这样,则仅对那些特征向量执行计算。

也许您可以从重新构架问题中受益。例如,采样具有良好的属性;推论统计学在这个思想上发展了相当深的层次。因此,分析整个数据集也许是不可行的,但是检查一个小样本是完全可行的。我不知道您要回答什么问题,但是,如果您精心设计实验,则可能只看几千个观察值,而剩下的数据就足够验证了。

一些额外的想法后,我有一种强烈的预感,你正在使用的数据是某种图形。由几个连接的组件组成是非常合理的,在这种情况下,您可以将分解为一组图形,同时还具有减少数据维数的副作用。即使图只是两个连接的组件,它们的大小大致相同,这也意味着成对比较的总成本大约为!G G O N 21GGGO(N2)14

如果图形是对称的,则以下观察可能会有所帮助:

  1. 将图的拉普拉斯定义为,其中D是度的对角矩阵(每个特征向量的总和), A是邻接矩阵(特征向量堆叠成矩阵)。P=DADA
  2. 的次数显示为的特征值P是连接部件的数量ģ。将图形分解成其连接的组件并单独使用这些组件将产生减小数据维度的副作用。计算您的兴趣量会更容易。但是计算特征分解对于一百万个顶点将是昂贵的。0PG
  3. (在完全置换之后)G的连通分量的拉普拉斯算子的块对角矩阵。PG
  4. 是正半定号。几乎可以肯定这是有用的。P
  5. 的代数连通性是P的第二小特征值的值。这告诉您G的连接程度。也许这将回答您感兴趣的一些问题:具有共同特征的向量。频谱图理论更详细地提出了这个想法。GPG

“这是SNA问题吗?” 我不确定。在一个应用程序中,这些功能描述了行为,我们正在寻求将具有类似行为的人联系起来。这会导致SNA问题吗?

如果您有一个将人与行为联系起来的二部图,则可以将其视为隶属网络,其中人作为行,行为作为列。如果你想连接的人通过他们共有的行为的人,你可以计算牛逼 = 一个A i j是人们共有的行为数量。显然,顶点集,其中的一个Ĵ大号回答你的问题。BBBT=AAijAijL


感谢您的出色回答!我将不得不进一步研究很多事情。但是,我不能确信成对比较是不可避免的。这不是我正在寻找大小> 1的集群的集群问题吗?我期望某些空间分区方法可以大大减少成对比较的次数。
Daniel Darabos 2015年

抱歉,我对数据科学了解不多。但是,当我们希望将彼此靠近的点组合在一起时,这不是一个聚类问题吗?我有一个最大距离(L),想找到彼此在该距离内的点组(对)。扩展集群的定义是否过多?
Daniel Darabos 2015年

1
它确实可以表述为图形问题。在那种情况下,我们有一个包含N个点和M个特征的二部图,并希望找到至少具有L个共同邻居的点对。我现在正在专门研究基于特征向量的措词,希望有一种对我有用的聚类方法。在stats.stackexchange.com/questions/93366/…中,有人建议将K-SVD遇到类似的问题,所以我现在正在阅读。谢谢!
Daniel Darabos 2015年

“这是SNA问题吗?” 我不确定。在一个应用程序中,这些功能描述了行为,我们正在寻求将具有相似行为的人联系起来。这会导致SNA问题吗?感谢您向我介绍该术语,它对指导搜索非常有帮助。
Daniel Darabos 2015年

我已经修改了答案。您的最终目标是要枚举具有许多共同行为的人,还是其他?
Sycorax说恢复Monica 2015年

2

在找人在时空块会议:
分割空间分成块(城市街区,平方千米,等等),以及一次进入ñ 牛逼中号Ë块。如果人们见面,他们很有可能会在同一个街区见面。 因此,在每个块中运行NN。运行时间和错误率当然将取决于块的大小和形状(还取决于您可以并行化的内容/ MapReduce),但是您需要使用一些参数-工程技术,而不是宽广的O N 2NspaceNtime
O(N2)

另请参阅:
最近邻数据科学搜索非常高维度的数据

pairwise.py

使用Python Gensim库和标准库中的heapq在使用TF-IDF和余弦距离的大量文档之间进行快速,可扩展的成对比较。


1

倒词典!代表点作为˚F ë 1v 一个ù ë 1˚F Ë 101v 一个ü ë 101,对应于非零个值的密钥(即,保持真功能)。的元素的存储的平均大小将是ķ。实际上,我只需要K个字符串来存储要素,K个浮点数即可保存值。xfeat1:value1,feat101:value101KKK

对于每个功能,构建一个字典,其中包含共享此功能的索引。希望这个数字不会太大(如果您拥有所有索引都共享的功能,那么这种方法就会毁了,您可以在这里停止阅读)。

此词典看起来像:feat1:{1,101,202},feat2:{7,202},feat3:{202}...featM:{3,45,6}。如果我想提高速度并节省空间,我什至可以删除仅在一个元素中找到的特征(此处为),因为它们不会产生紧密对。该词典以O N K )个运算构建。feat3O(NK)

现在,当您要评估元素与其他元素的距离时,(使用字典)生成与x共享至少一个特征的索引列表。您知道所有其他元素都不是x(它们甚至不共享一个功能!)。如果“每个要素的元素”的平均数量较少(称为P),则不必再处于O N 2)中xxxPO(N2)

现在,如果y也表示为字典,则还有另一个很大的改进,因为d x y < x y >可以在O K 操作中迭代xy的键来求值。xyd(x,y)<x,y>xyO(K)

您的最终复杂度是而不是朴素的O M N 2初始方法。O(NPK)O(MN2)

我使用此方法在大型文本集(火车:2 000 000行,测试35 000行,特征数量:10000,每个元素的平均特征数量:20)上实现了KNN,该过程大约运行了一个小时。 。


我并不完全了解这种方法,这并不是因为我不相信您,这完全是由于我对表示数据的不同策略缺乏了解。也许您可以详细说明前两段中介绍的内容?
Sycorax说恢复莫妮卡

O(N2)

1

kO(LNlog(N))

L. Erotz,M。Steinbach和V. Kumar。“一种新的共享最近邻聚类算法及其应用。” 第一届“聚类高维数据及其应用”研讨会论文集,2002年。


谢谢,这是有趣的读物。您如何获得O(LN log(N))时间?听起来不错。但是算法描述从“构造相似矩阵”开始,据我所知,它将是一个NxN矩阵。
丹尼尔·达拉博斯

@DanielDarabos的复杂性在书中描述的实践图挖掘与R.
Sycorax说恢复莫妮卡

1

O(klogn)k<<n

假设您的k为100,而您的n为1e6,那么与传统FFT相比,这应该使速度快1e4倍。

如果您的速度需要再提高20倍,并且您是一个冒险家,则可以引导一部分行而不是将所有行都卷入该域并寻找峰值。

您也可以通过删除总和小于50或其他阈值(约为要匹配的行数的一半)的列来预过滤列。至少您应该删除全零和全1的列,以作为非参考性信息。与完全为空或足够空的行相同,或与行无关的太满的行相同。

待办事项:我应该在此处使用综合数据举例,并比较一些方法。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.