基于tim的匹配匹配算法

2024-04-29 16:59:11 发布

您现在位置:Python中文网/ 问答频道 /正文

假设有一个包含以下值的时间“主”数组:

master = [1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0]

我想在几个候选数组中找到最“兼容”的数组:

candidates = [
    [0.01, 0.48, 1.03, 1.17, 1.5],
    [1.25, 1.4, 1.5, 1.9, 2.0],
    ...
]

在本例中,我认为第一个候选者是最兼容的,因为在向每个值添加1之后,其中4个值与master中存在的值非常接近(第二个候选者只有3个与“master”匹配的值),顺序很重要(尽管我们可以说数组已经排序,没有重复的值,因为它们代表时间)。你知道吗

物理示例可以是master是用于音频轨迹的干净记录的拍集的阵列,而候选是用于可能属于或不属于相同音频轨迹的各种音频记录的拍集的阵列。我想找到一个候选人,最有可能是一个录音(至少一部分)相同的音轨。你知道吗

我不确定在这些候选者中选择什么算法。我做了一些搜索,找到了一些主题,比如互相关、字符串距离和模糊匹配,但我想知道我是否错过了这里的森林。我最熟悉NumPy和Pandas中的数据分析,所以我会把这个问题加上这样的标签。你知道吗


Tags: master示例排序顺序轨迹记录时间物理
1条回答
网友
1楼 · 发布于 2024-04-29 16:59:11

一种方法是用^{}将这些滑动1D数组创建为一个堆叠的2D数组,然后用^{}获得相对于2D数组的距离。最后,我们得到每一行的最小距离,并选择距离最小的行。因此,我们将有一个这样的实现-

from scipy.spatial.distance import cdist

Na = a.shape[1]
Nb = b.size
b2D = b[np.arange(Nb-Na+1)[:,None] + np.arange(Na)]
closesetID = cdist(a,b2D).min(1).argmin()

样本运行-

In [170]: a = np.random.randint(0,99,(400,500))

In [171]: b = np.random.randint(0,99,(700))

In [172]: b[100:100+a.shape[1]] = a[77,:] + np.random.randn(a.shape[1])
          # Make b starting at 100th col same as 77th row from 'a' with added noise

In [173]: Na = a.shape[1]
     ...: Nb = b.size
     ...: b2D = b[np.arange(Nb-Na+1)[:,None] + np.arange(Na)]
     ...: closesetID = cdist(a,b2D).min(1).argmin()
     ...: 

In [174]: closesetID
Out[174]: 77

注意:在我看来,它像是使用默认选项cdist,这是欧几里德距离,对于这样的问题是有意义的。文档中列出了许多其他选项,这些选项基于输入之间的差异,因此可以替换默认选项。你知道吗

相关问题 更多 >