Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.49 KB | None | 0 0
  1. var exports = module.exports = {};
  2.  
  3. /*Simple exponential smoothing */
  4.  
  5. exports.SimpleExponentialSmoothing = function(data, alpha)
  6. {
  7. if(data == null)
  8. {
  9. throw "data parameter is null";
  10. }
  11. else if(data.length < 2)
  12. {
  13. throw "data doesn't contain enough data to make a prediction";
  14. }
  15.  
  16. if(alpha > 1 || alpha < 0)
  17. {
  18. throw "alpha parameter must be between 0 and 1";
  19. }
  20.  
  21. this.data = data;
  22. this.alpha = alpha;
  23. this.forecast = null;
  24. };
  25.  
  26. exports.SimpleExponentialSmoothing.prototype.predict = function()
  27. {
  28. var forecast = Array();
  29. forecast[0] = null;
  30. forecast[1] = 0.5*(this.data[0] + this.data[1]);
  31.  
  32. for(var i = 2; i <= this.data.length; ++i)
  33. {
  34. forecast[i] = this.alpha*(this.data[i-1] - forecast[i-1]) + forecast[i-1];
  35. }
  36.  
  37. this.forecast = forecast;
  38. return forecast;
  39. };
  40.  
  41. exports.SimpleExponentialSmoothing.prototype.getForecast = function()
  42. {
  43. if(this.forecast == null)
  44. {
  45. this.predict();
  46. }
  47. return this.forecast;
  48. }
  49.  
  50. exports.SimpleExponentialSmoothing.prototype.computeMeanSquaredError = function()
  51. {
  52. var SSE = 0.0;
  53. var n = 0;
  54. for(var i = 0; i < this.data.length; ++i)
  55. {
  56. if(this.data[i] != null && this.forecast[i] != null)
  57. {
  58. SSE += Math.pow(this.data[i] - this.forecast[i], 2);
  59. n++;
  60. }
  61.  
  62. }
  63. return 1/(n-1)*SSE;
  64. };
  65.  
  66. exports.SimpleExponentialSmoothing.prototype.optimizeParameter = function(iter)
  67. {
  68. var incr = 1/iter;
  69. var bestAlpha = 0.0;
  70. var bestError = -1;
  71. this.alpha = bestAlpha;
  72.  
  73. while(this.alpha < 1)
  74. {
  75. var forecast = this.predict();
  76. var error = this.computeMeanSquaredError();
  77. if(error < bestError || bestError == -1)
  78. {
  79. bestAlpha = this.alpha;
  80. bestError = error;
  81. }
  82. this.alpha += incr;
  83. }
  84.  
  85. this.alpha = bestAlpha;
  86. return this.alpha;
  87. }
  88.  
  89.  
  90.  
  91.  
  92. /*Double exponential smoothing */
  93.  
  94.  
  95. exports.DoubleExponentialSmoothing = function(data, alpha)
  96. {
  97. if(data == null)
  98. {
  99. throw "data parameter is null";
  100. }
  101. else if(data.length < 2)
  102. {
  103. throw "data doesn't contain enough data to make a prediction";
  104. }
  105.  
  106. if(alpha > 1 || alpha < 0)
  107. {
  108. throw "alpha parameter must be between 0 and 1";
  109. }
  110.  
  111. this.data = data;
  112. this.alpha = alpha;
  113. this.forecast = null;
  114. };
  115.  
  116. exports.DoubleExponentialSmoothing.prototype.predict =function (horizon)
  117. {
  118. var smoothings = Object();
  119. smoothings.first = Array();
  120. smoothings.second = Array();
  121.  
  122. smoothings.first[0] = this.data[0];
  123. smoothings.first[1] = this.data[1];
  124.  
  125. for(var i = 2; i < this.data.length; ++i)
  126. {
  127. smoothings.first[i] = this.alpha*this.data[i] + (1-this.alpha)*smoothings.first[i-1];
  128. }
  129.  
  130. smoothings.second[0] = smoothings.first[0];
  131. for(var i = 1; i < this.data.length; ++i)
  132. {
  133. smoothings.second[i] = this.alpha*smoothings.first[i] + (1-this.alpha)*smoothings.second[i-1];
  134. }
  135.  
  136. smoothings.a = Array();
  137. smoothings.b = Array();
  138. for(var i = 1; i < this.data.length; ++i)
  139. {
  140. smoothings.a[i] = (this.alpha/(1-this.alpha))*(smoothings.first[i] - smoothings.second[i]);
  141. smoothings.b[i] = 2*smoothings.first[i] - smoothings.second[i];
  142. }
  143.  
  144. var forecast = Array();
  145. forecast[0] = null;
  146. forecast[1] = null;
  147. for(var i = 2; i <= this.data.length; ++i)
  148. {
  149. forecast[i] = smoothings.a[i-1] + smoothings.b[i-1];
  150. }
  151.  
  152. for(var i = this.data.length +1; i < this.data.length + horizon; ++i)
  153. {
  154. forecast[i] = forecast[i-1] + smoothings.a[this.data.length-1];
  155. }
  156.  
  157. this.forecast = forecast;
  158. return forecast;
  159. }
  160.  
  161. exports.DoubleExponentialSmoothing.prototype.getForecast = function()
  162. {
  163. if(this.forecast == null)
  164. {
  165. return null;
  166. }
  167. return this.forecast;
  168. }
  169.  
  170. exports.DoubleExponentialSmoothing.prototype.computeMeanSquaredError = function()
  171. {
  172. var SSE = 0.0;
  173. var n = 0;
  174. for(var i = 0; i < this.data.length; ++i)
  175. {
  176. if(this.data[i] != null && this.forecast[i] != null)
  177. {
  178. SSE += Math.pow(this.data[i] - this.forecast[i], 2);
  179. n++;
  180. }
  181.  
  182. }
  183. return 1/(n-1)*SSE;
  184. };
  185.  
  186. exports.DoubleExponentialSmoothing.prototype.optimizeParameter = function(iter)
  187. {
  188. var incr = 1/iter;
  189. var bestAlpha = 0.0;
  190. var bestError = -1;
  191. this.alpha = bestAlpha;
  192.  
  193. while(this.alpha < 1)
  194. {
  195. var forecast = this.predict();
  196. var error = this.computeMeanSquaredError();
  197. if(error < bestError || bestError == -1)
  198. {
  199. bestAlpha = this.alpha;
  200. bestError = error;
  201. }
  202. this.alpha += incr;
  203. }
  204.  
  205. this.alpha = bestAlpha;
  206. return this.alpha;
  207. }
  208.  
  209. /*Holt smoothing */
  210. exports.HoltSmoothing = function(data, alpha, gamma)
  211. {
  212. if(data == null)
  213. {
  214. throw "data parameter is null";
  215. }
  216. else if(data.length < 2)
  217. {
  218. throw "data doesn't contain enough data to make a prediction";
  219. }
  220.  
  221. if(alpha > 1 || alpha < 0)
  222. {
  223. throw "alpha parameter must be between 0 and 1";
  224. }
  225.  
  226. if(gamma > 1 || gamma < 0)
  227. {
  228. throw "gamma parameter must be between 0 and 1";
  229. }
  230.  
  231. this.data = data;
  232. this.alpha = alpha;
  233. this.gamma = gamma;
  234. this.forecast = null;
  235. };
  236.  
  237. exports.HoltSmoothing.prototype.predict =function (horizon)
  238. {
  239. A = Array();
  240. B = Array();
  241.  
  242. A[0] = 0;
  243. B[0] = this.data[0];
  244.  
  245. for(var i = 1; i < this.data.length; ++i)
  246. {
  247. B[i] = this.alpha*this.data[i] + (1-this.alpha)*(B[i-1] + A[i-1]);
  248. A[i] = this.gamma*(B[i]-B[i-1])+ (1-this.gamma)*A[i-1];
  249. }
  250.  
  251. var forecast = Array();
  252. forecast[0] = null;
  253. for(var i = 1; i <= this.data.length; ++i)
  254. {
  255. forecast[i] = A[i-1] + B[i-1];
  256. }
  257.  
  258. for(var i = this.data.length +1; i < this.data.length + horizon; ++i)
  259. {
  260. forecast[i] = forecast[i-1] + A[this.data.length - 1];
  261. }
  262.  
  263.  
  264. this.forecast = forecast;
  265. return forecast;
  266. }
  267.  
  268.  
  269. exports.HoltSmoothing.prototype.getForecast = function()
  270. {
  271. if(this.forecast == null)
  272. {
  273. return null;
  274. }
  275. return this.forecast;
  276. }
  277.  
  278. exports.HoltSmoothing.prototype.computeMeanSquaredError = function()
  279. {
  280. var SSE = 0.0;
  281. var n = 0;
  282. for(var i = 0; i < this.data.length; ++i)
  283. {
  284. if(this.data[i] != null && this.forecast[i] != null)
  285. {
  286. SSE += Math.pow(this.data[i] - this.forecast[i], 2);
  287. n++;
  288. }
  289.  
  290. }
  291. return 1/(n-1)*SSE;
  292. };
  293.  
  294. exports.HoltSmoothing.prototype.optimizeParameters = function(iter)
  295. {
  296. var incr = 1/iter;
  297. var bestAlpha = 0.0;
  298. var bestError = -1;
  299. this.alpha = bestAlpha;
  300. var bestGamma = 0.0;
  301. this.gamma = bestGamma;
  302.  
  303. while(this.alpha < 1)
  304. {
  305. while(this.gamma < 1)
  306. {
  307. var forecast = this.predict();
  308. var error = this.computeMeanSquaredError();
  309. if(error < bestError || bestError == -1)
  310. {
  311. bestAlpha = this.alpha;
  312. bestGamma = this.gamma;
  313. bestError = error;
  314. }
  315. this.gamma += incr;
  316. }
  317. this.gamma = 0;
  318. this.alpha += incr;
  319. }
  320.  
  321. this.alpha = bestAlpha;
  322. this.gamma = bestGamma;
  323. return {"alpha":this.alpha, "gamma":this.gamma};
  324. }
  325.  
  326. /*Holt Winters smoothing */
  327. exports.HoltWintersSmoothing = function(data, alpha, gamma, delta, seasonLength, mult)
  328. {
  329. if(data == null)
  330. {
  331. throw "data parameter is null";
  332. }
  333. else if(data.length < 2)
  334. {
  335. throw "data doesn't contain enough data to make a prediction";
  336. }
  337.  
  338. if(alpha > 1 || alpha < 0)
  339. {
  340. throw "alpha parameter must be between 0 and 1";
  341. }
  342.  
  343. if(gamma > 1 || gamma < 0)
  344. {
  345. throw "gamma parameter must be between 0 and 1";
  346. }
  347.  
  348. if(delta > 1 || delta < 0)
  349. {
  350. throw "delta parameter must be between 0 and 1";
  351. }
  352.  
  353. if(seasonLength < 0)
  354. {
  355. throw "seasonLength parameter must be a positive integer";
  356. }
  357.  
  358. if(mult != true && mult != false)
  359. {
  360. throw "mult parameter must be a boolean";
  361. }
  362.  
  363. this.data = data;
  364. this.alpha = alpha;
  365. this.gamma = gamma;
  366. this.delta = delta;
  367. this.seasonLength = seasonLength;
  368. this.mult = mult;
  369. this.forecast = null;
  370. };
  371.  
  372. exports.HoltWintersSmoothing.prototype.predict =function ()
  373. {
  374. if(this.mult)
  375. {
  376. return this.predictMult();
  377. }
  378. else
  379. {
  380. return this.predictAdd();
  381. }
  382. }
  383.  
  384. exports.HoltWintersSmoothing.prototype.predictAdd = function()
  385. {
  386. A = Array();
  387. B = Array();
  388. S = Array();
  389.  
  390. A[this.seasonLength-1] = 0;
  391. var averageFirstSeason = 0;
  392. for(var i = 0; i < this.seasonLength; ++i)
  393. {
  394. averageFirstSeason += this.data[i];
  395. }
  396. B[this.seasonLength-1] = averageFirstSeason/this.seasonLength;
  397.  
  398. for(var i = 0; i < this.seasonLength; ++i)
  399. {
  400. S[i] = this.data[i] - averageFirstSeason/this.seasonLength;
  401. }
  402.  
  403. for(var i = this.seasonLength; i < this.data.length; ++i)
  404. {
  405. B[i] = this.alpha*(this.data[i]- S[i - this.seasonLength])+(1-this.alpha)*(B[i-1]+A[i-1]);
  406. A[i] = this.gamma*(B[i]-B[i-1])+(1-this.gamma)*A[i-1];
  407. S[i] = this.delta*(this.data[i]-B[i])+(1-this.delta)*S[i-this.seasonLength];
  408. }
  409.  
  410. var forecast = Array();
  411. for(var i = 0; i < this.seasonLength; ++i)
  412. {
  413. forecast[i]= null;
  414. }
  415.  
  416. for(var i = this.seasonLength; i < this.data.length; ++i)
  417. {
  418. forecast[i] = A[i-1] + B[i-1] + S[i - this.seasonLength];
  419. }
  420.  
  421. for(var i = this.data.length; i < this.data.length + this.seasonLength; ++i)
  422. {
  423. forecast[i] = B[this.data.length-1] + (i - this.data.length + 1)*A[this.data.length-1] + S[i - this.seasonLength];
  424. }
  425.  
  426. this.forecast = forecast;
  427. return forecast;
  428. }
  429.  
  430. exports.HoltWintersSmoothing.prototype.predictMult = function()
  431. {
  432. A = Array();
  433. B = Array();
  434. S = Array();
  435.  
  436. A[this.seasonLength-1] = 0;
  437. var averageFirstSeason = 0;
  438. for(var i = 0; i < this.seasonLength; ++i)
  439. {
  440. averageFirstSeason += this.data[i];
  441. }
  442. B[this.seasonLength-1] = averageFirstSeason/this.seasonLength;
  443.  
  444. for(var i = 0; i < this.seasonLength; ++i)
  445. {
  446. S[i] = (this.data[i])/(averageFirstSeason/this.seasonLength);
  447. }
  448.  
  449. for(var i = this.seasonLength; i < this.data.length; ++i)
  450. {
  451. B[i] = this.alpha*(this.data[i]/S[i - this.seasonLength])+(1-this.alpha)*(B[i-1]+A[i-1]);
  452. A[i] = this.gamma*(B[i]-B[i-1])+(1-this.gamma)*A[i-1];
  453. S[i] = this.delta*(this.data[i]/B[i])+(1-this.delta)*S[i-this.seasonLength];
  454. }
  455.  
  456. var forecast = Array();
  457. for(var i = 0; i < this.seasonLength; ++i)
  458. {
  459. forecast[i]= null;
  460. }
  461.  
  462. for(var i = this.seasonLength; i < this.data.length; ++i)
  463. {
  464. forecast[i] = (A[i-1] + B[i-1])*S[i - this.seasonLength];
  465. }
  466.  
  467. for(var i = this.data.length; i < this.data.length + this.seasonLength; ++i)
  468. {
  469. forecast[i] = (B[this.data.length-1] + (i - this.data.length + 1)*A[this.data.length-1])*S[i -this.seasonLength];
  470. }
  471.  
  472. this.forecast = forecast;
  473. return forecast;
  474. }
  475.  
  476. exports.HoltWintersSmoothing.prototype.getForecast = function()
  477. {
  478. if(this.forecast == null)
  479. {
  480. this.predict();
  481. }
  482. return this.forecast;
  483. }
  484.  
  485. exports.HoltWintersSmoothing.prototype.computeMeanSquaredError = function()
  486. {
  487. var SSE = 0.0;
  488. var n = 0;
  489. for(var i = 0; i < this.data.length; ++i)
  490. {
  491. if(this.data[i] != null && this.forecast[i] != null)
  492. {
  493. SSE += Math.pow(this.data[i] - this.forecast[i], 2);
  494. n++;
  495. }
  496.  
  497. }
  498. return 1/(n-1)*SSE;
  499. };
  500.  
  501. exports.HoltWintersSmoothing.prototype.optimizeParameters = function(iter)
  502. {
  503. var incr = 1/iter;
  504. var bestAlpha = 0.0;
  505. var bestError = -1;
  506. this.alpha = bestAlpha;
  507. var bestGamma = 0.0;
  508. this.gamma = bestGamma;
  509. var bestDelta = 0.0;
  510. this.delta = bestDelta;
  511.  
  512. while(this.alpha < 1)
  513. {
  514. while(this.gamma < 1)
  515. {
  516. while(this.delta < 1)
  517. {
  518. var forecast = this.predict();
  519. var error = this.computeMeanSquaredError();
  520. if(error < bestError || bestError == -1)
  521. {
  522. bestAlpha = this.alpha;
  523. bestGamma = this.gamma;
  524. bestDelta = this.delta;
  525. bestError = error;
  526. }
  527. this.delta += incr;
  528. }
  529. this.delta = 0;
  530. this.gamma += incr;
  531. }
  532. this.gamma = 0;
  533. this.alpha += incr;
  534. }
  535.  
  536. this.alpha = bestAlpha;
  537. this.gamma = bestGamma;
  538. this.delta = bestDelta;
  539. return {"alpha":this.alpha, "gamma":this.gamma, "delta":this.delta};
  540. }
  541.  
  542. /*Moving average */
  543.  
  544. exports.MovingAverage = function(data)
  545. {
  546. if(data == null)
  547. {
  548. throw "data parameter is null";
  549. }
  550. else if(data.length < 3)
  551. {
  552. throw "data doesn't contain enough data to make a prediction";
  553. }
  554.  
  555. this.data = data;
  556. };
  557.  
  558. exports.MovingAverage.prototype.smooth = function(order)
  559. {
  560. if(order < 1)
  561. {
  562. throw "order parameter must be a positive integer";
  563. }
  564.  
  565. var result = Array();
  566.  
  567. for(var i = order; i < this.data.length - order ; ++i)
  568. {
  569. result[i] = 0;
  570. for(var j = i - order; j <= i + order; j++)
  571. {
  572. result[i] += this.data[j];
  573. }
  574. result[i] /= 2*order +1;
  575. }
  576.  
  577. return result;
  578. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement