polynomial_regression.sf 538 B

12345678910111213141516171819202122232425262728
  1. #!/usr/bin/ruby
  2. # Find an approximating polynomial of known degree for a given dataset.
  3. # See also:
  4. # https://rosettacode.org/wiki/Polynomial_regression
  5. # https://en.wikipedia.org/wiki/Polynomial_regression
  6. func regress(x, y, degree) {
  7. var A = Matrix.build(x.len, degree+1, {|i,j|
  8. x[i]**j
  9. })
  10. var B = Matrix.column_vector(y...)
  11. ((A.transpose * A)**(-1) * A.transpose * B).transpose[0]
  12. }
  13. func poly(x) {
  14. 3*x**2 + 2*x + 1
  15. }
  16. var coeff = regress(
  17. 10.of { _ },
  18. 10.of { poly(_) },
  19. 2
  20. )
  21. say coeff