Matlab では、数値最適化を行います。つまり、目的関数の解析形式について心配する必要はありません。x
代わりに、最適化パラメーターを使用して、データのすべての値に対してy
、入力データと比較できる値を作成する目的関数を作成する必要があります。
線形制約と非線形制約を使用すると、FMINCONを使用して問題を解決できます。
何を最適化したいのか完全にはわかりませんが (申し訳ありませんが、少し早いです)、例として、x 値xdata
を持つベクトルと y値ydata
を持つベクトルがあると仮定します。 「階段関数」に合わせたいもの。ステップの数はわかっていますが、それらがどこに配置されているかはわかりません。また、ステップ位置の合計が 5 でなければならないこともわかっています (線形等式制約)。
目的関数を記述することから始めます。その出力はできるだけ 0 に近づけたいと考えています。これは、残差の二乗和 (つまり、実際の y 値と推定された y 値の差) である可能性があります。便宜上、線形方程式を使用してステップの位置を定義するのではなく、代わりに直接設定します。
function out = objFun(loc,xdata,ydata)
%#OBJFUN calculates the squared sum of residuals for a stair-step approximation to ydata
%# The stair-step locations are defined in the vector loc
%# create the stairs. Make sure xdata is n-by-1, and loc is 1-by-k
%# bsxfun creates an n-by-k array with 1's in column k wherever x>loc(k)
%# sum sums up the rows
yhat = sum(bsxfun(@gt,xdata(:),loc(:)'),2); %'# SO formatting
%# sum of squares of the residuals
out = sum((ydata(:)-yhat).^2);
この関数をobjFun.m
Matlab パスに保存します。次に、定義xdata
して(またはファイルから読み込み)、 (k 行 1 列の配列)ydata
の初期推定を行い、( 3 つのステップがある場合は です) のような線形等式制約の配列を作成し、次のように記述します。loc
Aeq
Aeq*loc==beq
Aeq
[1 1 1]
locEst = fmincon(@(u)objFun(u,xdata,ydata),locInitialGuess,[],[],Aeq,5);
これにより、ステップの位置が推定されます。2 つの空の括弧の代わりに、不等式制約を追加できます。5 は、等式制約が 5 に評価されると仮定したためです。