最小二乗近似曲線の式を求める (2)
昨日書いた「最小二乗近似曲線の式を求める」で最後の結果表示が間違っていました。その修正とついでに、決定係数と相関係数も計算するようにしたので、書いておきます。
プログラムはここからダウンロードしてください。(LeastSquare)
決定係数を計算する
細かな解説は割愛します。すいません。元データと近似式の分散と、共分散の二乗との割合を計算している感じです。
------------------------------------------ -- 決定係数R^2の計算 ------------------------------------------ function rculc( x, k ) local ave = 0 local i,j local n = #Value.X local bo = 0 local si = 0 local kb = 0 local f,px local r,sk for i=1,n do ave = ave + Value.Y[i] end ave = ave / n for i=1,n do f = 0 px = 1 for j=0,k do f = f + x[j+1]*px px = px*Value.X[i] end bo = bo + (Value.Y[i]-ave)*(Value.Y[i]-ave) si = si + (f-ave)*(f-ave) kb = kb + (Value.Y[i]-ave)*(f-ave) end --決定係数R^2=(Grkb*Grkb)/(Grbo*Grsi) r = kb*kb/si/bo --相関係数R=Grkb/{√(Grbo)*√(Grsi)} sk = kb/(math.sqrt(bo)*math.sqrt(si)) return r, sk end
結果表示
x, r, sk = kinji( k ) printscrl( " ", 20, color(0,0,0), color(255,255,255) ) printscrl( " "..k.." 次曲線近似式", 20, color(0,0,0), color(255,255,255) ) printscrl( "Y=Σ(Ai*X^i) (i=0〜"..k..")", 20, color(0,0,0), color(255,255,255) ) for i=0,k do printscrl( "A"..i.."="..x[i+1], 20, color(0,0,0), color(255,255,255) ) end printscrl( "R^2= "..r, 20, color(0,0,0), color(255,255,255) ) printscrl( "R= "..sk, 20, color(0,0,0), color(255,255,255) )