PDA

Просмотр полной версии : Аналог FORECAST в AS3 ?


Yuorik
26.08.2010, 15:30
Кто ни-ть делал в AS3 FORECAST ф-цию как в EXEL? Щас оч срочно нужно а времени самому разбирать нету. Мож кто где встречал или делал?

Psycho Tiger
26.08.2010, 15:47
А что функция делает?

Yuorik
26.08.2010, 15:52
Прогнозирует результат на основе предварительных данных.

Psycho Tiger
26.08.2010, 15:53
А как прогнозирует?

Скорее всего это придётся писать (почти) с нуля.

gloomyBrain
26.08.2010, 15:54
А как прогнозирует?

Используя линейную экстраполяцию. И, по-моему, это не очень сложно

Yuorik
26.08.2010, 16:18
Нет не сложно просто сроки поджимают. Думал может у кого есть. Кстати уже начал писать..

-De-
26.08.2010, 16:21
Ну вот вродь формулы http://en.wikipedia.org/wiki/Numerical_methods_for_linear_least_squares#Computation с ними моск не задействуется, за время от начала топега можно было написать вродь)

Yuorik
26.08.2010, 16:33
Да, спасибо! Тут http://office.microsoft.com/ru-ru/excel-help/HP005209096.aspx?redir=0 конкретно по модели вычислений.

Добавлено через 1 час 27 минут
Тему открыл значит и закрою. Может кому потом будет интересно.

Вот собсно код. Для ленивых Ctrl+C Ctrl+V в новый чистый Timeline
/*
* Legend
* y = a + b * x;
* where a = y_average - b * x_average;
* also b = SUMM((x - x_average) * (y - y_average)) / SUMM(pow(x - x_average, 2));
*/

// these two arrays only for testing You have to substitute to yours own data
var y_arr :Array = new Array(6, 7, 9, 15, 21);
var x_arr :Array = new Array(20, 28, 31, 38, 40);

function forecast(x_point :Number, y_arr :Array, x_arr :Array) :Number
{
if(x_arr.length != y_arr.length) throw new Error("The x_arr and y_arr arrays have to have the same lenght");
var a :Number;
var b :Number;

// found x_average and y_average
var x_avr :Number = 0;
var y_avr :Number = 0;
for(var i :int = 0; i < x_arr.length; i++)
{
x_avr += x_arr[i];
y_avr += y_arr[i];
}
x_avr /= x_arr.length;
y_avr /= y_arr.length;

// found b
var summ_numerator :Number = 0;
var summ_denominator :Number = 0;
for(var n :Number = 0; n < x_arr.length; n++)
{
summ_numerator += (x_arr[n] - x_avr) * (y_arr[n] - y_avr);
summ_denominator += Math.pow(x_arr[n] - x_avr, 2);
}

b = summ_numerator / summ_denominator;

// found a
a = y_avr - b * x_avr;

return a + b * x_point;
}


trace("Here is the result :) -> " + forecast(30, y_arr, x_arr));