Trazar la función de error 3D en función de dos variables

Sep 24 2020

Estoy buscando hacer algo similar a este gráfico 3D de la función de error en una regresión lineal pero en octava.

Tengo una función f(a,b)que me devuelve un error ry dos listas de valores múltiples de ay bquiero ejecutar esta función y evaluar el error. Dado que esta es una función multidimensional, no es suficiente para mí trazar un diagrama de líneas 2d para mostrar el error, sino más bien ir con un diagrama 3D.

Dada dos lista:

list_a =[.1 1 10 100 1000 10000 100000]
list_b =[.1 1 10 100 1000 10000 100000]

Y la función f(a,b), ¿cuál es la forma más óptima de crear este gráfico 3D? ¿Crear un matrix_rque represente el error para cada combinación y luego graficarlo?

Si tuviera esa matriz, ¿cómo puedo trazarla en 3d usando octava?

Gracias

Respuestas

4 TasosPapastylianou Sep 24 2020 at 01:15

He aquí un ejemplo. Dada su elección de listas, la hice logarítmica :)

list_a = logspace( -1, 5, 50 );
list_b = logspace( -1, 5, 50 );

f      = @ (a,b) (a+b).^2;   % a simulated  error function

[ Grid_a, Grid_b ] = ndgrid( list_a, list_b );

F = log( f( Grid_a, Grid_b ) );   % log error evaluated on the gridpoints

SurfObj = surf( list_a, list_b, F );

Axes = get( SurfObj, 'parent' );
set( Axes, 'xscale', 'log', 'yscale', 'log' )   % use logarithmic axes

Desde aquí también puede darle una barra de colores personalizada, por ejemplo

CBar   = colorbar;
toLog  = @(x) sprintf('10e%d', x);
CTicks = get( CBar, 'ytick' );
set( CBar, 'yticklabel', arrayfun( toLog, CTicks, 'UniformOutput', false ) )

O si prefiere enfocarse en la forma en lugar de los valores, puede crear un objeto de color sólido y ponerle iluminación:

set( SurfObj, 'facecolor', 'blue' )
light( 'position', [8, 12, 25] )