Есть ли способ предсказать неизвестное значение функции на основе ее предыдущих значений?

StackOverflow https://stackoverflow.com/questions/1150862

  •  18-09-2019
  •  | 
  •  

Вопрос

У меня есть значения, возвращаемые неизвестной функцией, например

# this is an easy case - parabolic function
# but in my case function is realy unknown as it is connected to process execution time
[0, 1, 4, 9]

есть ли способ предсказать следующее значение?

Это было полезно?

Решение

Смотрите также этот вопрос.

Другие советы

Не обязательно.Ваша «параболическая функция» может быть реализована следующим образом:

def mindscrew
  @nums ||= [0, 1, 4, 9, "cat", "dog", "cheese"]
  @nums.pop
end

Можно предполагать, но предсказать наверняка невозможно.

Вы можете попробовать использовать нейронные сети подход.По запросу Google «аппроксимация функции нейронной сети» можно найти довольно много статей.Также доступно множество книг, например. Вот этот.

Если вам просто нужны точки данных

Экстраполяция данных снаружи известных точек могут быть оцененный, но нужно принять, что потенциальные различия намного больше, чем при интерполяции данных между известные точки.Строго говоря, оба могут быть сколь угодно неточными, поскольку функция может делать что угодно между известными точками, даже если это непрерывная функция с хорошим поведением.И если это не хорошо себя ведешь, все ставки уже сделаны ;-p

Существует ряд математических подходов к этому (которые имеют прямое применение в информатике) — от простой линейной алгебры до таких вещей, как кубические сплайны;и все, что между ними.

Если вам нужна функция

Становимся эзотерикой;еще одна интересная модель — генетическое программирование;развивая выражение по известным точкам данных, можно найти достаточно близкое приближение.Иногда это работает;иногда это не так.Это не тот язык, который вы искали, но Джейсон Бок показывает здесь код C#, который делает это в .NET 3.5: Развитие выражений LINQ.

У меня есть его код «под рукой» (я использовал его в некоторых презентациях);с чем-то вроде a => a * a он найдет его почти мгновенно, но он должен (теоретически) быть в состоянии найти практически любой метод - но без какой-либо определенной максимальной длины пробега ;-p Также возможно попасть в тупик (эволюционно говоря), где вы просто никогда восстанавливаться...

Использовать API Вольфрама Альфа :)

Да.Может быть.

Если у вас есть некоторые входные и выходные значения, т.е.в вашем случае [0,1,2,3] и [0,1,4,9] вы можете использовать поверхности отклика (я полагаю, в основном это подгонка функции), чтобы «угадать» фактическую функцию (в вашем случае f(x) =х^2).Если вы позволите вашей функции угадывания быть f(x)=c1*x+c2*x^2+c3, существуют алгоритмы, которые определят, что c1=0, c2=1 и c3=0, учитывая ваши входные и выходные данные и полученный результат. функция, вы можете предсказать следующее значение.

Обратите внимание, что большинство других ответов на этот вопрос также действительны.Я просто предполагаю, что вы хотите приспособить к данным какую-то функцию.Другими словами, Ваш вопрос мне кажется весьма расплывчатым, постарайтесь, пожалуйста, формулировать свои вопросы как можно более полно!

В общем, нет...если только вы не знаете, что это функция определенной формы (например,полином некоторой степени N) и имеется достаточно информации для ограничения функции.

напримердля более «обычного» контрпримера (см. ответ Чака), почему вы не можете обязательно предположить n^2, не зная, что это квадратное уравнение, вы могли бы иметь f(n) = n4 - 6н3 + 12н2 - 6n, что имеет для n=0,1,2,3,4,5 f(n) = 0,1,4,9,40,145.

Если вы знаете, что это определенная форма, есть несколько вариантов...если форма представляет собой линейное сложение базисных функций (например,е(х) = а + бсоз(х) + сsqrt(x)) то использование метода наименьших квадратов может дать вам неизвестные коэффициенты для наилучшего соответствия с использованием этих базисных функций.

Вы можете применить статистические методы, чтобы попытаться угадать следующий ответ, но это может сработать не очень хорошо, если функция похожа на эту (c):

int evil(void){
  static int e = 0;
  if(50 == e++){
    e = e * 100;
  }
  return e;
}

Эта функция вернет красивые простые возрастающие числа, а затем...БАМ.

Это сложная проблема.

Вам следует проверить рекуррентное отношение уравнение для особых случаев, когда такая задача могла бы быть возможной.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top