2014-02-18 2 views
0

Я измерил данные от MATLAB, и мне интересно, как лучше сгладить данные? Пример данные (первые Colum = х-данные/второй Colum = у-данные):Сглаживание измеренных данных в MATLAB?

33400  209.11 
    34066  210.07 
    34732  212.3 
    35398  214.07 
    36064  215.61 
    36730  216.95 
    37396  218.27 
    38062  219.52 
    38728  220.11 
    39394  221.13 
    40060  221.4 
    40726  222.5 
    41392  222.16 
    42058  223.29 
    42724  222.77 
    43390  223.97 
    44056  224.42 
    44722  225.4 
    45388  225.32 
    46054  225.98 
    46720  226.7 
    47386  226.53 
    48052  226.61 
    48718  227.43 
    49384  227.84 
    50050  228.41 
    50716  228.57 
    51382  228.92 
    52048  229.67 
    52714  230.02 
    53380  229.54 
    54046  231.19 
    54712  231.00 
    55378  231.5 
    56044  231.5 
    56710  231.79 
    57376  232.26 
    58042  233.12 
    58708  232.65 
    59374  233.51 
    60040  234.16 
    60706  234.21 

Данные во втором столбце должны быть Монотон, но это не так. Как сделать его гладким? Я мог бы, вероятно, изобрести короткий алгоритм сам, но я думаю, что это лучший способ использовать установленный и проверенный ... знаете ли вы, что хороший способ каким-то образом интегрировать outliners, чтобы сделать его монотонной кривой !?

Заранее спасибо

+0

Что вы подразумеваете под монотонной кривой? Округлые? –

+0

Математически монотонный, то есть увеличение значений x дает увеличение y-значений (2. столбец). – tim

+1

Возможно, вы можете найти алгоритмы сглаживания Matlab по адресу http://www.mathworks.fr/discovery/smoothing.html – marsei

ответ

1

Монотонные в вашем случае постоянно растет!

Смотрите ниже варианты (1. Кобба-Дугласа; 2. Квадратичные; 3. Cubic)

clear all 
    close all 

    load needSmooth.dat % Your data 

    x=needSmooth(:,1); 
    y=needSmooth(:,2); 
    n=length(x); 

    % Figure 1 
    logX=log(x); 
    logY=log(y); 
    Y=logY; 
    X=[ones(n,1),logX]; 
    B=regress(Y,X); 
    a=exp(B(1,1)); 
    b=B(2,1); 
    figure(1) 
    plot(x,y,'k*') 
    hold 
    for i=1:n-1 
     plot([x(i,1);x(i+1,1)],[a*x(i,1)^b;a*x(i+1,1)^b],'k-') 
    end  


    %Figure 2 

    X=[ones(n,1),x,x.*x]; 
    Y=y; 
    B=regress(Y,X); 
    c=B(1,1); 
    b=B(2,1); 
    a=B(3,1); 
    figure(2) 
    plot(x,y,'k*') 
    hold 
    for i=1:n-1 
     plot([x(i,1);x(i+1,1)],[c+b*x(i,1)+a*x(i,1)^2; c+b*x(i+1,1)+a*x(i+1,1)^2],'k-') 
    end  

%Figure 3 

X=[ones(n,1),x,x.*x,x.*x.*x]; 
Y=y; 
B=regress(Y,X); 
d=B(1,1); 
c=B(2,1); 
b=B(3,1); 
a=B(4,1); 
figure(3) 
plot(x,y,'k*') 
hold 
for i=1:n-1 
    plot([x(i,1);x(i+1,1)],[d+c*x(i,1)+b*x(i,1)^2+a*x(i,1)^3; d+c*x(i+1,1)+b*x(i+1,1)^2+a*x(i+1,1)^3],'k-') 
end  

Есть также некоторые приготовленные функции в Matlab, такие как «гладкий» и «сплайн», который также должен работайте в вашем случае, так как ваши данные почти монотонны.

+0

Итак, вы думаете, что это лучший способ сделать какую-то монотонную регрессию кривой и использовать ее поэтому !? – tim

+0

@bjoern это зависит от вашей цели. Обычно основная цель сглаживания - показать тенденцию. Поэтому многочлены - отличные варианты, потому что их можно легко оценить. Поскольку ваши данные очень хорошо себя ведут - все работает хорошо (сплайны, скользящие средние и т. Д. - все они в наборах инструментов Matlab). Однако вы не должны использовать уравнение многочлена для представления ваших данных, поскольку многочлены во всей строке не являются монотонными. – DanielTheRocketMan

Смежные вопросы