少なくとも 2 つのピークを持つデータ系列のガウス パラメータを見つけなければなりません。どうすれば管理できますか?)がyi = f(xi
あり、パラメータ mu と sigma が必要だとします。
すべてのデータの対数をとり、それらを polyfit で計算できることはわかっていますが、この方法では、必要のないものを簡単に得ることができます (理由を説明するには長すぎます)。
私は何をすべきか?
重要な詳細:私の MATLAB バージョンには normfit がありません。
私はこの種の質問にここで数回答えましたが、そのたびに「この種のことをもっと簡単に行うことができるに違いない...」と思いますが、もっと簡単な方法を見たり考えたりしていません、だから...我慢してください:)
事前にピークの数がわかっている場合は、次のようにするだけです。
function GaussFit
% DATA TO REPRODUCE
mu = [112 -45];
sigma = [ 12 24];
F =[...
mu(1) + sigma(1)*randn(1e4, 1)
mu(2) + sigma(2)*randn(1e4, 1)];
% interpolate with splines through the histogram
[y,x] = hist(F, 1500);
G = spline(x,y);
% Find optimum curve fit
P0 = [% mu S A
80 2 2e3; % (some rough initial estimate)
-8 12 2e3];
P = fminunc(@(P) Obj(P, x,G), P0); % refine the estimate
% REPRODUCED DATA
P(:,1:2).'
figure, clf, hold on
plot(x, P(1,3)*Gaussian(P(1,1),P(1,2),x) + P(2,3)*Gaussian(P(2,1),P(2,2),x))
plot(x, ppval(G,x),'r.', 'MarkerSize', 1)
end
% The objective function for the curve fitting optimizer
function val = Obj(P, x,F)
G = zeros(size(x));
for ii = 1:size(P,1);
mu = P(ii,1); % mean
sigma = P(ii,2); % std. deviation
A = P(ii,3); % "amplitude"
G = G + A/sigma/sqrt(2*pi) * exp(-(x-mu).^2/2/sigma^2);
end
val = sum((G-ppval(F,x)).^2);
end
% just a function for plotting
function G = Gaussian(mu,sigma,x)
G = 1/sigma/sqrt(2*pi) * exp(-(x-mu).^2/2/sigma^2);
end
結果:
ans =
112.1633 -45.2013
12.6777 24.6723
私が言うかなり良い結果:)
いつものように、この方法にはいくつかの欠点があります。事前に知っておく必要があります
事前にピークの数がわからない場合 (およびピークの数を自動的に見つけたい場合) はkmeans
、いくつかのヒューリスティックを使用して、データセット内のピークの量 (およびその平均) を特定する必要があります。
いずれにせよ、重要なことは、ピークの数を見つける方法はありますが、適切な初期推定値を自動的に見つける方法はないということです。1 つまたは数十のデータ セットしかない場合でも、最初の推定値を見つけることは手動で行うことができますが、それを超えると、上記の方法はますます魅力的ではなくなります。
ただし、グローバルオプティマイザーを使用することもできます。その場合、初期見積もりを作成する必要はもうありません。しかし、この時点で私は考えずにはいられません
「そんな単純な問題には必要ないはずだ!」
でもまあ。