{{{id=19|
%auto
# reset() # commented out for now -- ticket 7255
forget()
# special equation rendering
def render(x,name = "temp.png",size = "normal"):
if(type(x) != type("")): x = latex(x)
latex.eval("\\" + size + " $" + x + "$",{},"",name)
var('a b c d e f g h j k l x y z')
class Pair:
def __init__(self,d):
self.x = d[0]
self.y = d[1]
def __repr__(self):
return "%e,%e" % (self.x,self.y)
def show_mat(data):
yt = len(data)
xt = len(data[0])
for y in range(yt):
for x in range(xt):
sys.stdout.write("%12g " % data[y][x])
print("")
print("****")
def show_mat_latex(data,fn):
yt = len(data)
xt = len(data[0])
ya = []
for y in range(yt):
xa = []
for x in range(xt):
xa.append("%12g " % data[y][x])
ya.append(join(xa," & "))
ys = join(ya,"\\\\")
# specify right justification
cstr = "r" * xt
mat = "$\\left( \\begin{array}{%s}" % cstr
mat += ys
mat += "\\end{array}\\right)$"
render(mat,fn)
print ""
# example data
data1 = [
[-1,-1],
[0,3],
[1,2.5],
[2,5],
[3,4],
[5,2],
[7,5],
[9,4]
]
def set_data(x):
return [Pair(n) for n in x]
# polynomial regression of order "p"
def polyregress(data,p,debug = False):
# matrix rows and columns = p+1
p += 1
n = len(data)
# precalculate matrix cell data array
mda = [n] + [sum(data[a].x^b for a in range(n)) for b in range(1,2*p-1)]
# create/populate square matrix with appended column
m = [[mda[r+c] for c in range(p)] + [0.0] for r in range(p)]
if debug: show_mat_latex(m,"nmat2.png")
# populate RH appended column
for v in data: m[0][p] += v.y
for r in range(1,p):
m[r][p] = sum(v.x^r*v.y for v in data)
if debug: show_mat_latex(m,"nmat3.png")
# reduce matrix
mm=Matrix(RR,m)
mm.echelonize()
if debug: show_mat_latex(mm.rows(),"nmat4.png")
# extract result column
a = mm.column(p).list()
# build term list
y = 0
for j in range(p):
y += a[j]*x^j
return y
# correlation coefficient (r^2)
def corr_coeff(data,fy):
r = 0
sx = sx2 = sy = sy2 = sxy = 0
n = len(data)
for v in data:
x = fy(x=v.x)
y = v.y
sx += x
sy += y
sxy += x * y
sx2 += x * x
sy2 += y * y
divisor = sqrt((sx2 - (sx*sx)/n) * (sy2 - (sy*sy)/n))
if(divisor != 0):
r = ((sxy-(sx*sy)/n)/divisor)^2
return r
# standard error
def std_error(data,fy):
r = 0
n = len(data);
if(n > 2):
a = 0
for v in data:
a += (fy(x=v.x) - v.y)^2
r = sqrt(a/(n-2))
return r
# data range
def list_minmax(data):
max = -1e6
min = 1e6
for v in data:
if(max < v.x): max = v.x
if(min > v.x): min = v.x
return(min,max)
///
}}}
{{{id=81|
# interactive version
data = set_data(data1)
mp = len(data)-1
@interact
def _(p = (0..mp)):
y = polyregress(data,p)
dp = list_plot([[data[n].x,data[n].y] for n in range(len(data))],rgbcolor='red')
lp = plot(y,x,list_minmax(data))
cc = corr_coeff(data,y)
se = std_error(data,y)
lbl = text("correlation coefficient (r^2): %f\nStandard error: %f"
% (cc,se),(5,-2),rgbcolor='black',fontsize=10)
show(dp+lp+lbl,ymin=-5,ymax=7)
///
}}}
{{{id=109|
# static version
data = set_data(data1)
p = 4
y = polyregress(data,p)
dp = list_plot([[data[n].x,data[n].y] for n in range(len(data))],rgbcolor='red')
lp = plot(y,x,list_minmax(data))
cc = corr_coeff(data,y)
se = std_error(data,y)
lbl = text("correlation coefficient (r^2): %f\nStandard error: %f"
% (cc,se),(5,-2),rgbcolor='black',fontsize=10)
show(dp+lp+lbl,ymin=-5,ymax=7,figsize=(5,4))
///
}}}
{{{id=96|
# generate result matrices
var('y')
data = set_data(data1)
q = polyregress(data,4,True)
#print corr_coeff(data,y)
#print std_error(data,y)
render(y == q,"poly_result1.png")
///
}}}
{{{id=95|
# generate matrix diagram
def add_to_mat(a,b):
return a + "\\left( \\begin{array}{%s} " % cspec + join(b,"\\\\") + "\\end{array} \\right)"
p = 4
ya = []
ltx = ""
cspec = "l" * (p+1)
for y in range(p+1):
xa = []
for x in range(p+1):
if(y == 0 and x == 0):
xa.append("n")
else:
ss = "^{" + str(x+y) + "}"
if(x+y < 2): ss = ""
xa.append("\\sum{x_i}%s" % ss)
ya.append(join(xa," & "))
ltx = add_to_mat(ltx,ya)
xa = []
for y in range(p+1):
xa.append("a_%d" % y)
ltx = add_to_mat(ltx,xa)
xa = []
xa.append("\\sum{y_i}")
for y in range(1,p+1):
ss = "^{" + str(y) + "}"
if(y < 2): ss = ""
xa.append("\\sum{x_i}%s {y_i}" % ss)
ltx = add_to_mat(ltx + " = ",xa)
# show(html("$" + ltx + "$"))
render(ltx,"equ_mat.png")
///
}}}
{{{id=98|
render("$(x_1,y_1),(x_2,y_2),(x_3,y_3), ... ,(x_n,y_n)$","dataset.png","large")
///
}}}
{{{id=99|
render("$y = a_0 + a_1 x + a_2 x^2 + a_3 x^3 ... a_p x^p, p < n$","polyequ.png","large")
///
}}}
{{{id=100|
render("$R_i = y_i - a_0 - a_1 x_i - a_2{x_i}^2 ... -a_p {x_i}^p$","residual.png","large")
///
}}}
{{{id=101|
xvals = [-1,0,1,2,3,5,7,9]
for p in range(9):
print "%d: %8d" % (p,sum(xvals[n]^p for n in range(len(xvals))))
///
0: 8
1: 26
2: 170
3: 1232
4: 9686
5: 79256
6: 665510
7: 5686952
8: 49208966
}}}
{{{id=102|
render("$\\sum{x_i}^{2}$","equ_sumsq1.png")
///
}}}
{{{id=103|
render("$\\sum_{i = 0}^{n-1}{x_i}^{2}$","equ_sumsq2.png")
///
}}}
{{{id=110|
render("$\\sum_{i = 0}^{n-1}{x_i}^{(r+c)}$","equ_sumsq3.png")
///
}}}
{{{id=107|
# test assumption about RH column
data = set_data(data1)
s = 0
p = 4
for a in range(p+1):
s = 0
for n in range(len(data)):
s += data[n].x^a * data[n].y
show(s)
///
24.5000000000000
106.500000000000
676.500000000000
5032.50000000000
39904.5000000000
}}}
{{{id=108|
///
}}}