Обнаружение неизвестного шаблона в списке чисел

#python #artificial-intelligence

#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, я могу предсказать следующий элемент каждой последовательности?

Комментарии:

1. я имею в виду, что я мог бы также перейти на 2, 4, 6, и это будет 8

2. например, обучение ИИ для идентификации шаблонов в строке

Ответ №1:

Вы можете подогнать кривую с помощью 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 — ответ на 3-й пункт с индексом 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 to deg=2 и так далее.

Что это не поможет вам, так это найти более интересные шаблоны, для которых нет полинома для их описания. Онлайновая энциклопедия целочисленных последовательностей содержит огромный список таких последовательностей, но примеры могут включать последовательность Фибоначчи, последовательность простых чисел или треугольные числа для этих более интересных примеров вам нужно придумать более тонкий подход.