Метод Холта-Винтера возвращает отрицательные значенияPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Метод Холта-Винтера возвращает отрицательные значения

Сообщение Anonymous »


Найден метод/класс прогнозирования Холта-Уинтерса и экспоненциального сглаживания

https://github.com/go717franciswang/data-anaанализ

Кажется, это работает, но если некоторые значения в наборе данных равны 0, он возвращает Деление на ноль.

Пытались исправить это (см. строку с комментариями) и добавили нулевую проверку, выполнив ($s0 ? $this->alpha * $x / $s0 : 0), но затем она перенастраивается негативный прогноз?

Мой набор данных содержит данные за двухлетний период, сгруппированные по неделям (всего 104 недели), а продолжительность сезона установлена ​​на 52
класс класс Holt_winters { частные уровни $; частные $тренды; частные сезонные сезоны; публичная функция __construct( частный массив $series, частный интервал $L=7, частный плавающий $альфа=0,2, частный плавающий $beta=0,01, частный плавающий $гамма = 0,01 ){ $this->build_model(); } частная функция build_model(): void{ $this->уровни(); $this->тренды(); $this->сезонные(); for($i = $this->L; $i < count($this->series); $i++){ $x = $this->series[$i]; $s0 = $this->сезонные[$i - $this->L]; $l0 = $this->levels[$i - 1]; $t0 = $this->trends[$i - 1]; //$l = $this->alpha * $x / $s0 + (1 - $this->alpha) * ($l0 + $t0); $l = ($s0 ? $this->alpha * $x / $s0 : 0) + (1 - $this->alpha) * ($l0 + $t0); $t = $this->beta * ($l - $l0) + (1 - $this->beta) * $t0; $s = $this->gamma * ($x / $l) + (1 - $this->gamma) * $s0; $this->levels[$i] = $l; $this->trends[$i] = $t; $this->сезонные[$i] = $s; } } уровни частной функции(): void{ $this->levels = []; $сумма = 0; for($i = 0; $i < $this->L - 1; $i++){ $this->levels[] = null; $sum += $this->series[$i]; } $sum += $this->series[$this->L-1]; $this->levels[] = $sum / $this->L; } тренды частной функции(): void{ $this->trends = []; for($i = 0; $i < $this->L - 1; $i++){ $this->trends[] = null; } $this->trends[] = 0; } частная функция Seasons(): void{ $this->сезонные = []; for($i = 0; $i < $this->L; $i++){ $this->сезонные[] = $this->series[$i] / $this->levels[$this->L-1]; } } прогноз публичной функции (int $k): float { $s = count($this->series); $m = $k - $s + 1; если($м L + (($m-1) % $this->L) + 1; $forecast = ($this->levels[$i] + $m * $this->trends[$i]) * $this->сезонные[$j]; вернуть $прогноз; } } код $h = новый Holt_winters([ 0, // 1 0, 4, 0, 0, 0, 0, 0, 0, 0, // 10 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, // 30 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // 40 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, // 50 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, // 60 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // 70 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, // 80 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, // 90 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 100 0, 0, 0, 0 ], 52); for($i=104; $iforecast($i)."\n"; } вывод 104: -0 105:-0 106: -0,18357964174003 107:-0 108: -0,0018699161641534 109: -0,0026483267704783 110: -0 111: -0 112: -0 113: -0 114: -0 115: -0 116: -0 117:-0 118: -0 119: -0 120:-0 121:0,090811611559135 122:-0 123: -0 124: -0 125: -0,16775378020558 126: -0,18444007603981 127:-0 128:-0 129:-0 130:-0 131: -0 132: -0 133: -0 134: -0 135: -0 136: -0 137:0,19069863282897 138: -0 139: -0 140:-0 141: -0 142: -0 143: -0,28319902525138 144: -0,28961264997615 145: -0 146: -0,30243989942568 147:-0 148: -0 149: -0 150:-0 151: -0 152: -0,68184329554856 153: -0 154: -0,35374889722381 155: -0 156: -0 157:-0 158: -1,5176135844915 159: -0
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»