3

特定の信号分析を行っていますが、特定のベル型の分布曲線を滑らかにする方法が必要です。移動平均アプローチでは、私が望む結果が得られません。適合曲線の最小/最大、および一般的な形状をそのまま維持したいのですが、サンプリングの不一致を解決したいと考えています。

要するに、単純な 2 次曲線をモデル化する一連のデータが与えられた場合、どの統計的平滑化方法をお勧めしますか?

可能であれば、実装、ライブラリ、またはフレームワークを参照してください。

ありがとうございます!

編集:いくつかの役立つデータ

(考えられるシグナルグラフ)

代替テキスト

暗い色の二次曲線は、明るい色の接続されたデータ ポイントの「適合」曲線です。

サンプル @ -44 (約) は、私のグラフの問題です (つまり、潜在的なサンプルの不一致)。分布をよりよく「適合」させ、それに応じて傾向がない値を克服するには、この曲線が必要です。お役に立てれば!

4

4 に答える 4

3
#include <iostream>
#include <math.h>

struct WeightedData 
{
double x;
double y;
double weight;
};

void findQuadraticFactors(WeightedData *data, double &a, double &b, double &c, unsigned int const datasize)
{
double w1 = 0.0;
double wx = 0.0, wx2 = 0.0, wx3 = 0.0, wx4 = 0.0;
double wy = 0.0, wyx = 0.0, wyx2 = 0.0;
double tmpx, tmpy;
double den;

for (unsigned int i = 0; i < datasize; ++i) 
    {
    double x = data[i].x;
    double y = data[i].y;
    double w = data[i].weight;  

    w1 += w;
    tmpx = w * x;
    wx += tmpx;
    tmpx *= x;
    wx2 += tmpx;
    tmpx *= x;
    wx3 += tmpx;
    tmpx *= x;
    wx4 += tmpx;
    tmpy = w * y;
    wy += tmpy;
    tmpy *= x;
    wyx += tmpy;
    tmpy *= x;
    wyx2 += tmpy;
    }

den = wx2 * wx2 * wx2 - 2.0 * wx3 * wx2 * wx + wx4 * wx * wx + wx3 * wx3 * w1 - wx4 * wx2 * w1;
if (den == 0.0) 
    {
    a = 0.0;
    b = 0.0;
    c = 0.0;
    }
else    
    {
    a = (wx * wx * wyx2 - wx2 * w1 * wyx2 - wx2 * wx * wyx + wx3 * w1 * wyx + wx2 * wx2 * wy - wx3 * wx * wy) / den;
    b = (-wx2 * wx * wyx2 + wx3 * w1 * wyx2 + wx2 * wx2 * wyx - wx4 * w1 * wyx - wx3 * wx2 * wy + wx4 * wx * wy) / den;
    c = (wx2 * wx2 * wyx2 - wx3 * wx * wyx2 - wx3 * wx2 * wyx + wx4 * wx * wyx + wx3 * wx3 * wy - wx4 * wx2 * wy) / den;
    }

}

double findY(double const a, double const b, double const c, double const x)
{       
return a * x * x + b * x + c; 
};




int main(int argc, char* argv[])
{
WeightedData data[9];
data[0].weight=1; data[0].x=1; data[0].y=-52.0; 
data[1].weight=1; data[1].x=2; data[1].y=-48.0; 
data[2].weight=1; data[2].x=3; data[2].y=-43.0; 
data[3].weight=1; data[3].x=4; data[3].y=-44.0; 
data[4].weight=1; data[4].x=5; data[4].y=-35.0; 
data[5].weight=1; data[5].x=6; data[5].y=-31.0; 
data[6].weight=1; data[6].x=7; data[6].y=-32.0; 
data[7].weight=1; data[7].x=8; data[7].y=-43.0; 
data[8].weight=1; data[8].x=9; data[8].y=-52.0; 

double a=0.0, b=0.0, c=0.0;
findQuadraticFactors(data, a, b, c, 9);
std::cout << " x \t y" << std::endl;
for (int i=0; i<9; ++i)
    {
    std::cout << " " << data[i].x << ", " << findY(a,b,c,data[i].x) << std::endl;
    }
}
于 2011-08-09T18:52:03.683 に答える
3

「二次」曲線は 1 つのことです。「釣鐘型」とは通常、ガウス正規分布を意味します。最良の推定ガウス分布を取得するのは非常に簡単です。サンプルの平均と分散を計算すると、滑らかな近似は次のようになります。

y = exp(-squared(x-mean)/variance)

一方、二次関数で滑らかな曲線を近似したい場合は、最小二乗誤差で二次多項式を計算することをお勧めします。これの公式を思い出すことはできませんが、微分計算をしたことがある場合は、総二乗誤差の式を (点ごとに) 書き、二次方程式の係数に関して微分してください。一次導関数をゼロに設定し、最良の近似値を求めます。または、調べることもできます。

最後に、滑らかな外観の曲線で一連の点を近似したい場合は、3 次スプラインが最適です。曲線は必ずしも意味があるわけではありませんが、滑らかな近似が得られます。

于 2010-04-06T02:22:49.127 に答える
0

移動平均のパラメーターが間違って設定されている可能性があります (サンプル ウィンドウが小さすぎるか大きすぎる)。

ベルカーブにノイズが重なっただけですか?ノイズ周波数は、取得しようとしている信号の周波数にどれくらい近いですか? 抽出しようとしているものの写真は、解決策を特定するのに役立つ場合があります。

関数パラメーターを合理的に推測できる場合は、最小二乗法を使用してある種のフィッティング アルゴリズムを試すことができます。これらの種類の技術は、多くの場合、ノイズに対してある程度の耐性があります。

于 2010-04-06T01:28:34.997 に答える
0

単純なデジタルローパス フィルターはどうでしょうか。

y[0] = x[0];
for (i = 1; i < len; ++i)
    y[i] = a * x[i] + (1.0 - a) * y[i - 1];

この場合、x[]は入力データで、y[]はフィルター処理された出力です。a係数は、微調整する必要がある 0 から 1 の間の値です。a の値が 1 の場合、入力が再現され、aが 0 に近づく につれてカットオフ周波数が減少します。

于 2010-04-06T01:30:29.180 に答える