Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>You can do a <a href="http://en.wikipedia.org/wiki/Simple_linear_regression" rel="nofollow">least-squares fit</a> of a line.</p> <pre><code>function LineFitter() { this.count = 0; this.sumX = 0; this.sumX2 = 0; this.sumXY = 0; this.sumY = 0; } LineFitter.prototype = { 'add': function(x, y) { this.count++; this.sumX += x; this.sumX2 += x*x; this.sumXY += x*y; this.sumY += y; }, 'project': function(x) { var det = this.count * this.sumX2 - this.sumX * this.sumX; var offset = (this.sumX2 * this.sumY - this.sumX * this.sumXY) / det; var scale = (this.count * this.sumXY - this.sumX * this.sumY) / det; return offset + x * scale; } }; function linearProject(data, x) { var fitter = new LineFitter(); for (var i = 0; i &lt; data.length; i++) { fitter.add(i, data[i]); } return fitter.project(x); } </code></pre> <p><strong>Example:</strong></p> <pre><code>&gt;&gt;&gt; linearProject([ 21410, 21886, 21837, 21895, 21564, 21714, 21571, 21324, 21310, 21390, 21764, 21598, 21493, 21352, 21478, 21058, 20942, 20825, 21321, 20950, 21039, 21117, 20733, 20773, 20929, 20900, 20687, 20999 ], 60); 19489.614121510676 </code></pre> <hr> <p>Doing something similar for a square polynomial is a little more complicated:</p> <pre><code>function SquareFitter() { this.count = 0; this.sumX = 0; this.sumX2 = 0; this.sumX3 = 0; this.sumX4 = 0; this.sumY = 0; this.sumXY = 0; this.sumX2Y = 0; } SquareFitter.prototype = { 'add': function(x, y) { this.count++; this.sumX += x; this.sumX2 += x*x; this.sumX3 += x*x*x; this.sumX4 += x*x*x*x; this.sumY += y; this.sumXY += x*y; this.sumX2Y += x*x*y; }, 'project': function(x) { var det = this.count*this.sumX2*this.sumX4 - this.count*this.sumX3*this.sumX3 - this.sumX*this.sumX*this.sumX4 + 2*this.sumX*this.sumX2*this.sumX3 - this.sumX2*this.sumX2*this.sumX2; var offset = this.sumX*this.sumX2Y*this.sumX3 - this.sumX*this.sumX4*this.sumXY - this.sumX2*this.sumX2*this.sumX2Y + this.sumX2*this.sumX3*this.sumXY + this.sumX2*this.sumX4*this.sumY - this.sumX3*this.sumX3*this.sumY; var scale = -this.count*this.sumX2Y*this.sumX3 + this.count*this.sumX4*this.sumXY + this.sumX*this.sumX2*this.sumX2Y - this.sumX*this.sumX4*this.sumY - this.sumX2*this.sumX2*this.sumXY + this.sumX2*this.sumX3*this.sumY; var accel = this.sumY*this.sumX*this.sumX3 - this.sumY*this.sumX2*this.sumX2 - this.sumXY*this.count*this.sumX3 + this.sumXY*this.sumX2*this.sumX - this.sumX2Y*this.sumX*this.sumX + this.sumX2Y*this.count*this.sumX2; return (offset + x*scale + x*x*accel)/det; } }; function squareProject(data) { var fitter = new SquareFitter(); for (var i = 0; i &lt; data.length; i++) { fitter.add(i, data[i]); } return fitter.project(60); } </code></pre> <p><strong>Example2:</strong></p> <pre><code>&gt;&gt;&gt; squareProject([ 21410, 21886, 21837, 21895, 21564, 21714, 21571, 21324, 21310, 21390, 21764, 21598, 21493, 21352, 21478, 21058, 20942, 20825, 21321, 20950, 21039, 21117, 20733, 20773, 20929, 20900, 20687, 20999 ], 60); 19282.85862700518 </code></pre> <p>I could do this for higher degree polynomials, but the expressions would get even longer. For arbitrary degree, you would have to look at matrices.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload