Polynomial regression: Difference between revisions

Content added Content deleted
m (→‎{{header|Phix}}: Replaced IupPlot with IupGraph, added online link)
Line 987: Line 987:


import (
import (
"fmt"
"fmt"
"log"


"gonum.org/v1/gonum/mat"
"github.com/gonum/matrix/mat64"
)
)


func main() {
var (
var (
x = []float64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
y = []float64{1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321}
x = []float64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
y = []float64{1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321}


degree = 2
degree = 3
)


a = Vandermonde(x, degree)
func main() {
b = mat.NewDense(len(y), 1, y)
a := Vandermonde(x, degree)
b := mat64.NewDense(len(y), 1, y)
c = mat.NewDense(degree, 1, nil)
)
c := mat64.NewDense(degree+1, 1, nil)


qr := new(mat64.QR)
var qr mat.QR
qr.Factorize(a)
qr.Factorize(a)


const trans = false
err := c.SolveQR(qr, false, b)
err := qr.SolveTo(c, trans, b)
if err != nil {
if err != nil {
fmt.Println(err)
log.Fatalf("could not solve QR: %+v", err)
} else {
}
fmt.Printf("%.3f\n", mat64.Formatted(c))
fmt.Printf("%.3f\n", mat.Formatted(c))
}
}
}


func Vandermonde(a []float64, degree int) *mat64.Dense {
func Vandermonde(a []float64, d int) *mat.Dense {
x := mat64.NewDense(len(a), degree+1, nil)
x := mat.NewDense(len(a), d, nil)
for i := range a {
for i := range a {
for j, p := 0, 1.; j <= degree; j, p = j+1, p*a[i] {
for j, p := 0, 1.0; j < d; j, p = j+1, p*a[i] {
x.Set(i, j, p)
x.Set(i, j, p)
}
}
}
}
return x
return x
}</lang>
}</lang>
{{out}}
{{out}}