tasks a-s
This commit is contained in:
parent
47bf37c096
commit
b83f433714
12433 changed files with 156208 additions and 123 deletions
11
Task/Polynomial-regression/0DESCRIPTION
Normal file
11
Task/Polynomial-regression/0DESCRIPTION
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
Find an approximating polynom of known degree for a given data.
|
||||
|
||||
Example:
|
||||
For input data:
|
||||
x = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
||||
y = {1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321};
|
||||
The approximating polynom is:
|
||||
3 x<sup>2</sup> + 2 x + 1
|
||||
Here, the polynom's coefficients are (3, 2, 1).
|
||||
|
||||
This task is intended as a subtask for [[Measure relative performance of sorting algorithms implementations]].
|
||||
2
Task/Polynomial-regression/1META.yaml
Normal file
2
Task/Polynomial-regression/1META.yaml
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
---
|
||||
note: Mathematical operations|Matrices
|
||||
114
Task/Polynomial-regression/ALGOL-68/polynomial-regression.alg
Normal file
114
Task/Polynomial-regression/ALGOL-68/polynomial-regression.alg
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
MODE FIELD = REAL;
|
||||
|
||||
MODE
|
||||
VEC = [0]FIELD,
|
||||
MAT = [0,0]FIELD;
|
||||
|
||||
PROC VOID raise index error := VOID: (
|
||||
print(("stop", new line));
|
||||
stop
|
||||
);
|
||||
|
||||
COMMENT from http://rosettacode.org/wiki/Matrix_Transpose#ALGOL_68 END COMMENT
|
||||
OP ZIP = ([,]FIELD in)[,]FIELD:(
|
||||
[2 LWB in:2 UPB in,1 LWB in:1UPB in]FIELD out;
|
||||
FOR i FROM LWB in TO UPB in DO
|
||||
out[,i]:=in[i,]
|
||||
OD;
|
||||
out
|
||||
);
|
||||
|
||||
COMMENT from http://rosettacode.org/wiki/Matrix_multiplication#ALGOL_68 END COMMENT
|
||||
OP * = (VEC a,b)FIELD: ( # basically the dot product #
|
||||
FIELD result:=0;
|
||||
IF LWB a/=LWB b OR UPB a/=UPB b THEN raise index error FI;
|
||||
FOR i FROM LWB a TO UPB a DO result+:= a[i]*b[i] OD;
|
||||
result
|
||||
);
|
||||
|
||||
OP * = (VEC a, MAT b)VEC: ( # overload vector times matrix #
|
||||
[2 LWB b:2 UPB b]FIELD result;
|
||||
IF LWB a/=LWB b OR UPB a/=UPB b THEN raise index error FI;
|
||||
FOR j FROM 2 LWB b TO 2 UPB b DO result[j]:=a*b[,j] OD;
|
||||
result
|
||||
);
|
||||
|
||||
OP * = (MAT a, b)MAT: ( # overload matrix times matrix #
|
||||
[LWB a:UPB a, 2 LWB b:2 UPB b]FIELD result;
|
||||
IF 2 LWB a/=LWB b OR 2 UPB a/=UPB b THEN raise index error FI;
|
||||
FOR k FROM LWB result TO UPB result DO result[k,]:=a[k,]*b OD;
|
||||
result
|
||||
);
|
||||
|
||||
COMMENT from http://rosettacode.org/wiki/Pyramid_of_numbers#ALGOL_68 END COMMENT
|
||||
OP / = (VEC a, MAT b)VEC: ( # vector division #
|
||||
[LWB a:UPB a,1]FIELD transpose a;
|
||||
transpose a[,1]:=a;
|
||||
(transpose a/b)[,1]
|
||||
);
|
||||
|
||||
OP / = (MAT a, MAT b)MAT:( # matrix division #
|
||||
[LWB b:UPB b]INT p ;
|
||||
INT sign;
|
||||
[,]FIELD lu = lu decomp(b, p, sign);
|
||||
[LWB a:UPB a, 2 LWB a:2 UPB a]FIELD out;
|
||||
FOR col FROM 2 LWB a TO 2 UPB a DO
|
||||
out[,col] := lu solve(b, lu, p, a[,col]) [@LWB out[,col]]
|
||||
OD;
|
||||
out
|
||||
);
|
||||
|
||||
FORMAT int repr = $g(0)$,
|
||||
real repr = $g(-7,4)$;
|
||||
|
||||
PROC fit = (VEC x, y, INT order)VEC:
|
||||
BEGIN
|
||||
[0:order, LWB x:UPB x]FIELD a; # the plane #
|
||||
FOR i FROM 2 LWB a TO 2 UPB a DO
|
||||
FOR j FROM LWB a TO UPB a DO
|
||||
a [j, i] := x [i]**j
|
||||
OD
|
||||
OD;
|
||||
( y * ZIP a ) / ( a * ZIP a )
|
||||
END # fit #;
|
||||
|
||||
PROC print polynomial = (VEC x)VOID: (
|
||||
BOOL empty := TRUE;
|
||||
FOR i FROM UPB x BY -1 TO LWB x DO
|
||||
IF x[i] NE 0 THEN
|
||||
IF x[i] > 0 AND NOT empty THEN print ("+") FI;
|
||||
empty := FALSE;
|
||||
IF x[i] NE 1 OR i=0 THEN
|
||||
IF ENTIER x[i] = x[i] THEN
|
||||
printf((int repr, x[i]))
|
||||
ELSE
|
||||
printf((real repr, x[i]))
|
||||
FI
|
||||
FI;
|
||||
CASE i+1 IN
|
||||
SKIP,print(("x"))
|
||||
OUT
|
||||
printf(($"x**"g(0)$,i))
|
||||
ESAC
|
||||
FI
|
||||
OD;
|
||||
IF empty THEN print("0") FI;
|
||||
print(new line)
|
||||
);
|
||||
|
||||
fitting: BEGIN
|
||||
VEC c =
|
||||
fit
|
||||
( (0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0),
|
||||
(1.0, 6.0, 17.0, 34.0, 57.0, 86.0, 121.0, 162.0, 209.0, 262.0, 321.0),
|
||||
2
|
||||
);
|
||||
print polynomial(c);
|
||||
VEC d =
|
||||
fit
|
||||
( (0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
|
||||
(2.7, 2.8, 31.4, 38.1, 58.0, 76.2, 100.5, 130.0, 149.3, 180.0),
|
||||
2
|
||||
);
|
||||
print polynomial(d)
|
||||
END # fitting #
|
||||
12
Task/Polynomial-regression/Ada/polynomial-regression-1.ada
Normal file
12
Task/Polynomial-regression/Ada/polynomial-regression-1.ada
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
with Ada.Numerics.Real_Arrays; use Ada.Numerics.Real_Arrays;
|
||||
|
||||
function Fit (X, Y : Real_Vector; N : Positive) return Real_Vector is
|
||||
A : Real_Matrix (0..N, X'Range); -- The plane
|
||||
begin
|
||||
for I in A'Range (2) loop
|
||||
for J in A'Range (1) loop
|
||||
A (J, I) := X (I)**J;
|
||||
end loop;
|
||||
end loop;
|
||||
return Solve (A * Transpose (A), A * Y);
|
||||
end Fit;
|
||||
15
Task/Polynomial-regression/Ada/polynomial-regression-2.ada
Normal file
15
Task/Polynomial-regression/Ada/polynomial-regression-2.ada
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
with Fit;
|
||||
with Ada.Float_Text_IO; use Ada.Float_Text_IO;
|
||||
|
||||
procedure Fitting is
|
||||
C : constant Real_Vector :=
|
||||
Fit
|
||||
( (0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0),
|
||||
(1.0, 6.0, 17.0, 34.0, 57.0, 86.0, 121.0, 162.0, 209.0, 262.0, 321.0),
|
||||
2
|
||||
);
|
||||
begin
|
||||
Put (C (0), Aft => 3, Exp => 0);
|
||||
Put (C (1), Aft => 3, Exp => 0);
|
||||
Put (C (2), Aft => 3, Exp => 0);
|
||||
end Fitting;
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
INSTALL @lib$+"ARRAYLIB"
|
||||
|
||||
Max% = 10000
|
||||
DIM vector(5), matrix(5,5)
|
||||
DIM x(Max%), x2(Max%), x3(Max%), x4(Max%), x5(Max%)
|
||||
DIM x6(Max%), x7(Max%), x8(Max%), x9(Max%), x10(Max%)
|
||||
DIM y(Max%), xy(Max%), x2y(Max%), x3y(Max%), x4y(Max%), x5y(Max%)
|
||||
|
||||
npts% = 11
|
||||
x() = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
|
||||
y() = 1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321
|
||||
|
||||
sum_x = SUM(x())
|
||||
x2() = x() * x() : sum_x2 = SUM(x2())
|
||||
x3() = x() * x2() : sum_x3 = SUM(x3())
|
||||
x4() = x2() * x2() : sum_x4 = SUM(x4())
|
||||
x5() = x2() * x3() : sum_x5 = SUM(x5())
|
||||
x6() = x3() * x3() : sum_x6 = SUM(x6())
|
||||
x7() = x3() * x4() : sum_x7 = SUM(x7())
|
||||
x8() = x4() * x4() : sum_x8 = SUM(x8())
|
||||
x9() = x4() * x5() : sum_x9 = SUM(x9())
|
||||
x10() = x5() * x5() : sum_x10 = SUM(x10())
|
||||
|
||||
sum_y = SUM(y())
|
||||
xy() = x() * y() : sum_xy = SUM(xy())
|
||||
x2y() = x2() * y() : sum_x2y = SUM(x2y())
|
||||
x3y() = x3() * y() : sum_x3y = SUM(x3y())
|
||||
x4y() = x4() * y() : sum_x4y = SUM(x4y())
|
||||
x5y() = x5() * y() : sum_x5y = SUM(x5y())
|
||||
|
||||
matrix() = \
|
||||
\ npts%, sum_x, sum_x2, sum_x3, sum_x4, sum_x5, \
|
||||
\ sum_x, sum_x2, sum_x3, sum_x4, sum_x5, sum_x6, \
|
||||
\ sum_x2, sum_x3, sum_x4, sum_x5, sum_x6, sum_x7, \
|
||||
\ sum_x3, sum_x4, sum_x5, sum_x6, sum_x7, sum_x8, \
|
||||
\ sum_x4, sum_x5, sum_x6, sum_x7, sum_x8, sum_x9, \
|
||||
\ sum_x5, sum_x6, sum_x7, sum_x8, sum_x9, sum_x10
|
||||
|
||||
vector() = \
|
||||
\ sum_y, sum_xy, sum_x2y, sum_x3y, sum_x4y, sum_x5y
|
||||
|
||||
PROC_invert(matrix())
|
||||
vector() = matrix().vector()
|
||||
|
||||
@% = &2040A
|
||||
PRINT "Polynomial coefficients = "
|
||||
FOR term% = 5 TO 0 STEP -1
|
||||
PRINT ;vector(term%) " * x^" STR$(term%)
|
||||
NEXT
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
public static double[] Polyfit(double[] x, double[] y, int degree)
|
||||
{
|
||||
// Vandermonde matrix
|
||||
var v = new DenseMatrix(x.Length, degree + 1);
|
||||
for (int i = 0; i < v.RowCount; i++)
|
||||
for (int j = 0; j <= degree; j++) v[i, j] = Math.Pow(x[i], j);
|
||||
var yv = new DenseVector(y).ToColumnMatrix();
|
||||
QR qr = v.QR();
|
||||
// Math.Net doesn't have an "economy" QR, so:
|
||||
// cut R short to square upper triangle, then recompute Q
|
||||
var r = qr.R.SubMatrix(0, degree + 1, 0, degree + 1);
|
||||
var q = v.Multiply(r.Inverse());
|
||||
var p = r.Inverse().Multiply(q.TransposeThisAndMultiply(yv));
|
||||
return p.Column(0).ToArray();
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
static void Main(string[] args)
|
||||
{
|
||||
const int degree = 2;
|
||||
var x = new[] {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0};
|
||||
var y = new[] {1.0, 6.0, 17.0, 34.0, 57.0, 86.0, 121.0, 162.0, 209.0, 262.0, 321.0};
|
||||
var p = Polyfit(x, y, degree);
|
||||
foreach (var d in p) Console.Write("{0} ",d);
|
||||
Console.WriteLine();
|
||||
for (int i = 0; i < x.Length; i++ )
|
||||
Console.WriteLine("{0} => {1} diff {2}", x[i], Polyval(p,x[i]), y[i] - Polyval(p,x[i]));
|
||||
Console.ReadKey(true);
|
||||
}
|
||||
8
Task/Polynomial-regression/C/polynomial-regression-1.c
Normal file
8
Task/Polynomial-regression/C/polynomial-regression-1.c
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#ifndef _POLIFITGSL_H
|
||||
#define _POLIFITGSL_H
|
||||
#include <gsl/gsl_multifit.h>
|
||||
#include <stdbool.h>
|
||||
#include <math.h>
|
||||
bool polynomialfit(int obs, int degree,
|
||||
double *dx, double *dy, double *store); /* n, p */
|
||||
#endif
|
||||
42
Task/Polynomial-regression/C/polynomial-regression-2.c
Normal file
42
Task/Polynomial-regression/C/polynomial-regression-2.c
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
#include "polifitgsl.h"
|
||||
|
||||
bool polynomialfit(int obs, int degree,
|
||||
double *dx, double *dy, double *store) /* n, p */
|
||||
{
|
||||
gsl_multifit_linear_workspace *ws;
|
||||
gsl_matrix *cov, *X;
|
||||
gsl_vector *y, *c;
|
||||
double chisq;
|
||||
|
||||
int i, j;
|
||||
|
||||
X = gsl_matrix_alloc(obs, degree);
|
||||
y = gsl_vector_alloc(obs);
|
||||
c = gsl_vector_alloc(degree);
|
||||
cov = gsl_matrix_alloc(degree, degree);
|
||||
|
||||
for(i=0; i < obs; i++) {
|
||||
gsl_matrix_set(X, i, 0, 1.0);
|
||||
for(j=0; j < degree; j++) {
|
||||
gsl_matrix_set(X, i, j, pow(dx[i], j));
|
||||
}
|
||||
gsl_vector_set(y, i, dy[i]);
|
||||
}
|
||||
|
||||
ws = gsl_multifit_linear_alloc(obs, degree);
|
||||
gsl_multifit_linear(X, y, c, cov, &chisq, ws);
|
||||
|
||||
/* store result ... */
|
||||
for(i=0; i < degree; i++)
|
||||
{
|
||||
store[i] = gsl_vector_get(c, i);
|
||||
}
|
||||
|
||||
gsl_multifit_linear_free(ws);
|
||||
gsl_matrix_free(X);
|
||||
gsl_matrix_free(cov);
|
||||
gsl_vector_free(y);
|
||||
gsl_vector_free(c);
|
||||
return true; /* we do not "analyse" the result (cov matrix mainly)
|
||||
to know if the fit is "good" */
|
||||
}
|
||||
21
Task/Polynomial-regression/C/polynomial-regression-3.c
Normal file
21
Task/Polynomial-regression/C/polynomial-regression-3.c
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
#include <stdio.h>
|
||||
|
||||
#include "polifitgsl.h"
|
||||
|
||||
#define NP 11
|
||||
double x[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
||||
double y[] = {1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321};
|
||||
|
||||
#define DEGREE 3
|
||||
double coeff[DEGREE];
|
||||
|
||||
int main()
|
||||
{
|
||||
int i;
|
||||
|
||||
polynomialfit(NP, DEGREE, x, y, coeff);
|
||||
for(i=0; i < DEGREE; i++) {
|
||||
printf("%lf\n", coeff[i]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
;; Least square fit of a polynomial of order n the x-y-curve.
|
||||
(defun polyfit (x y n)
|
||||
(let* ((m (cadr (array-dimensions x)))
|
||||
(A (make-array `(,m ,(+ n 1)) :initial-element 0)))
|
||||
(loop for i from 0 to (- m 1) do
|
||||
(loop for j from 0 to n do
|
||||
(setf (aref A i j)
|
||||
(expt (aref x 0 i) j))))
|
||||
(lsqr A (mtp y))))
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
(let ((x (make-array '(1 11) :initial-contents '((0 1 2 3 4 5 6 7 8 9 10))))
|
||||
(y (make-array '(1 11) :initial-contents '((1 6 17 34 57 86 121 162 209 262 321)))))
|
||||
(polyfit x y 2))
|
||||
|
||||
#2A((0.9999999999999759d0) (2.000000000000005d0) (3.0d0))
|
||||
64
Task/Polynomial-regression/Fortran/polynomial-regression-1.f
Normal file
64
Task/Polynomial-regression/Fortran/polynomial-regression-1.f
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
module fitting
|
||||
contains
|
||||
|
||||
function polyfit(vx, vy, d)
|
||||
implicit none
|
||||
integer, intent(in) :: d
|
||||
integer, parameter :: dp = selected_real_kind(15, 307)
|
||||
real(dp), dimension(d+1) :: polyfit
|
||||
real(dp), dimension(:), intent(in) :: vx, vy
|
||||
|
||||
real(dp), dimension(:,:), allocatable :: X
|
||||
real(dp), dimension(:,:), allocatable :: XT
|
||||
real(dp), dimension(:,:), allocatable :: XTX
|
||||
|
||||
integer :: i, j
|
||||
|
||||
integer :: n, lda, lwork
|
||||
integer :: info
|
||||
integer, dimension(:), allocatable :: ipiv
|
||||
real(dp), dimension(:), allocatable :: work
|
||||
|
||||
n = d+1
|
||||
lda = n
|
||||
lwork = n
|
||||
|
||||
allocate(ipiv(n))
|
||||
allocate(work(lwork))
|
||||
allocate(XT(n, size(vx)))
|
||||
allocate(X(size(vx), n))
|
||||
allocate(XTX(n, n))
|
||||
|
||||
! prepare the matrix
|
||||
do i = 0, d
|
||||
do j = 1, size(vx)
|
||||
X(j, i+1) = vx(j)**i
|
||||
end do
|
||||
end do
|
||||
|
||||
XT = transpose(X)
|
||||
XTX = matmul(XT, X)
|
||||
|
||||
! calls to LAPACK subs DGETRF and DGETRI
|
||||
call DGETRF(n, n, XTX, lda, ipiv, info)
|
||||
if ( info /= 0 ) then
|
||||
print *, "problem"
|
||||
return
|
||||
end if
|
||||
call DGETRI(n, XTX, lda, ipiv, work, lwork, info)
|
||||
if ( info /= 0 ) then
|
||||
print *, "problem"
|
||||
return
|
||||
end if
|
||||
|
||||
polyfit = matmul( matmul(XTX, XT), vy)
|
||||
|
||||
deallocate(ipiv)
|
||||
deallocate(work)
|
||||
deallocate(X)
|
||||
deallocate(XT)
|
||||
deallocate(XTX)
|
||||
|
||||
end function
|
||||
|
||||
end module
|
||||
19
Task/Polynomial-regression/Fortran/polynomial-regression-2.f
Normal file
19
Task/Polynomial-regression/Fortran/polynomial-regression-2.f
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
program PolynomalFitting
|
||||
use fitting
|
||||
implicit none
|
||||
|
||||
! let us test it
|
||||
integer, parameter :: degree = 2
|
||||
integer, parameter :: dp = selected_real_kind(15, 307)
|
||||
integer :: i
|
||||
real(dp), dimension(11) :: x = (/ (i,i=0,10) /)
|
||||
real(dp), dimension(11) :: y = (/ 1, 6, 17, 34, &
|
||||
57, 86, 121, 162, &
|
||||
209, 262, 321 /)
|
||||
real(dp), dimension(degree+1) :: a
|
||||
|
||||
a = polyfit(x, y, degree)
|
||||
|
||||
write (*, '(F9.4)') a
|
||||
|
||||
end program
|
||||
12
Task/Polynomial-regression/GAP/polynomial-regression.gap
Normal file
12
Task/Polynomial-regression/GAP/polynomial-regression.gap
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
PolynomialRegression := function(x, y, n)
|
||||
local a;
|
||||
a := List([0 .. n], i -> List(x, s -> s^i));
|
||||
return TransposedMat((a * TransposedMat(a))^-1 * a * TransposedMat([y]))[1];
|
||||
end;
|
||||
|
||||
x := [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
||||
y := [1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321];
|
||||
|
||||
# Return coefficients in ascending degree order
|
||||
PolynomialRegression(x, y, 2);
|
||||
# [ 1, 2, 3 ]
|
||||
40
Task/Polynomial-regression/Go/polynomial-regression.go
Normal file
40
Task/Polynomial-regression/Go/polynomial-regression.go
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"code.google.com/p/gomatrix/matrix"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
var xGiven = []float64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
|
||||
var yGiven = []float64{1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321}
|
||||
var degree = 2
|
||||
|
||||
func main() {
|
||||
m := len(yGiven)
|
||||
n := degree + 1
|
||||
y := matrix.MakeDenseMatrix(yGiven, m, 1)
|
||||
x := matrix.Zeros(m, n)
|
||||
for i := 0; i < m; i++ {
|
||||
ip := float64(1)
|
||||
for j := 0; j < n; j++ {
|
||||
x.Set(i, j, ip)
|
||||
ip *= xGiven[i]
|
||||
}
|
||||
}
|
||||
|
||||
q, r := x.QR()
|
||||
qty, err := q.Transpose().Times(y)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
c := make([]float64, n)
|
||||
for i := n - 1; i >= 0; i-- {
|
||||
c[i] = qty.Get(i, 0)
|
||||
for j := i + 1; j < n; j++ {
|
||||
c[i] -= c[j] * r.Get(i, j)
|
||||
}
|
||||
c[i] /= r.Get(i, i)
|
||||
}
|
||||
fmt.Println(c)
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
import Data.List
|
||||
import Data.Array
|
||||
import Control.Monad
|
||||
import Control.Arrow
|
||||
import Matrix.LU
|
||||
|
||||
ppoly p x = map (x**) p
|
||||
|
||||
polyfit d ry = elems $ solve mat vec where
|
||||
mat = listArray ((1,1), (d,d)) $ liftM2 concatMap ppoly id [0..fromIntegral $ pred d]
|
||||
vec = listArray (1,d) $ take d ry
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
*Main> polyfit 3 [1,6,17,34,57,86,121,162,209,262,321]
|
||||
[1.0,2.0,3.0]
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
REAL :: n=10, x(n), y(n), m=3, p(m)
|
||||
|
||||
x = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
|
||||
y = (1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321)
|
||||
|
||||
p = 2 ! initial guess for the polynom's coefficients
|
||||
|
||||
SOLVE(NUL=Theory()-y(nr), Unknown=p, DataIdx=nr, Iters=iterations)
|
||||
|
||||
WRITE(ClipBoard, Name) p, iterations
|
||||
|
||||
FUNCTION Theory()
|
||||
! called by the solver of the SOLVE function. All variables are global
|
||||
Theory = p(1)*x(nr)^2 + p(2)*x(nr) + p(3)
|
||||
END
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
SOLVE performs a (nonlinear) least-square fit (Levenberg-Marquardt):
|
||||
p(1)=2.997135145; p(2)=2.011348347; p(3)=0.9906627242; iterations=19;
|
||||
3
Task/Polynomial-regression/J/polynomial-regression-1.j
Normal file
3
Task/Polynomial-regression/J/polynomial-regression-1.j
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
X=:i.# Y=:1 6 17 34 57 86 121 162 209 262 321
|
||||
Y (%. (^/ x:@i.@#)) X
|
||||
1 2 3 0 0 0 0 0 0 0 0
|
||||
2
Task/Polynomial-regression/J/polynomial-regression-2.j
Normal file
2
Task/Polynomial-regression/J/polynomial-regression-2.j
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
Y (%. (i.3) ^/~ ]) X
|
||||
1 2 3
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
||||
>> y = [1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321];
|
||||
>> polyfit(x,y,2)
|
||||
|
||||
ans =
|
||||
|
||||
2.999999999999998 2.000000000000019 0.999999999999956
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
data = Transpose@{Range[0, 10], {1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321}};
|
||||
Fit[data, {1, x, x^2}, x]
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
x = [0:10];
|
||||
y = [1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321];
|
||||
coeffs = polyfit(x, y, 2)
|
||||
|
|
@ -0,0 +1 @@
|
|||
polinterpolate([0,1,2,3,4,5,6,7,8,9,10],[1,6,17,34,57,86,121,162,209,262,321])
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
V=[1,6,17,34,57,86,121,162,209,262,321]~;
|
||||
M=matrix(#V,3,i,j,(i-1)^(j-1));Polrev(matsolve(M~*M,M~*V))
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
>>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||
>>> y = [1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321]
|
||||
>>> coeffs = numpy.polyfit(x,y,deg=2)
|
||||
>>> coeffs
|
||||
array([ 3., 2., 1.])
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
>>> yf = numpy.polyval(numpy.poly1d(coeffs), x)
|
||||
>>> yf
|
||||
array([ 1., 6., 17., 34., 57., 86., 121., 162., 209., 262., 321.])
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
>>> '%.1g' % max(y-yf)
|
||||
'1e-013'
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
>>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||||
>>> y = [2.7, 2.8, 31.4, 38.1, 58.0, 76.2, 100.5, 130.0, 149.3, 180.0]
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
>>> p = numpy.poly1d(numpy.polyfit(x, y, deg=2), variable='N')
|
||||
>>> print p
|
||||
2
|
||||
1.085 N + 10.36 N - 0.6164
|
||||
3
Task/Polynomial-regression/R/polynomial-regression-1.r
Normal file
3
Task/Polynomial-regression/R/polynomial-regression-1.r
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
x <- c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
|
||||
y <- c(1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321)
|
||||
coef(lm(y ~ x + I(x^2)))
|
||||
2
Task/Polynomial-regression/R/polynomial-regression-2.r
Normal file
2
Task/Polynomial-regression/R/polynomial-regression-2.r
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
(Intercept) x I(x^2)
|
||||
1 2 3
|
||||
10
Task/Polynomial-regression/Ruby/polynomial-regression-1.rb
Normal file
10
Task/Polynomial-regression/Ruby/polynomial-regression-1.rb
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
require 'matrix'
|
||||
|
||||
def regress x, y, degree
|
||||
x_data = x.map { |xi| (0..degree).map { |pow| (xi**pow).to_f } }
|
||||
|
||||
mx = Matrix[*x_data]
|
||||
my = Matrix.column_vector(y)
|
||||
|
||||
((mx.t * mx).inv * mx.t * my).transpose.to_a[0]
|
||||
end
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
betas = regress [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
|
||||
[1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321],
|
||||
2
|
||||
|
||||
p betas
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
DelVar x
|
||||
seq(x,x,0,10) → xs
|
||||
{1,6,17,34,57,86,121,162,209,262,321} → ys
|
||||
QuadReg xs,ys
|
||||
Disp regeq(x)
|
||||
49
Task/Polynomial-regression/Tcl/polynomial-regression.tcl
Normal file
49
Task/Polynomial-regression/Tcl/polynomial-regression.tcl
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
package require math::linearalgebra
|
||||
|
||||
proc build.matrix {xvec degree} {
|
||||
set sums [llength $xvec]
|
||||
for {set i 1} {$i <= 2*$degree} {incr i} {
|
||||
set sum 0
|
||||
foreach x $xvec {
|
||||
set sum [expr {$sum + pow($x,$i)}]
|
||||
}
|
||||
lappend sums $sum
|
||||
}
|
||||
|
||||
set order [expr {$degree + 1}]
|
||||
set A [math::linearalgebra::mkMatrix $order $order 0]
|
||||
for {set i 0} {$i <= $degree} {incr i} {
|
||||
set A [math::linearalgebra::setrow A $i [lrange $sums $i $i+$degree]]
|
||||
}
|
||||
return $A
|
||||
}
|
||||
|
||||
proc build.vector {xvec yvec degree} {
|
||||
set sums [list]
|
||||
for {set i 0} {$i <= $degree} {incr i} {
|
||||
set sum 0
|
||||
foreach x $xvec y $yvec {
|
||||
set sum [expr {$sum + $y * pow($x,$i)}]
|
||||
}
|
||||
lappend sums $sum
|
||||
}
|
||||
|
||||
set x [math::linearalgebra::mkVector [expr {$degree + 1}] 0]
|
||||
for {set i 0} {$i <= $degree} {incr i} {
|
||||
set x [math::linearalgebra::setelem x $i [lindex $sums $i]]
|
||||
}
|
||||
return $x
|
||||
}
|
||||
|
||||
# Now, to solve the example from the top of this page
|
||||
set x {0 1 2 3 4 5 6 7 8 9 10}
|
||||
set y {1 6 17 34 57 86 121 162 209 262 321}
|
||||
|
||||
# build the system A.x=b
|
||||
set degree 2
|
||||
set A [build.matrix $x $degree]
|
||||
set b [build.vector $x $y $degree]
|
||||
# solve it
|
||||
set coeffs [math::linearalgebra::solveGauss $A $b]
|
||||
# show results
|
||||
puts $coeffs
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
#import std
|
||||
#import nat
|
||||
#import flo
|
||||
|
||||
(fit "n") ("x","y") = ..dgelsd\"y" (gang \/*pow float*x iota successor "n")* "x"
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
x = <0.,1.,2.,3.,4.,5.,6.,7.,8.,9.,10.>
|
||||
y = <1.,6.,17.,34.,57.,86.,121.,162.,209.,262.,321.>
|
||||
|
||||
#cast %eL
|
||||
|
||||
example = fit2(x,y)
|
||||
Loading…
Add table
Add a link
Reference in a new issue