54

パラメーター化されたモデルをそれに当てはめたいデータがあるとします。私の目標は、このモデル パラメーターの最適な値を見つけることです。

私は、AIC / BIC / MDLタイプの基準を使用してモデルの選択を行っています。これは、エラーの少ないモデルに報酬を与えるだけでなく、複雑さの高いモデルにペナルティを課します (このデータについて、いわば最も単純で最も説得力のある説明を求めています。かみそり)。

上記に続いて、これは 3 つの異なる基準 (2 つを最小化し、1 つを最大化する) に対して得られるものの例です。

aic-bic フィット

エルボーの形状は視覚的に簡単に確認でき、その領域のどこかでパラメータの値を選択します。問題は、私がこれを多数の実験で行っていることであり、介入なしでこの値を見つける方法が必要です。

私の最初の直感は、角から 45 度の角度で線を引き、それが曲線と交差するまで動かし続けることでした。

これを実装する方法、またはより良いアイデアについて何か考えはありますか?

上記のプロットの 1 つを再現するために必要なサンプルは次のとおりです。

curve = [8.4663 8.3457 5.4507 5.3275 4.8305 4.7895 4.6889 4.6833 4.6819 4.6542 4.6501 4.6287 4.6162 4.585 4.5535 4.5134 4.474 4.4089 4.3797 4.3494 4.3268 4.3218 4.3206 4.3206 4.3203 4.2975 4.2864 4.2821 4.2544 4.2288 4.2281 4.2265 4.2226 4.2206 4.2146 4.2144 4.2114 4.1923 4.19 4.1894 4.1785 4.178 4.1694 4.1694 4.1694 4.1556 4.1498 4.1498 4.1357 4.1222 4.1222 4.1217 4.1192 4.1178 4.1139 4.1135 4.1125 4.1035 4.1025 4.1023 4.0971 4.0969 4.0915 4.0915 4.0914 4.0836 4.0804 4.0803 4.0722 4.065 4.065 4.0649 4.0644 4.0637 4.0616 4.0616 4.061 4.0572 4.0563 4.056 4.0545 4.0545 4.0522 4.0519 4.0514 4.0484 4.0467 4.0463 4.0422 4.0392 4.0388 4.0385 4.0385 4.0383 4.038 4.0379 4.0375 4.0364 4.0353 4.0344];
plot(1:100, curve)

編集

Jonasの解決策を受け入れました。基本的に、曲線上の各点について、次の式で与えられるp最大距離を持つ点を見つけます。d

点線距離

4

11 に答える 11

27

上記のJonasによって投稿されたMatlabコードの動作するPythonバージョンが必要な場合に備えて。

import numpy as np
curve = [8.4663, 8.3457, 5.4507, 5.3275, 4.8305, 4.7895, 4.6889, 4.6833, 4.6819, 4.6542, 4.6501, 4.6287, 4.6162, 4.585, 4.5535, 4.5134, 4.474, 4.4089, 4.3797, 4.3494, 4.3268, 4.3218, 4.3206, 4.3206, 4.3203, 4.2975, 4.2864, 4.2821, 4.2544, 4.2288, 4.2281, 4.2265, 4.2226, 4.2206, 4.2146, 4.2144, 4.2114, 4.1923, 4.19, 4.1894, 4.1785, 4.178, 4.1694, 4.1694, 4.1694, 4.1556, 4.1498, 4.1498, 4.1357, 4.1222, 4.1222, 4.1217, 4.1192, 4.1178, 4.1139, 4.1135, 4.1125, 4.1035, 4.1025, 4.1023, 4.0971, 4.0969, 4.0915, 4.0915, 4.0914, 4.0836, 4.0804, 4.0803, 4.0722, 4.065, 4.065, 4.0649, 4.0644, 4.0637, 4.0616, 4.0616, 4.061, 4.0572, 4.0563, 4.056, 4.0545, 4.0545, 4.0522, 4.0519, 4.0514, 4.0484, 4.0467, 4.0463, 4.0422, 4.0392, 4.0388, 4.0385, 4.0385, 4.0383, 4.038, 4.0379, 4.0375, 4.0364, 4.0353, 4.0344]
nPoints = len(curve)
allCoord = np.vstack((range(nPoints), curve)).T
np.array([range(nPoints), curve])
firstPoint = allCoord[0]
lineVec = allCoord[-1] - allCoord[0]
lineVecNorm = lineVec / np.sqrt(np.sum(lineVec**2))
vecFromFirst = allCoord - firstPoint
scalarProduct = np.sum(vecFromFirst * np.matlib.repmat(lineVecNorm, nPoints, 1), axis=1)
vecFromFirstParallel = np.outer(scalarProduct, lineVecNorm)
vecToLine = vecFromFirst - vecFromFirstParallel
distToLine = np.sqrt(np.sum(vecToLine ** 2, axis=1))
idxOfBestPoint = np.argmax(distToLine)
于 2016-05-09T16:54:16.520 に答える
8

まず、簡単な微積分レビュー:f'各グラフの一次導関数は、fグラフ化されている関数が変化している速度を表します。二次導関数は、変化f''する速度を表します。f'が小さい場合f''は、グラフが適度なペースで方向を変えていることを意味します。ただし、f''が大きい場合は、グラフの方向が急速に変化していることを意味します。

f''グラフのドメイン全体で最大になるポイントを分離する必要があります。これらは、最適なモデルを選択するための候補ポイントになります。フィットネスと複雑さをどれだけ重視するかを正確に指定していないため、どのポイントを選択するかはあなた次第である必要があります。

于 2010-01-07T04:53:21.810 に答える
8

情報理論モデルの選択のポイントは、それがすでにパラメーターの数を考慮していることです。したがって、エルボを見つける必要はなく、最小値を見つけるだけで済みます。

カーブのエルボーを見つけることは、フィットを使用する場合にのみ関連します。それでも、エルボーを選択するために選択する方法は、ある意味で、パラメーターの数にペナルティを設定します。エルボを選択するには、原点からカーブまでの距離を最小化します。距離計算における 2 つの次元の相対的な重み付けにより、固有のペナルティ項が作成されます。情報理論的基準は、モデルの推定に使用されるパラメーターの数とデータ サンプルの数に基づいて、このメトリックを設定します。

結論としての推奨事項: BIC を使用し、最小値を取ります。

于 2010-01-07T13:32:16.320 に答える
5

したがって、これを解決する 1 つの方法は、肘のLに 2 つの線を 2 つ合わせることです。しかし、曲線の一部にはいくつかのポイントしかないため (コメントで述べたように)、どのポイントが離れているかを検出し、それらの間を補間してより均一なシリーズを作成し、 RANSACを使用しない限り、ライン フィッティングはヒットします。 Lに合う 2 本の線を見つけるのは少し複雑ですが、不可能ではありません。

そこで、より簡単な解決策を示します。作成したグラフは、MATLAB のスケーリングのおかげで (明らかに) 表示されます。したがって、スケール情報を使用して、「原点」からポイントまでの距離を最小限に抑えるだけでした。

注意:起源の推定は劇的に改善される可能性がありますが、それはあなたに任せます。

コードは次のとおりです。

%% Order
curve = [8.4663 8.3457 5.4507 5.3275 4.8305 4.7895 4.6889 4.6833 4.6819 4.6542 4.6501 4.6287 4.6162 4.585 4.5535 4.5134 4.474 4.4089 4.3797 4.3494 4.3268 4.3218 4.3206 4.3206 4.3203 4.2975 4.2864 4.2821 4.2544 4.2288 4.2281 4.2265 4.2226 4.2206 4.2146 4.2144 4.2114 4.1923 4.19 4.1894 4.1785 4.178 4.1694 4.1694 4.1694 4.1556 4.1498 4.1498 4.1357 4.1222 4.1222 4.1217 4.1192 4.1178 4.1139 4.1135 4.1125 4.1035 4.1025 4.1023 4.0971 4.0969 4.0915 4.0915 4.0914 4.0836 4.0804 4.0803 4.0722 4.065 4.065 4.0649 4.0644 4.0637 4.0616 4.0616 4.061 4.0572 4.0563 4.056 4.0545 4.0545 4.0522 4.0519 4.0514 4.0484 4.0467 4.0463 4.0422 4.0392 4.0388 4.0385 4.0385 4.0383 4.038 4.0379 4.0375 4.0364 4.0353 4.0344];
x_axis = 1:numel(curve);
points = [x_axis ; curve ]'; %' - SO formatting

%% Get the scaling info
f = figure(1);
plot(points(:,1),points(:,2));
ticks = get(get(f,'CurrentAxes'),'YTickLabel');
ticks = str2num(ticks);
aspect = get(get(f,'CurrentAxes'),'DataAspectRatio');
aspect = [aspect(2) aspect(1)];    
close(f);   

%% Get the "origin"
O = [x_axis(1) ticks(1)];

%% Scale the data - now the scaled values look like MATLAB''s idea of
% what a good plot should look like
scaled_O = O.*aspect;
scaled_points = bsxfun(@times,points,aspect);

%% Find the closest point
del = sum((bsxfun(@minus,scaled_points,scaled_O).^2),2);
[val ind] = min(del);
best_ROC = [ind curve(ind)];

%% Display
plot(x_axis,curve,'.-');
hold on;
plot(O(1),O(2),'r*');
plot(best_ROC(1),best_ROC(2),'k*');

結果:

結果

また、曲線については、原点Fit(maximize)を に変更する必要があります[x_axis(1) ticks(end)]

于 2010-01-07T12:37:53.793 に答える
3

シンプルで直感的な方法で、次のように言えます。

曲線上の任意の点から曲線の両方の端点に 2 本の線を引いた場合、これらの 2 本の線が度単位で最小の角度を成す点が目的の点です。

ここで、2 つの線は腕として視覚化でき、点は肘の点として視覚化できます。

于 2013-09-03T14:57:19.653 に答える