Polynomial regression: Difference between revisions

Content added Content deleted
(→‎{{header|Ruby}}: improved precision by using rationals, converting to floats as late as possible.)
Line 1,457: Line 1,457:


def regress x, y, degree
def regress x, y, degree
x_data = x.map { |xi| (0..degree).map { |pow| (xi**pow).to_f } }
x_data = x.map { |xi| (0..degree).map { |pow| (xi**pow).to_r } }


mx = Matrix[*x_data]
mx = Matrix[*x_data]
my = Matrix.column_vector(y)
my = Matrix.column_vector(y)


((mx.t * mx).inv * mx.t * my).transpose.to_a[0]
((mx.t * mx).inv * mx.t * my).transpose.to_a[0].map(&:to_f)
end</lang>
end</lang>
'''Testing:'''
'''Testing:'''
<lang ruby>betas = regress [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
<lang ruby>p regress([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321],
[1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321],
2
2)</lang>

p betas</lang>
{{out}}
{{out}}
<pre>[1.00000000000018, 2.00000000000011, 3.00000000000001]</pre>
<pre>[1.0, 2.0, 3.0]</pre>


=={{header|Sidef}}==
=={{header|Sidef}}==