Есть ли способ предсказать неизвестное значение функции на основе ее предыдущих значений - PullRequest
2 голосов
/ 20 июля 2009

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

# 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]

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

Ответы [ 9 ]

4 голосов
/ 20 июля 2009

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

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

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

Если вы хотите функцию

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

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

4 голосов
/ 20 июля 2009

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

4 голосов
/ 20 июля 2009

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

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

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

2 голосов
/ 21 июля 2009

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

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

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

2 голосов
/ 20 июля 2009

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

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

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

2 голосов
/ 20 июля 2009

Используйте Wolfram Alpha API :)

1 голос
/ 21 июля 2009

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

1 голос
/ 20 июля 2009

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

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

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

0 голосов
/ 20 июля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...