UNPKG

5.56 kBJavaScriptView Raw
1/**
2 * @copyright 2013 Sonia Keys
3 * @copyright 2016 commenthol
4 * @license MIT
5 * @module fit
6 */
7/**
8 * Fit: Chapter 4, Curve Fitting.
9 */
10
11/**
12 * Linear fits a line to sample data.
13 *
14 * Argument p is a list of data points. Results a and b are coefficients
15 * of the best fit line y = ax + b.
16 */
17export function linear(points) {
18 // (p []struct{ X, Y float64 }) (a, b float64)
19 var sx = 0;
20 var sy = 0;
21 var sx2 = 0;
22 var sxy = 0;
23 for (var _iterator = points, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
24 var _ref;
25
26 if (_isArray) {
27 if (_i >= _iterator.length) break;
28 _ref = _iterator[_i++];
29 } else {
30 _i = _iterator.next();
31 if (_i.done) break;
32 _ref = _i.value;
33 }
34
35 var p = _ref;
36
37 var x = p.x;
38 var y = p.y;
39 sx += x;
40 sy += y;
41 sx2 += x * x;
42 sxy += x * y;
43 }
44 var n = points.length;
45 var d = n * sx2 - sx * sx;
46 // (4.2) p. 36
47 var a = (n * sxy - sx * sy) / d;
48 var b = (sy * sx2 - sx * sxy) / d;
49 return [a, b];
50}
51
52/**
53 * CorrelationCoefficient returns a correlation coefficient for sample data.
54 */
55export function correlationCoefficient(points) {
56 // (p []struct{ X, Y float64 }) float64
57 var sx = 0;
58 var sy = 0;
59 var sx2 = 0;
60 var sy2 = 0;
61 var sxy = 0;
62 for (var _iterator2 = points, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
63 var _ref2;
64
65 if (_isArray2) {
66 if (_i2 >= _iterator2.length) break;
67 _ref2 = _iterator2[_i2++];
68 } else {
69 _i2 = _iterator2.next();
70 if (_i2.done) break;
71 _ref2 = _i2.value;
72 }
73
74 var p = _ref2;
75
76 var x = p.x;
77 var y = p.y;
78 sx += x;
79 sy += y;
80 sx2 += x * x;
81 sy2 += y * y;
82 sxy += x * y;
83 }
84 var n = points.length;
85 // (4.3) p. 38
86 return (n * sxy - sx * sy) / (Math.sqrt(n * sx2 - sx * sx) * Math.sqrt(n * sy2 - sy * sy));
87}
88
89/**
90 * Quadratic fits y = ax² + bx + c to sample data.
91 *
92 * Argument p is a list of data points. Results a, b, and c are coefficients
93 * of the best fit quadratic y = ax² + bx + c.
94 */
95export function quadratic(points) {
96 var P = 0;
97 var Q = 0;
98 var R = 0;
99 var S = 0;
100 var T = 0;
101 var U = 0;
102 var V = 0;
103 for (var _iterator3 = points, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
104 var _ref3;
105
106 if (_isArray3) {
107 if (_i3 >= _iterator3.length) break;
108 _ref3 = _iterator3[_i3++];
109 } else {
110 _i3 = _iterator3.next();
111 if (_i3.done) break;
112 _ref3 = _i3.value;
113 }
114
115 var p = _ref3;
116
117 var x = p.x;
118 var y = p.y;
119 var x2 = x * x;
120 P += x;
121 Q += x2;
122 R += x * x2;
123 S += x2 * x2;
124 T += y;
125 U += x * y;
126 V += x2 * y;
127 }
128 var N = points.length;
129 // (4.5) p. 43
130 var D = N * Q * S + 2 * P * Q * R - Q * Q * Q - P * P * S - N * R * R;
131 // (4.6) p. 43
132 var a = (N * Q * V + P * R * T + P * Q * U - Q * Q * T - P * P * V - N * R * U) / D;
133 var b = (N * S * U + P * Q * V + Q * R * T - Q * Q * U - P * S * T - N * R * V) / D;
134 var c = (Q * S * T + Q * R * U + P * R * V - Q * Q * V - P * S * U - R * R * T) / D;
135 return [a, b, c];
136}
137
138/**
139 * Func3 implements multiple linear regression for a linear combination
140 * of three functions.
141 *
142 * Given sample data and three functions in x, Func3 returns coefficients
143 * a, b, and c fitting y = aƒ₀(x) + bƒ₁(x) + cƒ₂(x) to sample data.
144 */
145export function func3(points, f0, f1, f2) {
146 var M = 0;
147 var P = 0;
148 var Q = 0;
149 var R = 0;
150 var S = 0;
151 var T = 0;
152 var U = 0;
153 var V = 0;
154 var W = 0;
155 for (var _iterator4 = points, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {
156 var _ref4;
157
158 if (_isArray4) {
159 if (_i4 >= _iterator4.length) break;
160 _ref4 = _iterator4[_i4++];
161 } else {
162 _i4 = _iterator4.next();
163 if (_i4.done) break;
164 _ref4 = _i4.value;
165 }
166
167 var p = _ref4;
168
169 var x = p.x;
170 var y = p.y;
171 var y0 = f0(x);
172 var y1 = f1(x);
173 var y2 = f2(x);
174 M += y0 * y0;
175 P += y0 * y1;
176 Q += y0 * y2;
177 R += y1 * y1;
178 S += y1 * y2;
179 T += y2 * y2;
180 U += y * y0;
181 V += y * y1;
182 W += y * y2;
183 }
184 // (4.7) p. 44
185 var D = M * R * T + 2 * P * Q * S - M * S * S - R * Q * Q - T * P * P;
186 var a = (U * (R * T - S * S) + V * (Q * S - P * T) + W * (P * S - Q * R)) / D;
187 var b = (U * (S * Q - P * T) + V * (M * T - Q * Q) + W * (P * Q - M * S)) / D;
188 var c = (U * (P * S - R * Q) + V * (P * Q - M * S) + W * (M * R - P * P)) / D;
189 return [a, b, c];
190}
191
192/**
193 * Func1 fits a linear multiple of a function to sample data.
194 *
195 * Given sample data and a function in x, Func1 returns coefficient
196 * a fitting y = aƒ(x).
197 */
198export function func1(points, f) {
199 var syf = 0;
200 var sf2 = 0;
201 // (4.8) p. 45
202 for (var _iterator5 = points, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {
203 var _ref5;
204
205 if (_isArray5) {
206 if (_i5 >= _iterator5.length) break;
207 _ref5 = _iterator5[_i5++];
208 } else {
209 _i5 = _iterator5.next();
210 if (_i5.done) break;
211 _ref5 = _i5.value;
212 }
213
214 var p = _ref5;
215
216 var fx = f(p.x);
217 var y = p.y;
218 syf += y * fx;
219 sf2 += fx * fx;
220 }
221 return syf / sf2;
222}
223
224export default {
225 linear: linear,
226 correlationCoefficient: correlationCoefficient,
227 quadratic: quadratic,
228 func3: func3,
229 func1: func1
230};
\No newline at end of file