首页 > 解决方案 > 数字列表中的未知模式检测

问题描述

我有一个遵循某种任意规则的数字序列,让我们想象以下 5 个示例:

A = [1,2,3,4]
B = [8,7,6,5,4,3,2]
C = [2,4,6,8,10,12]
D = [15,18,21,24]
E = [2,8,18,32,50]

序列A遵循x n = x n-1 +1的规则,其中n 0 =1,序列B遵循x n = x n-1 -2的规则,其中n 0 =8,依此类推。示例 E 遵循更复杂的公式n i =2(i+1) 2

如何使用 python 预测每个序列的下一个元素?

标签: pythonartificial-intelligence

解决方案


如果您有特定的功能,您可以使用scipy.optimize.curve_fit拟合曲线,或者如果您确信“等等”总是符合某些多项式,您可以执行numpy.polyfit - 您的示例都是线性的,因此这只是 1 次多项式。

这是使用 numpy.polyfit 的示例:

import numpy as np

model = np.polyfit([0,1], [1,2],deg=1)

这将获取您的值 [1,2] 并将它们映射到位置值 [0,1],然后再计算最适合其序列的 1 度多项式。

然后,您需要一个函数来使用模型来预测序列中的第 n 个值(或者,使用poly1d)但这里有一个简单的多项式计算器函数,它接受系数作为第一个参数,以及您想要的 x 值返回多项式的结果:

def poly(coeffs, x):
    accumulator=0
    n = len(coeffs)-1
    for e,i in enumerate(coeffs):
        accumulator = accumulator + (i*(x ** (n-e)))
    return accumulator

因此,我们已经在索引为 0,1 的序列上对其进行了训练——索引为 2 的第三点的答案可以通过以下方式找到:

poly(model,2)

它返回预期值 3。

这是使用序列的示例[3,6,9,12]

model = np.polyfit([0,1,2,3], [3,6,9,12],deg=1)
poly(model,4)

给出答案 15。(好的,15.000000000000002,但它足够接近 - 如果你确信你总是会得到整数答案,那么你可以四舍五入到最接近的整数 - 或者选择某种程度的精确度你觉得舒服和)

这都是线性的,对于二次模型,您可以设置deg=1todeg=2等等。

这不会为您找到更多有趣的模式,这些模式没有多项式来描述它们。The On-Line Encyclopedia of Integer Sequences大量此类序列的列表,但对于这些更有趣的示例,示例可能包括斐波那契数列、素数数列三角数,您需要想出更细微的方法.


推荐阅读