2012-02-15 4 views
5

3次多項式回帰の係数を推定するためにSQLクエリコードを助けることができる人はいますか?データから4つの代表点をサンプリングすることであろう3次多項式回帰を解くためにSQL Serverクエリが必要

Y(X) = aX + bX^2 + cX^3 + E 
+3

a、b、cの見積もり用の数式を貼り付けることができれば、ここ数多くの人が数学でうまくいくわけではないので、参考になると助かります。 –

+0

宿題の場合はそれです。 –

+0

タグを追加[math] – zgpmax

答えて

4

APPROXIMATEが、高速なソリューションと:

私はXとYのデータ値のテーブルを持っており、中に、a、b及びcを推定することを前提としていてくださいこれらの点の多項式を解く。 サンプリングとして

  1. は、同じセクタにデータを分割し、各セクタのためのXとYの平均値を計算することができる - 分割は、X値の四分位、X-の平均値を使用して行うことができます値、min(x)+(max(x)-min(x))/4またはあなたが何と考えているかは、最も適切なです。 (行番号によってIE)四分位数によるサンプリングを説明するため

    :を解決としてillustration of solving 3rd order polynomial by sampling 4 points

  2. は、iが変数k,a,b,cためにこれら*方程式を解くためにnumberempire.comを使用:

    k + a*X1 + b*X1^2 + c*X1^3 - Y1 = 0, 
    k + a*X2 + b*X2^2 + c*X2^3 - Y2 = 0, 
    k + a*X3 + b*X3^2 + c*X3^3 - Y3 = 0, 
    k + a*X4 + b*X4^2 + c*X4^3 - Y4 = 0 
    

    * Y(X) = 0 + ax bx^2 + cx^3 + ϵは暗黙的に[0、0]ポイントをサンプルポイントの1つとして含んでいるため、[0、0]を含まないデータセットの不正な近似値を生成します。私は代わりにY(X) = k + ax bx^2 + cx^3 + ϵの解決の自由を取った。

実際のSQLは次のように行くだろう:

select 
    -- returns 1 row with columns labeled K, A, B and C = coefficients in 3rd order polynomial equation for the 4 sample points 
    -(X1*(X2p2*(X3p3*Y4-X4p3*Y3)+X2p3*(X4p2*Y3-X3p2*Y4)+(X3p2*X4p3-X3p3*X4p2)*Y2)+X1p2*(X2*(X4p3*Y3-X3p3*Y4)+X2p3*(X3*Y4-X4*Y3)+(X3p3*X4-X3*X4p3)*Y2)+X1p3*(X2*(X3p2*Y4-X4p2*Y3)+X2p2*(X4*Y3-X3*Y4)+(X3*X4p2-X3p2*X4)*Y2)+(X2*(X3p3*X4p2-X3p2*X4p3)+X2p2*(X3*X4p3-X3p3*X4)+X2p3*(X3p2*X4-X3*X4p2))*Y1)/(X1*(X2p2*(X4p3-X3p3)-X3p2*X4p3+X3p3*X4p2+X2p3*(X3p2-X4p2))+X2*(X3p2*X4p3-X3p3*X4p2)+X1p2*(X3*X4p3+X2*(X3p3-X4p3)+X2p3*(X4-X3)-X3p3*X4)+X2p2*(X3p3*X4-X3*X4p3)+X1p3*(X2*(X4p2-X3p2)-X3*X4p2+X3p2*X4+X2p2*(X3-X4))+X2p3*(X3*X4p2-X3p2*X4)) as k, 
    (X1p2*(X2p3*(Y4-Y3)-X3p3*Y4+X4p3*Y3+(X3p3-X4p3)*Y2)+X2p2*(X3p3*Y4-X4p3*Y3)+X1p3*(X3p2*Y4+X2p2*(Y3-Y4)-X4p2*Y3+(X4p2-X3p2)*Y2)+X2p3*(X4p2*Y3-X3p2*Y4)+(X3p2*X4p3-X3p3*X4p2)*Y2+(X2p2*(X4p3-X3p3)-X3p2*X4p3+X3p3*X4p2+X2p3*(X3p2-X4p2))*Y1)/(X1*(X2p2*(X4p3-X3p3)-X3p2*X4p3+X3p3*X4p2+X2p3*(X3p2-X4p2))+X2*(X3p2*X4p3-X3p3*X4p2)+X1p2*(X3*X4p3+X2*(X3p3-X4p3)+X2p3*(X4-X3)-X3p3*X4)+X2p2*(X3p3*X4-X3*X4p3)+X1p3*(X2*(X4p2-X3p2)-X3*X4p2+X3p2*X4+X2p2*(X3-X4))+X2p3*(X3*X4p2-X3p2*X4)) as a, 
    -(X1*(X2p3*(Y4-Y3)-X3p3*Y4+X4p3*Y3+(X3p3-X4p3)*Y2)+X2*(X3p3*Y4-X4p3*Y3)+X1p3*(X3*Y4+X2*(Y3-Y4)-X4*Y3+(X4-X3)*Y2)+X2p3*(X4*Y3-X3*Y4)+(X3*X4p3-X3p3*X4)*Y2+(X2*(X4p3-X3p3)-X3*X4p3+X3p3*X4+X2p3*(X3-X4))*Y1)/(X1*(X2p2*(X4p3-X3p3)-X3p2*X4p3+X3p3*X4p2+X2p3*(X3p2-X4p2))+X2*(X3p2*X4p3-X3p3*X4p2)+X1p2*(X3*X4p3+X2*(X3p3-X4p3)+X2p3*(X4-X3)-X3p3*X4)+X2p2*(X3p3*X4-X3*X4p3)+X1p3*(X2*(X4p2-X3p2)-X3*X4p2+X3p2*X4+X2p2*(X3-X4))+X2p3*(X3*X4p2-X3p2*X4)) as b, 
    (X1*(X2p2*(Y4-Y3)-X3p2*Y4+X4p2*Y3+(X3p2-X4p2)*Y2)+X2*(X3p2*Y4-X4p2*Y3)+X1p2*(X3*Y4+X2*(Y3-Y4)-X4*Y3+(X4-X3)*Y2)+X2p2*(X4*Y3-X3*Y4)+(X3*X4p2-X3p2*X4)*Y2+(X2*(X4p2-X3p2)-X3*X4p2+X3p2*X4+X2p2*(X3-X4))*Y1)/(X1*(X2p2*(X4p3-X3p3)-X3p2*X4p3+X3p3*X4p2+X2p3*(X3p2-X4p2))+X2*(X3p2*X4p3-X3p3*X4p2)+X1p2*(X3*X4p3+X2*(X3p3-X4p3)+X2p3*(X4-X3)-X3p3*X4)+X2p2*(X3p3*X4-X3*X4p3)+X1p3*(X2*(X4p2-X3p2)-X3*X4p2+X3p2*X4+X2p2*(X3-X4))+X2p3*(X3*X4p2-X3p2*X4)) as c 
    from (select 
     samples.*, 
     -- precomputing the powers should give better performance (at least i hope it would) 
     power(X1,2) X1p2, power(X2,2) X2p2, power(X3,2) X3p2, power(X4,2) X4p2, 
     power(Y1,3) Y1p3, power(Y2,3) Y2p3, power(Y3,3) Y3p3, power(Y4,3) Y4p3 
    from (select 
     avg(case when sector = 1 then x end) X1, 
     avg(case when sector = 2 then x end) X2, 
     avg(case when sector = 3 then x end) X3, 
     avg(case when sector = 4 then x end) X4, 
     avg(case when sector = 1 then y end) Y1, 
     avg(case when sector = 2 then y end) Y2, 
     avg(case when sector = 3 then y end) Y3, 
     avg(case when sector = 4 then y end) Y4 
     from (select x, y, 
      -- splitting to sectors 1 - 4 by row number (SQL Server version) 
      ceiling(row_number() OVER (ORDER BY x asc)/count(*) * 4) sector 
     from original_data 
    ) 
    ) samples 
) 

developer.mimer.comによると、これらのオプション機能は、SQL Serverで有効にする必要があります

T611, "Elementary OLAP operations" 
F591, "Derived tables" 
2

SQL Serverは、内蔵していますランク付け関数NTILE(n)では、より簡単にセクターを作成できます。私が交換さ:

NTILE(4) OVER(ORDER BY x ASC) [sector] 

私も選択としてフル列範囲を可能にするために、いくつかの「事前に計算力」を追加する必要が:

ceiling(row_number() OVER (ORDER BY x asc)/count(*) * 4) sector 

で。完全なリストは以下に表示されます:

POWER(samples.X1, 2) AS [X1p2], 
POWER(samples.X1, 3) AS [X1p3], 
POWER(samples.X2, 2) AS [X2p2], 
POWER(samples.X2, 3) AS [X2p3], 
POWER(samples.X3, 2) AS [X3p2], 
POWER(samples.X3, 3) AS [X3p3], 
POWER(samples.X4, 2) AS [X4p2], 
POWER(samples.X4, 3) AS [X4p3], 
POWER(samples.Y1, 3) AS [Y1p3], 
POWER(samples.Y2, 3) AS [Y2p3], 
POWER(samples.Y3, 3) AS [Y3p3], 
POWER(samples.Y4, 3) AS [Y4p3] 

全体的には、素晴らしい答え@Aprillion!よく説明され、numberempire.comのh/tは非常に役に立ちました。

関連する問題