Содержание

Предсказание с помощью экспоненциального среднего  1

Экспоненциальное сглаживание. 1

Предсказание с помощью экспоненциального среднего. 1

Программная реализация экспоненциальное сглаживание. 2

Программная реализация предсказания с помощью экспоненциального среднего. 3

Система Предсказания данных. 5

Описание работы Системы Предсказания Данных (СПД). 5

Описание интерфейса СПД.. 6

Программа тестирования Системы Предсказания Данных. 7

Описание работы программы тестирования СПД.. 7

Описание интерфейса программы тестирования СПД.. 8

Приложение 1. Скрипт программы Экспоненциального Предсказания данных. 9

Приложение 2. Скрипт программы тестирования СПД.. 12

 Предсказание с помощью экспоненциального среднего

Экспоненциальное сглаживание

 

Сглаженные значения определяются как:

                                                                                           (1)

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

При , получаем , т.е. сглаженный ряд совпадает с исходным (фильтр пропускает все частоты).

При , получаем , т.е. сглаженный ряд совпадает с первым значением исходного ряда (фильтр "зарезает" все частоты >0).

 

Предсказание с помощью экспоненциального среднего

 

  Методы краткосрочного прогнозирования, к которым относится  предсказание с помощью экспоненциального среднего, применяются в тех случаях, когда:

  1. частота данных за рассматриваемый период не более года;
  2. прогноз делается для конкретного объекта отдельно и последовательно на каждый следующий момент времени;
  3. прогнозы строятся для большого числа объектов.

Очевидно, что для подобного рода применений прогностические методы и модели (или набор моделей) должны быть:

    а). легкими в обращении - в смысле вычислений и затрат, связанных с хранением информации;

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

    в). достаточно полно автоматизированными и требующими по возможности минимального вмешательства человека

    г). достаточно обоснованными в научном смысле, реализованными в виде программ на ЭВМ.

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

Этот ряд определим следующим образом:

                                                     (2)

Сумма ряда стремится к единице, а члены суммы со временем убывают.

С помощью экспоненциального взвешенного ряда весов экспоненциально взвешенное среднее ut запишем как

                   (3)

 можно переписать как:

                                         (4)

тогда можно выразить ut через другие члены последовательности.

       (5)
т.е. сумма членов в квадратных скобках (4) есть как раз
ut-1, Подставляя это в уравнение (4), получим окончательно 

-основное уравнение определяющее экспоненциальное взвешенное среднее.

   Экспоненциальное взвешенное среднее имеет ряд преимуществ:

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

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

в). Для вычисления экспоненциального взвешенного среднего ut требуются всего два значения: прошлое значение среднего (ut-1) и текущее значение dt.

 

Программная реализация экспоненциальное сглаживание

 

  Назначение:  Exp сглаживает временной ряд методом экспоненциального сглаживания.

Аргументы: параметр сглаживания А и временной ряд U, который будет сглажен.

Результат:  сглаженный ряд

Тело функции:

 

Text Box: Exp {A;U}:{
ã Exp – функция экспоненциального сглаживания
ã U- временной ряд
ã A-параметр сглаживания
Iû0;
Dû1ÙU;
while (I¤¢2+ÒU){IûI+1;DûD,(A«U[I])+(1-A)«U[I-1]}
}

        

 

 

 

 

 

    

Пример 1:     yûØ40 20 40Ò¡1 10 5

                               y Exp {.7;y}

               y2û Exp {.03;y}

                              ExpSmoothû`y`y1`y2

         $load s

     show `ExpSmooth is `graph

`y1 has (`legend;`0.7)

`y has (`legend;`1)

`y2 has (`legend;`0.03)

 

 

Рисунок 1. Пример сглаживание прямоугольного сигнала.

 

Видно, что при больших значениях α фильтр "отслеживает", но не сглаживает процесс. Напротив, при α = 0.03 "всплеск" исходного процесса оказался отфильтрованным.

 

Рекурсивный вид функции:

Text Box: Expr {A;U}:{
ã Expr - function for PredictExp
ã A- parameter of filter
ã X- time series
if (1<ÒU) {(A«¢1ÙU)+(1-A)« Expr {A;¢1ÕU}} else U
}

 

 

 

 

 

 

Рекурсивная функция вычисляет только одно сглаженное значение (при t=n). Чтобы сгладить весь ряд можно (крайне неэффективно):

    

Пример 2:    (.5 Exp z)= Ø.5 Expr¡(É1+Òz)Ù¡<z

        1

Но писали для предсказания, где и надо одно (последнее) значение.

Программная реализация предсказания с помощью экспоненциального среднего

 

Предсказанием на момент времени t+1 выступает экспоненциально сглаженное значение для момента времени t. При выполнении сглаживания/предсказания по циклу теоретически тянется бесконечный хвост "истории". На практике используют конечное временное окно для применения экспоненциального фильтра. Процедура предсказания реализуется следующей функцией:

Text Box: PredictExp {A;N;X}:{
ã A- parameter of filter
ã N- length of smooth window
ã X- time series
(NÙX),¢1Õ,A Expr@1 (-N)!X}

 

 

 

 

 

 

 

Первые n значений совпадают с исходным рядом (нет предыстории). Последнее значение отбрасывается, т.к. выходит за интервал наблюдения процесса.

Рассмотрим пример предсказания "зашумленного" синуса:

Пример 3:    yû1Ï.1«É100

                      yy+RAND{100;'N';0 .3}

         PredûPredictExp {.5;10;y1}

         Predictionû`y`y1`Pred

   show `Prediction is `graph

     `y has (`linecolor;`black)

     `y1 has (fillcolor;`blue;`style;`scatter;`symbol;`cross)

   `Pred has (`linecolor;`red)

 

 

Рисунок 2. Визуализация работы функции экспоненциального предсказания PredictExp .

 

Предсказание велось с временным окном n=10 и параметром α=0.5. Указанные параметры можно оптимизировать (подбором) по критерию минимума ошибки предсказания на обучающей выборке:

 

Пример 4:   Первым делом создадим функцию, для облегчения  работы, у которой входными параметрами являются только А – параметр сглаживания и X- временной ряд. Внутри нее располагается функция PredictExp, у которой N=10 .

Prediction{A;X}:PredictExp {A;10;X}         

 

         eû10Õ¡(<y1)-¡((.01«É101) Prediction¡ <y1)

В этой строке параметр сглаживания α берется как массив данных от 0 до 1 с интервалом 0.01.    

        eeÉÄ/eeûØ+/¡e*¡2 ã –находит индекс минимального значение.

   53  

     (.01«É101)[53] ã –находит оптимальное значение параметра α.

 0.53

     show `ee is `graph

 

Рисунок 3. Зависимость квадрата отклонения предсказаний от параметра α [0;1] для данного временного ряда y (Пример 3.22).

 

Система Предсказания данных

   Эта система или проще сказать, программное обеспечение для анализа или так сказать обработки данных в онлайновом режиме. Данные поступают в эту систему из специального сервера. Так чтобы удобнее показать работу этой системы, был сделан сервер такой,  который транслирует основной сигнал (прямой, синусоидальный, прямоугольный) и зашумленный этот же сигнал с нормальным распределением.   

В этой системе применен такой алгоритм, как предсказание с помощью экспоненциального среднего. Интерфейс представлен на рисунке4. Скрипт программы представлен в приложении 1.

 

Описание работы Системы Предсказания Данных (СПД).

  В первых строках программы, загружается s-скрипт, который поддерживает GUI, используемое в программе. Системная переменная s.QUIETû2, управляет показом сообщений в А+ сессии. 2- только для серьезных ошибок .

Описание локальных переменных:

.dataû переменная принимающая данные с сервера;

.Buffer-окно скольжения, по которому будет произведено предсказание.

.true-данные, которые публикует сервер для истинного сигнала.

.noise- данные, которые публикует сервер для зашумленного сигнала.

 .Ai- символьный вектор, отображается на дисплее и сообщает о значение параметра α.

.Si- символьный вектор, отображается на дисплее и сообщает о значение среднеквадратичного отклонения предсказанной функции от зашумленной функции.

.N- окно предсказания.

.signal-индекс сигнала

.Sigma- порог средне квадратичного отклонения, для авто предсказания параметра α.

.A- выбор параметра α.

.WPred – номер режима работы системы ( авто, ручное, отключение)

Описание Slotfillers :

Menu- для выбора режима работы системы.

 

Описание функций:

Все представленные функции были описаны ранее в http://www.aplusdev.narod.ru/DisplayClass.htm

 

Описание Зависимостей.

Buffer – Скользящее окно, которое постоянно содержит в себе предысторию и данные по которым будет вычислено предсказание.

Predict- Внутри этой зависимости вычисляются как предсказанные значения, так и вычисляется оптимальные параметр сглаживания.

.noise-содержит в себе окно скольжения с зашумленным сигналом.

.true- содержит в себе окно скольжения с истинным сигналом.

.predict- содержит в себе окно скольжения с предсказанными значениями.

 

Описание интерфейса СПД

Рисунок 4. Интерфейс программы СПД.

 

   Интерфейс программы представлен так, чтобы было максимально удобно и понятно как работает эта программа. Интерфейс  разбит на 6 частей:

1.      Conn Info- информация о сетевых настройках. Data-отображает данные, которые система приняла с сервера в данную секунду.

2.      Parameter A-красным обозначается параметр сглаживания для экспоненциального предсказания. Parameter S-средне квадратичное отклонение предсказанного от зашумленных данных.

3.    Exponential Prediction- графический объект, который отображает:

·        Синим цветом зашумленный сигнал.

·        Черным – исходный сигнал.

·        Красным- предсказанный сигнал.

4.    A×100- значение параметра сглаживания, умноженного на 100. Nдлина предыстории по которой будет вычислено предсказание. Level S-порог среднеквадратичного отклонения, выше которого автоматически будет подбираться параметр сглаживания.

5.    Выбор режима работы системы:

·        Auto-автоматический подбор оптимального параметра сглаживания;

·        Edit-подбор в ручную;

·        Off- отключение предсказания.

6.    Connect – подключение к серверу. Disconnect-отключение соединения.

Программа тестирования Системы Предсказания Данных.

Это программа создана для  тестирования Системы Предсказания Данных. Чтобы нагляднее было видно работу выше указанной системы, эта программа транслирует не только зашумленные сигналы, но и исходные тоже.

 Интерфейс представлен на рисунке 5. Скрипт программы представлен в приложении 2.

Описание работы программы тестирования СПД

  В первых строках программы, загружается s-скрипт, который поддерживает GUI, используемое в программе. Системная переменная s.QUIETû2, управляет показом сообщений в А+ сессии. 2- только для серьезных ошибок .

 

Описание локальных переменных:

pubRate- скорость публикации;

timeout - зависимость, задающая время задержки между двумя публикациями;

.Mean – Среднее значение потоков, загружающаяся по умолчанию;

.Variance – дисперсия;

.signal- номер сигнала;

.Frequency – частота;

.Amplitude- амплитуда;

.signalM- номер сигнала для всех потоков;

 

Описание slotfillers для display классов

Parmtr- выбор сигнала (Только для имитации сигналов);

Sf- сетевые настройки

 

Описание функций

Все функции аналогичны функциям, используемых программе описанную в п.4.1.1

За исключением того, что используется только два потока данных. Первым потоком не зашумленный сигнал. Вторым зашумленный. И главной функцией, которая форматирует данные, которые будут публиковаться в сеть является функция Change.

 

Описание зависимостей участвующих в программе:

Signal- зависимость, которая отслеживает, какой вид сигналов был выбран.

Описание интерфейса программы тестирования СПД

Рисунок 5. Интерфейс программы тестирования СПД.

 

   Интерфейс программы представлен так, чтобы было максимально удобно и понятно как работает эта программа. Интерфейс программы разбит на 8 частей:

1.      Информация о сетевых настройках.

2.      PubRate-время между двумя публикациями. (т.е. можно регулировать скорость публикации)

3.      Mean- изменение среднего для выбранных потоков.

4.      Variance- изменение дисперсии.

5.      Amplitude- изменение амплитуды сигнала.

6.      Frequency- изменение частоты сигнала.

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

8.      StartServer- кнопка для начала публикации; StopServer- для завершения.

 

 

 

 

 

Приложение 1. Скрипт программы Экспоненциального Предсказания данных

 

$load s

ã Локальные переменные

 

s.QUIETû2

.dataû2Ò9.5

ã s.FONTû"courier-bold-14"

.BufferûÉ0

.trueûÉ0

.noiseûÉ0

.Aiû('parameter A:';î1)

.Siû('parameter S:';î1)

.Nû10

.signalû0

.Sigmaû10

.Aû50

.WPredû1

ã variables smooth

N_Med3û0

N_Hannû0

N_Expû0

N_SLSû0

ã variables Prediction

.Pred_AEOû1

 

ã Slotfillers

 

menuû(`Auto`Edit`Off;(1;0;0))

 

 

sfû(`Host`Port`Handle`Data;(`localhost;12345678;¢1;.data)) ã Connection info

 

ã Служебные функции

 

buttonCB{s}: {ã Button CallBack

  if(`connect=s) {

    adap.Connect{ (`host; `HostØ.sf; `port; `PortØ.sf; `protocol;`A);.cb}

  } else {

    ( `HandleØ.sf)ûadap.Close{ `HandleØ.sf}

  }

}

 

Connectû(.buttonCB;`connect)

Disconnectû(.buttonCB;`disconnect)

 

 

ã Connection callback

cb{h;a;d}:{                ã Connection callback

  case(a){

    `error;     bomb;      ã intentional error

    `connected; (`HandleØ.sf)ûh;

    `sent;      Õ(h;a;d);

    `read;      {(`DataØsf)ûdata;.dataûd;};

    `reset;     (`HandleØ.sf)ûadap.Close{h} ;};

}

 

 

ã функции алгоритма

 

 

Expr {A;U}:{

ã Expr - function for PredictExp

ã A- parameter of filter

ã X- time series

if (1<ÒU) {(A«¢1ÙU)+(1-A)« Expr {A;¢1ÕU}} else U

}

 

PredictExp {A;N;X}:{

ã A- parameter of filter

ã N- length of smooth window

ã X- time series

(NÙX),,A Expr@1 (-N)!X}    

 

Prediction{A;X}:PredictExp {A;N;X}

 

PredictA{cycle;Buffer}:{

                         nû2;

                         a1û.1«É11;

                         P0ûa1 Prediction¡<Buffer;

                         S0û>+/¡((¢1Õ¡¢1ÕP0)-¡<Buffer)*¡2;

                         a0ûa1[S0ÉÄ/S0];

       while  (cycle¦n) {

                         a1ûa0+(.1*(É1+cycle)[n])«¢10+É21;

                         nûn+1;

                         P1ûa1 Prediction¡<Buffer;

                         S1û>+/¡((¢1Õ¡P1)-¡<Buffer)*¡2;

                         a0ûa1[S1ÉÄ/S1]

                         }

                        }

 

ã функция отзыва для menu

 

fmenu{s;d;i;p;c;v}:{if(v½`menu){

 

         if((p)½`Off) {

                               .WPredû0;

                               `vol has (`legend;`none);

                               `predict has (`linecolor;`blue);

                               .Pred_AEOû3

                        };

         if((p)½`Edit) {.Pred_AEOû2;   

                          .WPredû1;`vol has (`legend;`tl);

                           `predict .has (`legend;'Prediction';

                           `linecolor;`red;`linestyle;`dash)

                          };

         if((p)½`Auto) {             

                         .WPredû1;

                          `vol has (`legend;`tl);

                          `predict .has (`legend;'Prediction';

                          `linecolor;`red;

                          `linestyle;`dash);

                          .Pred_AEOû1

                          };

                               }

                    }

 

ã Зависимости

 

Buffer:{if((49+.N)<#Buffer){

                            (-50+.N)ÙBuffer,.data[1]

                            }else {Buffer,.data[1]}

                            }

 

Predict: {if(.N<#.Buffer) {

             case (.WPred){0;{Pû.Buffer;.Sû0;.Aû100};

                        1;{if(3=.Pred_AEO){Pû.Buffer;.Sû0

                                      }else{

                                            a1û.1«É11;

                                            P0ûa1 Prediction¡<.Buffer;

                                            S0û>+/¡((¢1Õ¡P0)-¡<.Buffer)*¡2;

                                            S0ûÄ/S0;

                                            (.Aß100) Prediction .Buffer;

                                           .+/((¢1ÕP)-.Buffer)*2;

                                          if(.Pred_AEO=1){

                                             if(.Sigma<200«(|.S-S0)ß(S0+.S)){

                                               .Aû100«PredictA{2;.Buffer}

                                                                           }

                                                         }

                                            };

                          };};

                         .Aiû('parameter A:';î.Aß100);

                         .Siû('parameter S:';î.001«Ó1000«.S);

                          P} else .Buffer}

 

noise:{if(49<#.Buffer){¢50Ù.Buffer}else{.Buffer}}

 

true: {if(49<#true){¢50Ùtrue,.data[0]} else true,.data[0]}

 

predict:{if(50<#.Predict){¢51Ù.Predict}else{.Predict}}

 

ã Связь переменных с Widgets

 

volû`noise`predict`true

 

`menu has (`class;`choice;`title;'Regime of prediction:';`set;(fmenu;'choice'))

 

 

`Connect`Disconnect .has¡ <(`class;`button)

`sf  .has (`class;`slot;`colors;`red;`title;"Conn Info")

`vol .has (`class;`graph;`title;'Exponential Prediction')

`A`Sigma`N .has¡< (`class;`hscale)

`A has (`title;'A«100')

`Sigma has (`title;'level S(%)')

`Ai is `label

`Si is `label

`Ai .has (`fg;`black`red)

`Si .has (`fg;`black`red)

(`sf;`menu;`Ai`Si;`vol;`A`N`Sigma;`Connect`Disconnect)

 

`l .has (`class;`layout;`shelltitle;"Client";`title;'Data Prediction System';`show;1)

 

`noise .has (`legend;'Time Series';`fillcolor;`blue;`style;`scatter)

`predict .has (`legend;'Prediction';`linecolor;`red;`linestyle;`dash)

`true .has (`legend;'True line';`linecolor;`black)

 

 

 

Приложение 2. Скрипт программы тестирования СПД

 

$load s

 

ã описание переменных

 

pubRateû90;                 ã Initial pub rate

timeOut:0.05Ó(100-.pubRate)ß10     ã Dependency tenths of a sec w/min

 

ã начальные свойства потоков

 

Meanû9.5

Varianceû.05

.Frequencyû1

.Amplitudeû1

.timeSû0

 

ã slotfiller

 

parmtrû(`a`b`c`d;(1;0;0;0))

 

sfû(`Host`Port`Handles;(`localhost;12345678;0Ò0))  ã Connection info

 

ã служебные функции

 

buttonCB{s}: {

  if(`start½s){             ã Start Listening

    adap.Listen{ (`host; `HostØ.sf; `port; `PortØ.sf; `protocol;`A);.cb};

    .pubTimerHandleûadap.SetTimer{`Publish; .publish; .timeOut};

  } else {                   ã Stop Listening

    (#`HandlesØ.sf) do adap.Close{ i#`HandlesØ.sf};

    ( `HandlesØ.sf)û0Ò0;

    adap.Close(.pubTimerHandle);

  }

}

 

StartServerû(buttonCB;`start)

StopServerû(.buttonCB;`stop)

 

cb{h;a;d}:{               ã Connection callback

  case(a){

    `error;     bomb;     ã intentional error

    `connected; (`HandlesØ.sf)ûh,`HandlesØ.sf;

    `sent;      Õ(h;a;d);

    `read;      Õa;

    `reset;     (`HandlesØ.sf)û(h¨`HandlesØ.sf)/`HandlesØ.sf Ýadap.Close{h};

  };

}

 

ã функция для воспроизведения различных распределений

 

ã functtion of '...' distribution

 

Decode{T;X}:{XÂT}

 

Rnd {R}:{(?T)ßTûRÒ2*30}

 

RAND {L;R;T}:{

ã L-number of elements

ã R-name of distribution

ã T-vector when ferst element is mean and second is variance

case ('BCENSUM'ÉR){

0;ZûT>Rnd L;

1;Zû+/¡T¦<Rnd L;

2;Zû-T«ðRnd L;

3;Zû(÷T) Decode@1 (ô(2,L)Ò((2«RAND {L;'E';1})*.5)«2ÏÏ2«Rnd L);

4;Zû1++/¡(<+\T)¤Rnd L;

5;Zû,+/((1-Z),<Rnd L)«¡T;

6;Zû(1ÙT)«(-ðRnd L)*ß1ÕT}

                 }

 

Change{Frequency;Amplitude;signal;Mean;Variance}:{

ZûRAND {1;'N';0 1};

Zû.Mean+.Variance«Z;

case (signal){0;.Mean,Z;

1;{if(.timeS>100){timeSû0};

Z1ûAmplitude«1ÏFrequency«(.01«Ï2)«.timeS;

.timeSû.timeS+1;

(Z1+.Mean),Z1+Z};

2;{if(.timeS>100){timeSû0};

Z1ûAmplitude«3ÏFrequency«(.01«Ï2)«.timeS;

.timeSû.timeS+1;

(Z1+.Mean),Z1+Z};

3;{if(.timeS>100){timeSû0};

Z1ûAmplitude«(0<1ÏFrequency«(.01«Ï2)«.timeS);

.timeSû.timeS+1;

(Z1+.Mean),Z1+Z}}

}

 

signal:{(Ø1Øparmtr)/É4}

 

 

publish{h;a;d}:{          ã writes random data

  (#`HandlesØ.sf) do adap.Send{i#`HandlesØ.sf;.001«Ó1000«Change{.Frequency;.Amplitude;.signal;.Mean;(.Varianceß10)}};

  .pubTimerHandleûadap.SetTimer{`Publish;&;.timeOut};

}

 

ã Связь переменных с Widgets

 

`StartServer`StopServer .has ¡<(`class;`button)

 

`Mean`Amplitude .has¡ <(`class;`hscale)

`pubRate`Frequency .has¡< (`class;`hscale)

`parmtr .has (`class;`radio;`title;'Change Signal';`label;('Norm';'Sin';'Tan';'Rectan'))

 

`pubRate .has (`title;'Publication Rate ')

 

`Variance .has (`class;`hscale;`title;'Variance«10')

 

`sf .has (`class;`slot;`colors;`red;`title;"Conn Info")

 

 (`sf`parmtr;`pubRate;`Mean;`Variance;`Amplitude;`Frequency;`StartServer`StopServer)

`l .has (`class;`layout;`title;'Exponential Prediction';`shelltitle;"server";`show;1)

 

Сайт создан в системе uCoz