2012-02-15 35 views
5

Bất kỳ ai có thể trợ giúp với một số mã truy vấn SQL để cung cấp các ước tính về các hệ số cho một lần hồi quy đa thức bậc 3?Cần truy vấn máy chủ SQL để giải quyết hồi quy đa thức bậc 3

Hãy giả định rằng tôi có một bảng của X và Y giá trị dữ liệu và muốn ước tính a, b và c trong:

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

Sẽ rất hữu ích nếu bạn có thể dán công thức để ước tính a, b và c, bởi vì, không phải mọi người ở đây đều tốt với toán học ... –

+0

Nếu đó là thẻ bài tập về nhà. –

+0

Đã thêm thẻ [math] – zgpmax

Trả lời

4

giải pháp ƯỚC nhưng nhanh sẽ được lấy mẫu 4 điểm đại diện từ các dữ liệu và giải phương trình đa thức cho những điểm này.

  1. Đối với lấy mẫu, bạn có thể chia nhỏ dữ liệu vào lĩnh vực bình đẳng và tính toán trung bình của X và Y đối với từng ngành - sự chia rẽ có thể được thực hiện bằng tứ phân vị của X-giá trị, trung bình của X giá trị, min(x)+(max(x)-min(x))/4 hoặc bất cứ điều gì bạn nghĩ là thích hợp nhất.

    Để minh họa cho việc lấy mẫu bởi tứ phân vị (tức là bằng số hàng): illustration of solving 3rd order polynomial by sampling 4 points

  2. Đối với giải quyết, tôi sử dụng numberempire.com để giải quyết những * phương trình cho các biến k,a,b,c:

    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 
    

    * Vì Y(X) = 0 + ax bx^2 + cx^3 + ϵ ngầm bao gồm [0, 0] điểm là một trong các điểm mẫu, nó sẽ tạo ra xấp xỉ xấu cho các tập dữ liệu không bao gồm [0, 0]. Tôi đã tự do giải quyết Y(X) = k + ax bx^2 + cx^3 + ϵ thay thế.

SQL thực tế sẽ đi như thế này:

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 
) 

Theo developer.mimer.com, các tính năng tùy chọn cần phải được cho phép trong SQL Server:

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

SQL Server có một built- trong chức năng xếp hạng NTILE (n) mà sẽ dễ dàng tạo ra các lĩnh vực của bạn. Tôi thay thế:

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

với:

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

tôi cũng cần thêm một số "quyền hạn precomputed" để cho phép trong phạm vi cột đầy đủ như chọn. Danh sách đầy đủ xuất hiện bên dưới:

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] 

Nhìn chung, câu trả lời tuyệt vời của @Aprillion! Cũng giải thích và numberempire.com h/t là rất hữu ích.

Các vấn đề liên quan