2011-11-18 36 views
6

Tôi có hai biến độc lập, GSHGls. Sử dụng hai biến này, tôi đang cố gắng dự đoán kết quả, prob. Sử dụng một hàm có dạng:cách: nền tảng solver bậc hai hình vuông nhỏ nhất

prob=a*Gls^2+b*GSH^2+c*Gls+d*GSH+e // (where a,b,c,d,e are coefficients) 

mẫu dữ liệu:

Gls(2.3 2.3 2.5 2.5 2.5 2.5 2.7 2.7 2.7 2.7 2.7 2.9 2.9 2.9 2.9 2.9 3.1 3.1 3.1 3.1 3.1 3.1 3.3 3.3 3.3 3.3 3.3 3.3 3.5 3.5 3.5 3.5 3.5) 

GSH(0.475 0.525 0.425 0.475 0.525 0.575 0.425 0.475 0.525 0.575 0.625 0.425 0.475 0.525 0.575 0.625 0.375 0.425 0.475 0.525 0.575 0.625 0.375 0.425 0.475 0.525 0.575 0.625 0.425 0.475 0.525 0.575 0.625) 

prob(0.263636 0.324159 0.319328 0.291295 0.286086 0.253994 0.233766 0.284644 0.273818 0.263743 0.175182 0.243986 0.284848 0.28066 0.247863 0.183468 0.181818 0.237288 0.269266 0.2555 0.240924 0.206081 0.209677 0.216949 0.263261 0.25966 0.23588 0.203252 0.239316 0.209184 0.234818 0.242424 0.192118) 

Tôi muốn tìm các giá trị tốt nhất của các hệ số để giảm thiểu tổng của bình phương nhỏ nhất.

Tôi đã đọc rất nhiều về bộ giải của nền tảng nhưng tôi không thể tìm ra cách thiết lập vấn đề này trong Quỹ giải quyết C#. Tất cả các đề xuất mã đều được đánh giá cao.

Cảm ơn

+0

để tôi nhận được quyền này: bạn có f (gls, gsh) ~ = prob và bạn muốn tối ưu hóa các tham số của chức năng mô hình? – Efrain

+0

Làm việc này trên một giấy lý thuyết rất lớn có thể cho kết quả chính xác bằng cách sử dụng sự khác biệt.Hãy thử chuyển đổi bài báo đó thành một hàm – Dani

Trả lời

2

Tôi đoán bạn không cần nền tảng giải quyết cho điều đó. Không cần tối ưu hóa số, vì giải pháp (vectơ của các hệ số đa thức giảm thiểu tổng bình phương khoảng cách thẳng đứng giữa các đáp ứng quan sát được trong tập dữ liệu và các đáp ứng dự đoán) tồn tại dưới dạng khép kín.

Xem wikipedia để biết chi tiết.

+1

hi điều này là rất tốt để giải quyết vấn đề này (mà bây giờ tôi đã thực hiện bằng cách này, vì vậy cảm ơn rất nhiều), tuy nhiên tôi cũng hy vọng tìm hiểu cách sử dụng nền tảng giải quyết. – user1054524

0

Bạn có thể sử dụng nền tảng bộ giải. Hồi quy của bạn đã không tuyến tính và thực sự là một generalized linear regression. Trong R, bạn có thể sử dụng gói như glm để thực hiện hồi quy.

Trong C#, tôi không chắc liệu có bất kỳ mã nguồn mở nào tồn tại hay không. Nhưng dù sao, bạn có thể tự mình giải quyết tối ưu hóa, và MSF có một trình giải mã phi tuyến trong đó! Vì vậy, chỉ cần viết hai chức năng:

  1. hàm mục tiêu và

  2. dốc

của nó Như một ví dụ nhanh, bạn có thể xem bài viết của tôi:

Logistic Regression in F# using Microsoft Solver Foundation

Nhưng bạn không cần biết về hồi quy logistic, trong bài viết, tôi cũng bao gồm một ví dụ đơn giản hơn về cách tối ưu hóa hàm Rosenbrock 2 biến.

MSF cũng có ngôn ngữ cụ thể của miền được nhúng cho C# bằng tính năng ngôn ngữ chuyển đổi ẩn của nó. [Bạn có thể tìm thấy ví dụ trong tài liệu của MSF.]

1

Giải pháp sau đây rất thẳng về phía trước, chỉ cố gắng tìm mức tối thiểu địa phương bằng thuật toán bạn mô tả. Sử dụng nó tôi nhận được các giá trị sau

a = 0,02527237, b = 0,04768372, c = -,001549721, d = 0,01382828, e = 0,002026558

với tổng bình phương của 0,2139592.

static void Main(string[] args) 
    { 
     var a = FindLocalMinimum(x => SumSq(x, 0, 0, 0, 0)); 
     var b = FindLocalMinimum(x => SumSq(a, x, 0, 0, 0)); 
     var c = FindLocalMinimum(x => SumSq(a, b, x, 0, 0)); 
     var d = FindLocalMinimum(x => SumSq(a, b, c, x, 0)); 
     var e = FindLocalMinimum(x => SumSq(a, b, c, d, x)); 
    } 

    private static float SumSq(float a, float b, float c, float d, float e) 
    { 
     var gls = new[] 
         { 
          2.3, 2.3, 2.5, 2.5, 2.5, 2.5, 2.7, 2.7, 2.7, 2.7, 2.7, 2.9, 2.9, 2.9, 2.9, 2.9, 3.1, 3.1, 3.1 
          , 3.1, 3.1, 3.1, 3.3, 3.3, 3.3, 3.3, 3.3, 3.3, 3.5, 3.5, 3.5, 3.5, 3.5 
         }; 

     var gsh = new[] 
         { 
          0.475, 0.525, 0.425, 0.475, 0.525, 0.575, 0.425, 0.475, 0.525, 0.575, 0.625, 0.425, 0.475, 
          0.525, 0.575, 0.625, 0.375, 0.425, 0.475, 0.525, 0.575, 0.625, 0.375, 0.425, 0.475, 0.525, 
          0.575, 0.625, 0.425, 0.475, 0.525, 0.575, 0.625 
         }; 

     var prob = new[] 
         { 
          0.263636, 0.324159, 0.319328, 0.291295, 0.286086, 0.253994, 0.233766, 0.284644, 0.273818, 
          0.263743, 0.175182, 0.243986, 0.284848, 0.28066, 0.247863, 0.183468, 0.181818, 0.237288, 
          0.269266, 0.2555, 0.240924, 0.206081, 0.209677, 0.216949, 0.263261, 0.25966, 0.23588, 
          0.203252, 0.239316, 0.209184, 0.234818, 0.242424, 0.192118 
         }; 

     var res = 0.0; 
     for (var i = 0; i < prob.Length; i++) 
     { 
      var p = a*Math.Pow(gls[i], 2) + a*Math.Pow(gsh[i], 2) + c*gls[i] + d*gsh[i] + e; 
      res += Math.Pow(p - prob[i], 2); 
     } 
     return (float)res; 
    } 

    private static float FindLocalMinimum(Func<float, float> f) 
    { 
     float bestV = float.MaxValue; 
     float bestX = 0; 
     float x = 0; 
     float lastV = bestV; 
     float diff = 1000.0f; 
     while (Math.Abs(diff) > 0.0001f) 
     { 
      float v = f(x); 
      if (v < bestV) 
      { 
       bestV = v; 
       bestX = x; 
      } 
      else if (v > lastV) 
      { 
       diff *= -0.5f; 
      } 
      lastV = v; 
      x += diff; 
     } 
     return bestX; 
    } 
+0

Câu trả lời hay! Tôi tìm thấy một lỗi đánh máy nhỏ (ở đây đã sửa): var p = a * Math.Pow (gls [i], 2) + b * Math.Pow (gsh [i], 2) + c * gls [i] + d * gsh [i] + e; – Hannish

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