カーブフィッティング
補間とフィッティングの違い:
- 実装方法: 内挿では曲線がサンプル ポイントを通過する必要がありますが、フィッティングではサンプル ポイントを通過する必要はなく、最小の全体誤差のみが必要です。
- 結果の形式: 内挿は、同じ近似関数を使用しない、サンプル ポイントの区分的近似です。関数フィッティングは、完全な式を使用して関数によって近似されます。
- 焦点: 内挿を使用して、区間内の特定の点に対応する関数値を推定できます。フィッティングでは、区間内の点を推定するだけでなく、区間外の点も予測できます。
- アプリケーション シナリオ: 内挿は主に正確なデータ セットに使用され、フィッティングは主に統計データ セットに使用されます。
Polyfit 関数は、y = ax 5 + bx 4 + cx 3 + dx 2 + ex + fy=ax^5+bx^4+cx^ の形式で、1 変数複数曲線フィッティング (多項式フィッティングも)に使用されます。 3+dx^2+ex+fy=× _5+bx _4+cx _3+dx _2+エックス_+f、私たちはxxx、yyyサンプルデータ。この関数を使用してパラメータ (係数)aaa、bbb、ccc、ddえ、えええ、ふf。
回帰関数は、次の形式で1 変数または多重線形回帰 (フィッティング)に使用されます: y = ax 1 + bx 2 + cx 3 + dx 4 + ey=ax_1+bx_2+cx_3+dx_4+ey=× _1+bx _2+cx _3+dx _4+e、私たちはx 1 x_1バツ1、×2×_2バツ2、×3×_3バツ3、×4×_4バツ4、yyyサンプルデータ。この関数を使用してパラメータ (係数)aaa、bbb、ccc、ddえ、えええ。
ポリフィット関数
通話形式:
-
[P,S,μ]=ポリフィット(X,Y,m)
-
[P,S]=ポリフィット(X,Y,m)
-
P=ポリフィット(X,Y,m)
パラメータの説明:
サンプルデータX、Yに基づいて、m次の多項式係数ベクトルPとそのサンプリング点における誤差データSが生成される。
x=0: 0.1: 1;
y=[-0.447, 1.978, 3.11, 5.25, 5.02, 4.66, 4.01, 4.58, 3.45, 5, 35];
p = polyfit(x, y, 3) % 三次多项式拟合
xx = 0: 0.01 : 1;
yy = polyval(p, xx) ; % 根据系数向量p计算在xx点处的函数值
plot(xx, yy, '-b', x, y, 'markersize', 20)
線形回帰分析も必要な場合は、corrcoef 関数を使用して相関係数を取得できます。
回帰関数
matlab の回帰関数では、信頼区間 bint、rint、stats の後の 3 つの値はすべて無限です。これは、データが線形関係に従っていないことを示しており、フィッティングには非線形フィッティング関数を考慮する必要があります。
通話形式:
- [B,BINT,R,RINT,STATS] = 回帰(Y,X)
- [B,BINT,R,RINT] = 回帰(Y,X)
- [B,BINT,R] = 回帰(Y,X)
- [B,BINT] = 回帰(Y,X)
- B = 回帰(Y,X)
パラメータの説明:
この関数を呼び出すときは、ターゲット関数の形式がわかっていることを確認してください。たとえば、ターゲット関数は次のとおりです: y = ax 1 + bx 2 + cx 3 + dx 4 + ey=ax_1+bx_2+cx_3+dx_4+ey=× _1+bx _2+cx _3+dx _4+e、またはy = ax 1 2 + bx 2 2 + cx 1 + dx 2 + ex 1 × x 2 + fy = ax_1^2+bx_2^2+cx_1+dx_2+ex_1×x_2+fy=× _12+bx _22+cx _1+dx _2+エックス_1×バツ2+fは、複数の次数の多変量多項式です。この関数を呼び出した後、パラメーターを渡して近似された係数値を取得します。
- x は行列です。行列の各サンプル、つまり行の数はサンプルの数に等しく、各サンプルの各列は、係数を除くサンプルの多項式の各項の値を表します。
- y は列ベクトルです。ベクトルの次元は行列の行数 (サンプル数) と一致しており、各値は各サンプルに対応する関数値を表します。
この関数は複数のサンプルのxi x_iに基づいていますバツ私は和yyy は多項式の係数に適合します。
戻り値の説明:
- B: 回帰係数、つまり未知のパラメータ。B(1) は定数項、B(2~...) は X の各列 (2 列目以降) に対応する項の係数です。
- BINT: 回帰係数の信頼区間。(信頼区間: ある推定値の 95% 信頼区間が [a, b] の場合、サンプルの平均値は a と b の間にあると言えることが 95% の信頼できることがわかります。エラーが発生する確率は5%)
- R:残差(残差とは、観測値と予測値(近似値)の差、つまり実際の観測値と回帰推定値の差を指します)
- RINT: 残差の信頼区間。
- STATS: 回帰モデルのテストに使用される統計。値は 4 つあります: 決定係数R 2 R^2R2 (適合度を測定する統計。R² の値が 1 に近づくほど、回帰直線の観測値への適合度が高くなります)、FFF統計量の観測値、pppの値(p < 0.05 p<0.05p<回帰モデルが確立されている場合は 0.0 5 ) 、誤差分散が推定されます。
x1=[3.91 6.67 5.33 5.56 6.12 7.92 5.82 5.5 5.59 6.12 6.68 6.93]';
x2=[9.43 14.5 15.8 19.8 17.4 23.8 31.6 37.1 36.4 32.2 36.6 41.3]';
X=[ones(12,1), x1, x2];
Y=[280 338 405 432 452 582 596 602 606 621 629 656]';
[b,bint,r,rint,stats] = regress(Y,X)
rcoplot(r,rint) % 绘制残差图
残差プロット: 残差プロットの円は各データ ポイントの実際の残差であり、水平線の間隔は残差信頼区間です。信頼区間は原点を通過し、方程式がよく適合していることを示します。基準を通過しない場合は、たとえば、上の図は、2 番目のデータ セットが原点を通過していないため、2 番目のデータ セットのフィッティング結果が不良であることを示しています。
その後、2 番目のデータセットを削除して再度当てはめることで、より正確な結果を得ることができます。
%% 目标函数:y=Ax1^2+Bx2^2+Cx1+Dx2+Ex1*x2+F (这是一个二次函数,两个变量,大写的字母是常数)
format long;
y=[7613.51 7850.91 8381.86 9142.81 10813.6 8631.43 8124.94 9429.79 10230.81 10163.61 9737.56 8561.06 7781.82 7110.97]';
x1=[7666 7704 8148 8571 8679 7704 6471 5870 5289 3815 3335 2927 2758 2591]';
x2=[16.22 16.85 17.93 17.28 17.23 17 19 18.22 16.3 13.37 11.62 10.36 9.83 9.25]';
X=[ones(size(y)) x1.^2 x2.^2 x1 x2 x1.*x2]; % 构造X矩阵!!!
[b,bint,r,rint,stats] = regress(y,X)
結果は次のとおりです。
b =
1.0e+04 *
-1.353935450267780
0.000000089381408
-0.005811190715467
-0.000605427789545
0.479983626458515
-0.000037869040292
bint =
1.0e+04 *
-2.621944842897225 -0.085926057638335
0.000000034253753 0.000000144509063
-0.027588831662544 0.015966450231609
-0.001309493882546 0.000098638303455
0.119564693553897 0.840402559363132
-0.000105954336341 0.000030216255756
r =
1.0e+02 *
-4.397667358984126
-2.361417286008764
-1.434643909138249
-5.904203974279353
7.511701773844997
5.570806699070599
-2.447861341816779
0.494622057474844
6.376995507987613
-6.789520765534544
2.744335484633611
1.578124015815701
-0.803533566911865
-0.137737336155596
rint =
1.0e+03 *
-1.219619853471144 0.340086381674319
-1.426253867770768 0.953970410569015
-0.919089416302223 0.632160634474573
-1.568776909577359 0.387936114721488
0.111430783412043 1.390909571356956
-0.533006860832905 1.647168200647025
-1.168898277755904 0.679326009392548
-0.977546779130818 1.076471190625786
-0.398546999643731 1.673946101241254
-1.439044988776064 0.081140835669156
-0.919162439561023 1.468029536487746
-1.088788822632291 1.404413625795431
-1.271236485719865 1.110529772337492
-1.017369947314269 0.989822480083149
stats =
1.0e+05 *
0.000008444011951 0.000086828553270 0.000000043344434 3.162249735298930
パラメータの問題の最初の列なので、x 1 2 x_1^2となります。バツ12最初の項として、x 2 2 x_2^2バツ22第 2 項として考えると、x 1 x_1バツ1第 3 項として考えると、x 2 x_2バツ2第 4 項として考えるx 1 x 2 x_1x_2バツ1バツ2第 5 項としては 5 次元の目的関数に相当します。
b は対応するパラメータ、b(1) は F (最後の定数項)、b(2) は A (最初のパラメータ)、b(3) は B、b(4) は C、b(4) はD、b(5)はEです。
bint は b の 95% 信頼区間です。
統計情報の 3 番目のパラメーターは F 検定の p 値であり、p 値は非常に小さい (p<0.05) ため、モデルのフィッティングが有効であることがわかります。
応用
ランダム性パラメータと多様性尺度および収束尺度の関係は次のとおりであることが知られています。多様性と収束性は同等に重要です。ランダムパラメータを選択する際のバランスポイントについて質問してください。
表 1 ランダム性パラメータと多様性尺度との関係
バツ | 0.03 | 0.06 | 0.09 | 0.12 | 0.15 | 0.18 | 0.21 | 0.24 | 0.27 | 0.3 |
y1 | 0.01 | 0.01 | 0.02 | 0.03 | 0.06 | 0.07 | 0.13 | 0.17 | 0.25 | 0.37 |
表 2 ランダム性パラメータと収束尺度との関係
バツ | 0.03 | 0.06 | 0.09 | 0.12 | 0.15 | 0.18 | 0.21 | 0.24 | 0.27 | 0.3 |
y1 | 0.85 | 0.76 | 0.68 | 0.62 | 0.54 | 0.52 | 0.5 | 0.49 | 0.48 | 0.47 |
x=0.03:0.03:0.3;
y1=[0.01,0.01,0.02,0.03,0.06,0.07,0.13,0.17,0.25,0.37];
y2=[0.85,0.76,0.68,0.62,0.56,0.52,0.49,0.46,0.43,0.39];
plot(x,y1,'*',x,y2,'o');
legend('多样性','收敛性')
問題分析:
ランダム性パラメータの増加は、多様性の増加と収束の減少につながります。両方が同等に重要な場合、バランス ポイントが取得されます。バランス ポイントの最適な位置は、多様性と収束が等しい場所です。
解決:
最初のステップ: 多様性と収束を別々にフィッティングして、フィッティング曲線を取得します。
ステップ 2: 2 つの曲線の交点を見つけます。
p1=polyfit(x,y1,2);
p2=polyfit(x,y2,2);
p=p1-p2;
xi=roots(p); % -1.14148334023966 0.316172995412073
xj=0:0.03:0.36;
yj1=polyval(p1,xj);
yj2=polyval(p2,xj);
yi=polyval(p1,xi(2))
plot(x,y1,'*',x,y2,'o',xj,yj1,xj,yj2,xi(2),yi,'rp');
lqlin関数
この機能はめったに使用されず、インターネット上には関連情報が比較的少ないため、以下のアイデアの一部は比較的主観的です。
境界または線形制約のある線形最小二乗ソルバー。
次の形式の最小二乗曲線近似問題を解きます。
詳細を見る. 実際、公式にも詳細は記載されておらず、サンプルも非常に貧弱です。
ここで最も簡単な例を示します。
%% y=ax^2+bxsinx+cx^3
xdata = [3.6,7.7,9.3,4.1,8.6,2.8,1.3,7.9,10.0,5.4];
ydata = [16,150.5,260.1,22.5,206.5,9.9,2.7,165.5,325.0,54.5];
C =[ xdata'.^2, xdata'.*sin(xdata'),xdata'.^3]; d = ydata';
[x, resnorm, residual] = lsqlin(C, d);
%% 绘图
xi = 0:0.1:11;
f = @(c, x) c(1).*x.^2 + c(2).*x.*sin(x) + c(3).*x.^3;
plot(xdata, ydata, '*', xi, f(x, xi))
この関数の欠点: 上限 (ub) または下限 (lb)、または Aeq または beq の制限が非多項項で行われる場合、これらの制限行列の構築は困難になります。たとえば、上記のコードではx 2 x^2バツ2、xsinx xsinxx s i n x、x 3 x^3バツ3はそれぞれ 1 番目、2 番目、3 番目の項目とみなされます。そのため、制約行列もこれら 3 つの項目に対する制約でなければなりませんが、質問がxxxの極限はどうなるでしょうか? 質問にxexlgx xe^xlgx× ex lgx? 各項目の制約に置き換えるのは困難です。
「上限と下限がある項目もあれば、上限も下限もない項目もある」という状況にどう対処すればよいかわかりません。
この機能についてはほとんど知られておらず、インターネット上には関連するコンテンツが少なすぎます。
lsqcurvefit 関数
最小二乗法は非線形フィッティング問題を解決します。!!
通話形式:
-
x = lsqcurvefit(fun,x0,xdata,ydata)
-
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)
-
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
-
[x,resnorm,residual,exitflag] = lsqcurvefit(…)
パラメータの説明:
- x0 は求められるパラメータ (初期解ベクトル) であり、初期変数の選択は最終的な解に影響します。
- xdata、ydataはフィッティングに使用されるデータです
- lb と ub は、解ベクトル lb≤x≤ub の下限と上限です。境界が指定されていない場合は、lb=[ ]、ub=[ ]
- fun はフィッティング対象の関数であり、x におけるフィッティング関数の値が計算されます。パラメータには一般に 2 種類あり、1 つは目的関数のパラメータ、もう 1 つは目的関数の未知数です。
戻り値の説明:
- x は取得するパラメータ ベクトルです
- resnorm=sum ((fun(x,xdata)-ydata).^2)、つまり、x における残差の二乗和
- 残差=fun(x,xdata)-ydata、つまり x における残差
- exitflag は反復を終了する条件です
%% y=tcos(kx)e^(wx)
x=[0,0.4,1.2,2,2.8,3.6,4.4,5.2,6,7.2,8,9.2,10.4,11.6,12.4,13.6,14.4,15]';
y=[1,0.85,0.29,-0.27,-0.53,-0.4,-0.12,0.17,0.28,0.15,-0.03,-0.15,-0.07,0.059,0.08,0.032,-0.015,-0.02]';
f= @(c,x) c(1)*cos(c(2)*x).*exp(c(3)*x);
c0= [0 0 0];
[c, fval]= lsqcurvefit(f, c0, x, y);
xx=0:0.1:20;
yy=f(c, xx);
plot(x, y, 'r*', xx, yy, 'b-');
disp(c);
注: ここで定義された関数は非常に特殊です。フィッティングされるパラメータも、関数のパラメータとして関数に渡される必要があります。フィッティングされるパラメータをベクトルとして関数に渡す目的は、次の形式を作成することです。関数をより簡潔にします。
xdata = [3.6,7.7,9.3,4.1,8.6,2.8,1.3,7.9,10.0,5.4];
ydata = [16,150.5,260.1,22.5,206.5,9.9,2.7,165.5,325.0,54.5];
c0=[ 0 0 0];
f_h=@(c, x) c(1)*x.^2 + c(2)*x.*sin(x) + c(3)*x.^3;
[c, resnorm, r]=lsqcurvefit(f_h, c0, xdata, ydata);
%% 绘图
xx=0:0.1:11;
yy=f_h(c, xx);
plot(xdata, ydata, 'r*', xx, yy, 'b-');
disp(c);
fittype関数とfit関数
独学で学習し、使用量を減らし、必要なときにだけ Baidu を使用します (ゲームをする人向け)。