0

1-e^xのモーターのステップ応答をモデル化するための係数を見つけることを試みています。私がモデルに使用している方程式は[Octave] fminuncを使用しても常に一貫した解が得られるとは限りません

a(1)*t^2 + a(2)*t^3 + a(3)*t^3 + ... 

は時々大丈夫うまくいくの係数を見つけるために、fminuncを使用して(これは、モータパラメータを解くために使用される研究論文で導出された)形のものであり、私は良い結果を得て、トレーニングデータをかなりうまく一致させます。他の時には、返された係数は恐ろしい(出力がすべきものよりも非常に高く、桁違いに小さい)。これは特に、高次の用語を使用し始めたときに発生します。x^8以上(x^9x^10x^11など)を使用するモデルを使用すると、常に不正な結果が生成されます。

時々動作するので、私の実装が間違っているとは思えません。私は、グラデーションを提供しながら、fminuncを試しましたが、グラデーションも提供していませんが、違いはありません。私はpolyfitのような係数を解くために他の関数を使ってみましたが、その例では1から最高位の項にまで引き上げられた項を持っていなければなりませんが、私が使っているモデルの電力は2

clear; 

%Overall Constants 
max_power = 7; 

%Loads in data 
%data = load('TestData.txt'); 
load testdata.mat 

%Sets data into variables 
indep_x = data(:,1); Y = data(:,2); 

%number of data points 
m = length(Y); 

%X is a matrix with the independant variable 
exps = [2:max_power]; 
X_prime = repmat(indep_x, 1, max_power-1); %Repeats columns of the indep var 
X = bsxfun(@power, X_prime, exps); 

%Initializes theta to rand vals 
init_theta = rand(max_power-1,1); 

%Sets up options for fminunc 
options = optimset('MaxIter', 400, 'Algorithm', 'quasi-newton'); 

%fminunc minimizes the output of the cost function by changing the theta paramaeters 
[theta, cost] = fminunc(@(t)(costFunction(t, X, Y)), init_theta, options) 

% 
Y_line = X * theta; 

figure; 
hold on; plot(indep_x, Y, 'or'); 
hold on; plot(indep_x, Y_line, 'bx'); 

そしてここcostFunction次のとおりです:

function [J, Grad] = costFunction (theta, X, Y) 
    %# of training examples 

    m = length(Y); 

    %Initialize Cost and Grad-Vector 
    J = 0; 
    Grad = zeros(size(theta)); 

    %Poduces an output based off the current values of theta 
    model_output = X * theta; 

    %Computes the squared error for each example then adds them to get the total error 
    squared_error = (model_output - Y).^2; 
    J = (1/(2*m)) * sum(squared_error); 

    %Computes the gradients for each theta t 
    for t = 1:size(theta, 1) 
     Grad(t) = (1/m) * sum((model_output-Y) .* X(:, t)); 
    end 

endfunction 

Sudden Bad Result "Good" Result

すべてのヘルプやアドバイスをいただければ幸いです

は、ここでの主なコードです。あなたの費用関数に正則を追加

+0

t^nを高次や高次の力に使うのは、関数のグローバルな基準ではありませんので、より高次の多項式を使用しようとすると、メソッドが分解されることが予想されます。 – stephematician

+0

多項式を使用したい場合は、おおよその応答に別の基準を使用しますが、チェビシェフ多項式を使うと良いスタートになります。 – stephematician

+0

高次の多項式は扱いが非常に難しい。私は 'x^4'を見ると、すでに神経質になっています。はるかに限定的なモデルから始めて、可能であれば、良い出発点を使用して、見積もりたいパラメータに適切な範囲を適用します(これの境界を処理するソルバーが必要です)。 –

答えて

1

試してみてください。

function [J, Grad] = costFunction (theta, X, Y, lambda) 
    m = length(Y); 

    %Initialize Cost and Grad-Vector 
    J = 0; 
    Grad = zeros(size(theta)); 

    %Poduces an output based off the current values of theta 
    model_output = X * theta; 

    %Computes the squared error for each example then adds them to get the total error 
    squared_error = (model_output - Y).^2; 
    J = (1/(2*m)) * sum(squared_error); 
    % Regularization 
    J = J + lambda*sum(theta(2:end).^2)/(2*m); 


    %Computes the gradients for each theta t 
    regularizator = lambda*theta/m; 
    % overwrite 1st element i.e the one corresponding to theta zero 
    regularizator(1) = 0; 
    for t = 1:size(theta, 1) 
     Grad(t) = (1/m) * sum((model_output-Y) .* X(:, t)) + regularizator(t); 
    end 

endfunction 

正則化項lambdaは学習率を制御するために使用されます。ラムダ= 1で始める。ラムダの値を大きくするほど、学習が遅くなります。あなたが描く行動が持続するならば、ラムダを増やしてください。ラムダが高くなった場合は、反復回数を増やす必要があります。 また、データの正規化と、thetaを初期化するためのヒューリスティック - すべてのthetaを0.1に設定することは、ランダムより優れている可能性があります。それ以外の場合は、トレーニングからトレーニングまでの再現性が向上します。

+0

正則化を加えることは確かに助けになりました。しかし、依然としてそれはまだ失敗します。私はexitflagをオンにして出力しました。結果を得るたびに、終了コード1(勾配の大きさは許容値より小さい)を持ち、2/3回の反復しか実行しません。私はそれが何かを示すかもしれないと思う。 – user3047023

+0

正規の標本化と高次多項式はあまりうまく動かない - 正則化が助けになるが、数値的に悪条件のシステムを避けるのは難しい。補間は、あなたが試みているものとは異なる問題かもしれません。問題の一部を示しています:https://en.wikipedia.org/wiki/Lagrange_polynomial。別のサンプリング手順を使用することをお勧めします(つまり、関数に一致させる場所をもっと慎重にする)、別の基本関数を使用することをおすすめします。 – stephematician

関連する問題