コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

最小二乗近似曲線の式を求める (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) )