python - 数字列表中的未知模式检测
问题描述
我有一个遵循某种任意规则的数字序列,让我们想象以下 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 预测每个序列的下一个元素?
解决方案
如果您有特定的功能,您可以使用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=1
todeg=2
等等。
这不会为您找到更多有趣的模式,这些模式没有多项式来描述它们。The On-Line Encyclopedia of Integer Sequences有大量此类序列的列表,但对于这些更有趣的示例,示例可能包括斐波那契数列、素数数列或三角数,您需要想出更细微的方法.
推荐阅读
- pine-script - 需要在 MA 的交叉点绘制蜡烛的高点
- spring-data-jdbc - 将 DB 列中的 JSON 字符串转换为 Map
在@ReadingConverter - r - 如何在 R 的 lavaan 包中使用内生名义变量
- javascript - 在javascript中找出函数的父级
- ubuntu - 仅针对特定请求在 Ubuntu 服务器上设置 VPN 的最佳方式
- reactjs - React + Typescript:使用具有可选泛型类型的函数的道具正确键入通用组件
- android - 使用jetpack compose时android studio gradle脚本中compileSdk和compileSdkVersion有什么区别
- elasticsearch - 最新 N 条记录上的 Elasticsearch 聚合
- php - 在 laravel 中动态确定 http/https
- reactjs - 在 reactJS 中从 IndexedDB 获取视频 URL