将输入减少到仅不同元素以加速计算的术语是啥?

Posted

技术标签:

【中文标题】将输入减少到仅不同元素以加速计算的术语是啥?【英文标题】:What is the terminology for reducing inputs to only distinct elements to speed computation?将输入减少到仅不同元素以加速计算的术语是什么? 【发布时间】:2020-10-09 13:02:46 【问题描述】:

是否有一个术语可以利用数据由几个重复次数多的值组成这一事实来加速计算?

例如,当尝试在长离散序列(长度 = 64.000.000.000,不同元素 = 11,子字符串长度 = 3)上计算样本熵时,我发现运行时间太长(超过 10 分钟)。我意识到我应该能够利用相对较少的不同元素来加快计算速度,但找不到任何与此相关的文献(我怀疑是因为我不知道谷歌该做什么)。

Sample Entropy 算法涉及计算在特定容差范围内的子串对。这是算法 O(n^2) 计算量大的方面。通过只取不同的子串(其中最多有 1331 个),我能够在容差范围内找到不同的子串对,然后我使用每个不同的子串的计数来找到(非不同的)对的总数) 在一定容差范围内的子串。这种方法大大加快了我的计算速度。

利用相对较少、重复次数较多的元素的属性的算法是否具有特定的术语。

def sampen(L, m, r):
    N = len(L)
    B = 0.0
    A = 0.0

    # Split time series and save all templates of length m
    xmi = np.array([L[i : i + m] for i in range(N - m)])
    xmj = np.array([L[i : i + m] for i in range(N - m + 1)])

    # Save all matches minus the self-match, compute B
    B = np.sum([np.sum(np.abs(xmii - xmj).max(axis=1) <= r) - 1 for xmii in xmi])

    # Similar for computing A
    m += 1
    xm = np.array([L[i : i + m] for i in range(N - m + 1)])

    A = np.sum([np.sum(np.abs(xmi - xm).max(axis=1) <= r) - 1 for xmi in xm])

    # Return SampEn
    return -np.log(A / B)

def sampen2(L, m, r):
    N = L.shape[0]

    # Split time series and save all templates of length m
    xmi = np.array([L[i : i + m] for i in range(N - m)])
    xmj = np.array([L[i : i + m] for i in range(N - m + 1)])

    # Find the unique subsequences and their counts
    uni_xmi, uni_xmi_counts = np.unique(xmi, axis=0, return_counts = True)
    uni_xmj, uni_xmj_counts = np.unique(xmj, axis=0, return_counts = True)

    # Save all matches minus the self-match, compute B
    B = np.sum(np.array([np.sum((np.abs(unii - uni_xmi).max(axis=1) <= r)*uni_xmj_counts)-1 for unii in uni_xmi])*uni_xmi_counts)

    # Similar for computing A
    m +=1
    xm = np.array([L[i: i + m] for i in range(N - m + 1)])

    uni_xm, uni_xm_counts= np.unique(xm, axis=0, return_counts = True)
    A = np.sum(np.array([np.sum((np.abs(unii - uni_xm).max(axis=1) <= r)*uni_xm_counts)-1 for unii in uni_xm])*uni_xm_counts)

    return -np.log(A / B)


【问题讨论】:

【参考方案1】:

这是一个包含多个相关术语的宽泛概念。

一个常见且密切相关的术语是Memoization,其中存储了针对不同输入计算子问题的结果,并在重新遇到先前看到的输入时重复使用。这与您在此处所做的略有不同,因为记忆化是lazy evaluation 的一种形式,其中值是机会性地识别出来的,而不是对将要处理的输入进行预先详尽枚举的代码。

Materialization 也值得一提。它在数据库的上下文中遇到,是指存储以供重用的查询结果(也称为表格处理,包括可能的过滤和/或减少)。对具体化的积极关注主要是关于动态更新等长期考虑,因此它与运行后不管的算法并不完美匹配。

说到“动态”,也可以也许将其描述为dynamic programming 的一种形式,通过详尽列举和解决一系列子问题来解决问题。不过,在动态规划中,人们希望这些子问题具有更规则和更归纳的形式,所以我认为这有点牵强。

我将这里的精确策略描述为一种“急切的记忆”,与记忆化通常固有的惰性评估假设形成对比。

【讨论】:

以上是关于将输入减少到仅不同元素以加速计算的术语是啥?的主要内容,如果未能解决你的问题,请参考以下文章

“非静态”的不同术语是啥?

术语“共享变量”是啥意思?它与“全局变量”有何不同?

允许您使用标签跳转到不同部分的网站的术语是啥?

javascript 将数字数组从重复项目减少到仅限唯一项目

将音节录音修剪到仅元音部分

使用 jquery datepicker 时,处理人们以不同格式输入日期的正确方法是啥?