2011-11-18 14 views
6

私は二つの独立変数、GSHGlsを持っています。これらの2つの変数を使用して、私は結果を予測しようとしています、prob。データのhow to:ソルバ基礎二次最小二乗

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

サンプル:フォームの機能を使用すると、

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) 

私は、最小二乗和を最小にするために、係数の最高値を見つけるしたいと思います。

私は基礎ソルバーで多くを読んだことがありますが、私はこの問題をC#Solver Foundationでどのように設定するかを考え出すことができませんでした。すべてのコード提案は非常に高く評価されています。

ありがとうございました

+0

f(gls、gsh)〜= probがあり、モデル関数のパラメータを最適化したいのですか? – Efrain

+0

巨大な理論紙でこれを処理すると、差別化を使って正確な結果を得ることができます。このペーパーを関数 – Dani

答えて

2

私はそれのためのソルバーの基礎は必要ないと思います。解(データセットの観測された応答と予測された応答の間の垂直距離の平方和を最小にする多項式係数のベクトル)が閉じた形式で存在するため、数値最適化は必要ありません。

詳細はwikipediaを参照してください。

+1

に変換してみてください。これはこの問題を解決するのに最適です(私は今これを使っていますので、大変ありがとうございます)。しかし、ソルバー基盤の使い方も学びたいと思っていました。 – user1054524

0

ソルバーファンデーションを使用できます。あなたの回帰はすでに非線形であり、実際にはgeneralized linear regressionです。 Rでは、回帰を行うにはglmのようなパッケージを使用できます。

C#では、オープンソースコードが存在するかどうかはわかりません。しかし、とにかく、自分で最適化を解くことができ、MSFには非線形ソルバがあります!だから、ちょうど2つの機能を記述します。

  1. 目的関数と簡単な例として

  2. その勾配

を、あなたは私の記事を見ることができます:

Logistic Regression in F# using Microsoft Solver Foundation

しかしロジスティック回帰について知る必要はありませんが、この記事では、2変数Rosenbrock関数を最適化する方法を示すより簡単な例も示します。

MSFには、暗黙の変換言語機能を使用してC#用の埋め込みドメイン固有言語もあります。 [MSFの文書でその例を見つけることができます。]

1

次の解決法は、あなたが記述するアルゴリズムを使用してローカル最小値を見つけることを試みることは非常に単純です。それを使用して、私は、次の値

= 0.02527237、B = 0.04768372、C = -0.001549721、D = 0.01382828、E = 0.2139592の総正方形と0.002026558

得ます。

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

良い答え! var p = a * Math.Pow(gls [i]、2)+ b * Math.Pow(gsh [i]、2)+ c * gls [i] + d * gsh [i] + e; – Hannish

関連する問題