2011-12-21 87 views
4

私は観察されたデータに基づいて報告するフォームアプリケーションで作業しています。アプリケーションの開発に先立って、Excelスプレッドシートをサイドエクセルソルバーに沿って使用し、非線形最小自乗回帰を行いました。私は大学の外出をしばらくしていましたが、最終的に書いてもらえるかもしれませんが、クライアントが数ヶ月待つことを望んでいます。Excelソルバー:C#で非線形最小二乗法に相当する

私の質問はこれです。 Excelソルバーの非線形最小二乗回帰関数に相当するC#はありますか?私は観測されたデータに基づいてデータといくつかの初期推測を観察したので、入力は問題ではありません。地獄、たとえ使用された方程式の名前が良い出発点になるでしょう。

Iveはalglibを見ましたが、どちらが適切かはわかりません。

ありがとうございます。

+2

私はこの種のものでは動作しませんが、Microsoft Solver Foundationはニーズに対応していますか? http://msdn.microsoft.com/en-us/library/ff524512(v=VS.93).aspx –

+0

可能性があります。病気はそれを見てください。ありがとう。 –

+0

Excelヘルプでは、「Microsoft Office Excelソルバーツールは、テキサス大学オースティン校のレオンラスドンとクリーブランド州立大学のアランワーレンによって開発されたGRG2(Generalized Reduced Gradient)非線形最適化コードを使用しています。これを行うには、.NET Frameworkに何も組み込まれていないと思います。 – AakashM

答えて

1

私は弾丸を噛んで、alglibに行ってしまいました。 lsfitパ​​ッケージは、最終的には私が望んだことをしました。しかし、数学者以外の人が実際に読むことができないので、かなり長い時間がかかりました。

ここでは、同じ問題を抱えている人がこれを見つけることができるように、このままにしておきます。

+1

alglibを使用してサンプルコードを共有できますか?私たちは負でない最小の四角形を行う必要があり、alglibのドキュメントで助けを見つけることができません! – Simon

+0

私はそれを見つけようとすることができます。これはかなり前のことでした。私はそれを理解して以来、私はそれに取り組んだhavent。 –

4

MathDotNetイリジウムライブラリを使用してこれを行うことができます。ここで

C#クラスの例である:

using MathNet.Numerics.LinearAlgebra; 

namespace StackOverflow.Examples 
{ 
public class PolynomialRegression 
{ 
    readonly Vector _xData; 
    readonly Vector _yData; 
    readonly Vector _coef; 
    readonly int _order; 

    public PolynomialRegression(Vector xData, Vector yData, int order) 
    { 
     if (xData.Length != yData.Length) 
     { 
      throw new IndexOutOfRangeException(); 
     } 
     _xData = xData; 
     _yData = yData; 
     _order = order; 
     var n = xData.Length; 
     var a = new Matrix(n, order + 1); 
     for (var i = 0; i < n; i++) 
      a.SetRowVector(VandermondeRow(xData[i]), i); 

     // Least Squares |y=A(x)*c| ... tr(A)*y = tr(A)*A*c ... inv(tr(A)*A)*tr(A)*y = c 
     // http://en.wikipedia.org/wiki/Total_least_squares 
     var at = Matrix.Transpose(a); 
     var y2 = new Matrix(yData, n); 
     _coef = (at * a).Solve(at * y2).GetColumnVector(0); 
    } 

    Vector VandermondeRow(double x) 
    { 
     var row = new double[_order + 1]; 
     for (var i = 0; i <= _order; i++) 
      row[i] = Math.Pow(x, i); 
     return new Vector(row); 
    } 

    public double Fit(double x) 
    { 
     return Vector.ScalarProduct(VandermondeRow(x), _coef); 
    } 

    public int Order { get { return _order; } } 
    public Vector Coefficients { get { return _coef; } } 
    public Vector XData { get { return _xData; } } 
    public Vector YData { get { return _yData; } } 
} 
} 

そして、ここでは使用例です:あなたが持っている

var xVector = new Vector(new double[] { 1, 2, 3, 4, 5 }); 
var yVector = new Vector(new double[] { 10, 20, 30, 40, 50 }); 
var order = 2; 
_poly = new PolynomialRegression(xVector, yVector, order); 
+0

私は彼らのウェブサイト上のドキュメントを見て、彼らは非線形最小二乗法を持っているように見えません。しかし、このリンクを維持すると、後で便利になる可能性があります。 –

3

1つのオプションは、単にあなたのC#のプログラムからExcelを使用することです。このようにして、計算はExcelで実行され、プログラムはExcelで実行できる処理をすべて実行できます。 How to automate Microsoft Excel from Microsoft Visual C#.NET

もう1つの選択肢は、Michaelが指摘しているように、数多くの利用可能な数学ライブラリの1つを使用することです。利用可能なライブラリがたくさんあります。もちろん、答えがExcelと一致することを確認したいでしょう;-)

+0

質問は、Visual StudioからExcelソルバーを呼び出せますか?私はかなりのバージョンでExcelの標準ではないことを確認します。 –

+0

John S:もちろん、Excelソルバー(+ Excel)をユーザーのコンピュータにインストールする必要があります。私は、前提条件が満たされていると仮定しても問題はないはずです。 – JonnyBoats

+0

それは本当ですが、Excelソルバーでは、機能するためには多くのユーザー入力が必要です。病気は休暇中にこのショットを与えるとうまくいけばそれは動作します。 –

関連する問題