Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

Splines cúbicos de suavizado

Este ejemplo muestra cómo usar los comandos csaps y spaps de Curve Fitting Toolbox™ para construir splines cúbicos de suavizado.

El comando CSAPS

El comando csaps proporciona el spline de suavizado. Se trata de un spline cúbico que sigue más o menos la tendencia subyacente supuesta de datos ruidosos. El parámetro de suavizado que elija determinará cuánto se aproxima el spline de suavizado a los datos proporcionados. Aquí le presentamos la información básica, una versión abreviada de la documentación:

CSAPS Cubic smoothing spline.

VALUES = CSAPS(X, Y, P, XX)

Returns the values at XX of the cubic smoothing spline for the

given data (X,Y) and depending on the smoothing parameter P, chosen

from the interval [0 .. 1]. This smoothing spline f minimizes

P * sum_i W(i)(Y(i) - f(X(i)))^2 + (1-P) * integral (D^2 f)^2

Ejemplo: Datos ruidosos de un polinomio cúbico

Estas son algunas pruebas llevadas a cabo. Se comienza con los datos de un cúbico simple, q(x) := x^3, se contaminan los valores con ruido y se determina el valor del parámetro de suavizado en 0,5. Entonces se presentan los valores de suavizado resultantes junto con el cúbico subyacente y los datos contaminados.

xi = (0:.05:1);
q = @(x) x.^3;
yi = q(xi);
randomStream = RandStream.create( 'mcg16807', 'Seed', 23 );
ybad = yi+.3*(rand(randomStream, size(xi))-.5);
p = .5;
xxi = (0:100)/100;
ys = csaps(xi,ybad,p,xxi);
plot(xi,yi,':',xi,ybad,'x',xxi,ys,'r-')
title('Clean Data, Noisy Data, Smoothed Values')
legend( 'Exact', 'Noisy', 'Smoothed', 'Location', 'NorthWest' )

Figure contains an axes object. The axes object with title Clean Data, Noisy Data, Smoothed Values contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent Exact, Noisy, Smoothed.

El suavizado aquí está demasiado exagerado. Eligiendo un valor del parámetro de suavizado p más cercano a 1, obtenemos un spline de suavizado más aproximado a los datos proporcionados. Probamos con p = .6, .7, .8, .9, 1 y representamos los splines de suavizado resultantes.

yy = zeros(5,length(xxi));
p = [.6 .7 .8 .9 1];
for j=1:5
   yy(j,:) = csaps(xi,ybad,p(j),xxi);
end
hold on
plot(xxi,yy);
hold off
title('Smoothing Splines for Various Values of the Smoothing Parameter')
legend({'Exact','Noisy','p = 0.5','p = 0.6','p = 0.7','p = 0.8', ...
        'p = 0.9', 'p = 1.0'}, 'Location', 'NorthWest' )

Figure contains an axes object. The axes object with title Smoothing Splines for Various Values of the Smoothing Parameter contains 8 objects of type line. One or more of the lines displays its values using only markers These objects represent Exact, Noisy, p = 0.5, p = 0.6, p = 0.7, p = 0.8, p = 0.9, p = 1.0.

Vemos que el spline de suavizado varía mucho según el parámetro de suavizado elegido. Incluso con p = 0,9, el spline de suavizado sigue estando muy alejado de la tendencia subyacente, mientras que con p = 1, la interpolación se acerca a los datos (ruidosos).

De hecho, la formulación utilizada por csapi (pág. 235ff de A Practical Guide to Splines) es muy sensible al escalado de la variable independiente. Un simple análisis de las ecuaciones utilizadas revela que el rango de sensibilidad de p está en torno a 1/(1+epsilon), siendo epsilon := h^3/16 y h la diferencia media entre los sitios vecinos. Sobre todo, podemos esperar una mayor aproximación a los datos cuando p = 1/(1+epsilon/100) y un suavizado más satisfactorio cuando p = 1/(1+epsilon*100).

La representación siguiente muestra el spline de suavizado para valores de p cuando se acerca a este número mágico, 1/(1+epsilon). En este caso, sería más conveniente observar 1-p, ya que el número mágico, 1/(1+epsilon), se acerca mucho a 1.

epsilon = ((xi(end)-xi(1))/(numel(xi)-1))^3/16;
1 - 1/(1+epsilon)
ans = 7.8124e-06
plot(xi,yi,':',xi,ybad,'x')
hold on
labels = cell(1,5);
for j=1:5
   p = 1/(1+epsilon*10^(j-3));
   yy(j,:) = csaps(xi,ybad,p,xxi);
   labels{j} = ['1-p= ',num2str(1-p)];
end
plot(xxi,yy)
title('Smoothing Splines for Smoothing Parameter Near Its ''Magic'' Value')
legend( [{'Exact', 'Noisy'}, labels], 'Location', 'NorthWest' )
hold off

Figure contains an axes object. The axes object with title Smoothing Splines for Smoothing Parameter Near Its 'Magic' Value contains 7 objects of type line. One or more of the lines displays its values using only markers These objects represent Exact, Noisy, 1-p= 7.8125e-08, 1-p= 7.8125e-07, 1-p= 7.8124e-06, 1-p= 7.8119e-05, 1-p= 0.00078064.

En este ejemplo, el spline de suavizado es muy sensible a la variación del parámetro de suavizado cerca del número mágico. Parece que la mejor opción es la que se aleja más del 1, pero puede que quiera elegir una más alejada.

p = 1/(1+epsilon*10^3);
yy = csaps(xi,ybad,p,xxi);
hold on
plot( xxi, yy, 'y', 'LineWidth', 2 )
title( sprintf( 'The Smoothing Spline For 1-p = %s is Added, in Yellow', num2str(1-p) ) )
hold off

Figure contains an axes object. The axes object with title The Smoothing Spline For 1-p = 0.0077519 is Added, in Yellow contains 8 objects of type line. One or more of the lines displays its values using only markers These objects represent Exact, Noisy, 1-p= 7.8125e-08, 1-p= 7.8125e-07, 1-p= 7.8124e-06, 1-p= 7.8119e-05, 1-p= 0.00078064.

También puede proporcionar ponderaciones de errores a csaps para prestar más atención a ciertos puntos de datos. Además, si no proporciona los sitios de evaluación xx, entonces csaps devolverá el spline de suavizado en formato ppform.

Por último, csaps también puede gestionar datos con valor vectorial e, incluso, datos de malla y multivariados.

El comando SPAPS

El spline cúbico de suavizado proporcionado por el comando spaps difiere de aquel construido en csaps únicamente en la forma en que se selecciona. Aquí le presentamos una versión abreviada de la documentación de spaps:

SPAPS Smoothing spline.

[SP,VALUES] = SPAPS(X,Y,TOL) returns the B-form and, if asked,

the values at X, of a cubic smoothing spline f for the given

data (X(i),Y(:,i)), i=1,2, ..., n.

The smoothing spline f minimizes the roughness measure

F(D^2 f) := integral ( D^2 f(t) )^2 dt on X(1) < t < X(n)

over all functions f for which the error measure

E(f) := sum_j { W(j)*( Y(:,j) - f(X(j)) )^2 : j=1,...,n }

is no bigger than the given TOL. Here, D^M f denotes the M-th

derivative of f. The weights W are chosen so that E(f) is the

Composite Trapezoid Rule approximation for F(y-f).

f is constructed as the unique minimizer of

rho*E(f) + F(D^2 f),

with the smoothing parameter RHO so chosen so that E(f) equals

TOL. Hence, FN2FM(SP,'pp') should be (up to roundoff) the same

as the output from CPAPS(X,Y,RHO/(1+RHO)).

Tolerancia frente a parámetro de suavizado

Puede resultar más sencillo proporcionar una tolerancia adecuada a spaps en lugar del parámetro de suavizado p requerido por csaps. En el ejemplo anterior, hemos añadido ruido aleatorio distribuido uniformemente del intervalo 0.3*[-0.5 .. 0.5]. Por tanto, podemos estimar un valor razonable para tol como valor de la medida de error e en dicho ruido.

tol = sum((.3*(rand(randomStream, size(yi))-.5)).^2);

Esta representación muestra el spline de suavizado resultante que se ha construido mediante spaps. Tenga en cuenta que se ha especificado una ponderación de errores uniforme, que es el valor predeterminado en csaps.

[sp,ys,rho] = spaps(xi,ybad,tol,ones(size(xi)));
plot(xi,yi,':',xi,ybad,'x',xi,ys,'r-')
title( sprintf( 'Clean Data, Noisy Data, Smoothed Values (1-p = %s )', num2str(1/(1+rho)) ) );
legend( {'Exact','Noisy','Smoothed'}, 'location', 'NorthWest' )

Figure contains an axes object. The axes object with title Clean Data, Noisy Data, Smoothed Values (1-p = 0.013761 ) contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent Exact, Noisy, Smoothed.

El título de la figura muestra el valor de p que se usaría en csaps para obtener exactamente este spline de suavizado para estos datos.

Además, también se muestra el spline de suavizado obtenido de csaps cuando no se proporciona un parámetro de suavizado. En este caso, csaps elige el parámetro de acuerdo con un procedimiento ad hoc determinado cuyo objetivo es localizar la región en la que el spline de suavizado es más sensible al parámetro de suavizado (similar a como hemos comentado antes).

hold on
plot(xxi,fnval(csaps(xi,ybad),xxi),'-')
title('Clean Data, Noisy Data, Smoothed Values')
legend({'Exact' 'Noisy' 'spaps, specified tolerance' ...
        'csaps, default smoothing parameter'}, 'Location', 'NorthWest' )
hold off

Figure contains an axes object. The axes object with title Clean Data, Noisy Data, Smoothed Values contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent Exact, Noisy, spaps, specified tolerance, csaps, default smoothing parameter.

CSAPS frente a SPAPS

Los comandos csaps y spaps difieren en la forma en la que se especifica un spline de suavizado determinado, mediante un parámetro de suavizado frente a una tolerancia. Otra diferencia es que spaps puede proporcionar un spline de suavizado lineal o de quinto grado, además del spline cúbico de suavizado.

El spline de suavizado de quinto grado es mejor que el spline cúbico de suavizado en situaciones en las que se desee que la segunda derivada se mueva lo menos posible.