Árbol de agradecimientos16Gracias
  • 1 Mensaje de Jwym, Lord of Cinder
  • 2 Mensaje de Hijitus
  • 2 Mensaje de Jwym, Lord of Cinder
  • 1 Mensaje de Hijitus
  • 1 Mensaje de Jwym, Lord of Cinder
  • 1 Mensaje de Hijitus
  • 1 Mensaje de Jwym, Lord of Cinder
  • 5 Mensaje de November
  • 1 Mensaje de Jwym, Lord of Cinder
  • 1 Mensaje de opositivo

Gestión de división por cero al normalizar

  1. #1
    Avatar de opositivo Mega Usuari@
    Registrad@ el
    03/02/2008
    Sexo
    Chico
    Mensajes
    8.696
    Agradecido
    705 veces
    Temas
    428

    Gestión de división por cero al normalizar

    Tengo una matriz A (mxn), y la inversa obtenida con dos algoritmos diferentes, Aia y Aib. Para comparar los resultados quiero calcular la media del error relativo de cada elemento. Propongo:

    para i desde 1 hasta m
    para j desde 1 hasta n
    E(i,j) = Aib(i,j)-Aia(i,j) / Aia(i,j)
    loop
    loop

    Error = media(E);

    Que funciona muy bien si Aia no tiene ningún elemento nulo. Pero cuando Aia(i,j)=0, tenemos una división por cero, y se nos va a cielo. No sé si es muy osado decir que si Aia(i,j)=0, Aib(i,j)=0, por lo que es un 0/0=0.

    He visto como solución añadir un valor muy pequeño, b=1E-10, para que la divisón nunca sea por cero:

    http://www.mathworks.com/help/dsp/re...alization.html

    Pero entiendo que igualmente se dispara el error con unos pocos elementos nulos. He visto alguna solución más creativa, utilizando transpuestas y matrices auxiliares para evitar la división en caso de querer calcularlo por líneas o columnas:

    http://stackoverflow.com/questions/1...-sparse-matrix

    Pero se me escapa como adaptarlo. Por último, en varias fuentes directamente lo gestionan como excepción y dejan un cero o NaN.

    @Jaime, @Hijitus, cía... ¿qué haríais para dar una referencia de la calidad del resultado teniendo en cuenta que se esperan matrices más bien vacías -sparse-? La solución directa es dejar la media del error absoluto, o calcular la norma (l-1 , l-2) de las matrices directamente. Pero, ¿en caso de querer normalizar el error de cada elemento por cabezonería?
    Follar contigo debe ser como leer poesía - Undefined speaker 08/09/09
    Zoaz Euskal Herrira, si es que existe. Euskadifrenia. - Zarama, Bermeo 18/04/09

  2. #2
    Avatar de Jwym, Lord of Cinder Moderation gone hollow
    Registrad@ el
    16/07/2005
    Localidad
    ¿Importa eso en Internet?
    Sexo
    Chico
    Edad
    33
    Mensajes
    10.493
    Agradecido
    2731 veces
    Temas
    85
    Yo te iba a decir que hacer la media de los errores de las entradas de la matriz no me parece una buena idea y que lo que deberías hacer es calcular la norma -preferiblemente la ||·||1- de la diferencia Aia - Aib. Ese es el procedimiento estándar para estimar errores en cálculos con matrices, pero ya que es por cabezonería...

    ...vamos a tratar de pensar algo: se me ocurre un modo muy tonto de evitar la división por cero en estimaciones del error, ya me dirás si estoy muy lejos de lo que quieres. Ello puede lograrse si no siempre divides por Aia(i,j), lo cual es admisible ya que en realidad trabajas con cotas del error relativo y no con el error en sí (que es imposible de calcular). Entonces, puedes añadir la variable

    c = max{ |Aia(i,j)| , |Aib(i,j)| }

    y calcular el error como

    E(i,j) = |Aib(i,j) - Aia(i,j)| / c.

    De este modo dejarás de dividir por cero salvo que ambas entradas sean cero, lo cual es menor o igual que la cantidad de veces que solamente Aia(i,j) es cero. El uso del valor absoluto es importante porque si una entrada es negativa y la otra es cero, entonces el máximo es cero, que es justamente lo que no queremos.

    Ahora, si c = 0 significa que Aia(i,j) = Aib(i,j) = 0 => EAbs(i,j) = 0 => E(i,j) = 0, independientemente de que dividas por cero o no, por lo que puedes meter

    Código:
    if(c == 0) E[i][j] = 0;
    tranquilamente.

    Sea como fuere, para calcular inversas de matrices, especialmente si son matrices escasas, Gauss-Seidel es tu amigo. Si quieres ponerte exquisito, sobrerrelajación, pero el esfuerzo de programación no compensa la ganancia en eficiencia respecto de G-S.

    Ahora una pregunta de matemático tocapelotas: ¿Cómo rayos has definido la inversa de una matriz no cuadrada? Eso a priori no existe.
    Última edición hecha por Jwym, Lord of Cinder, 14/02/2014 a las 22:49.
    opositivo ha agradecido este mensaje.
    I allò que val és la consciència de no ser res si no s'és poble. De no ser res si no s'és lliure.
    Vicent Andrés Estellés.


  3. #3
    Wiiiiii
    Registrad@ el
    13/02/2010
    Localidad
    Barcelona
    Sexo
    Chico
    Edad
    26
    Mensajes
    1.054
    Agradecido
    686 veces
    Temas
    11
    Jaimériste Galois escribió: Ver mensaje
    Yo te iba a decir que hacer la media de los errores de las entradas de la matriz no me parece una buena idea y que lo que deberías hacer es calcular la norma -preferiblemente la ||·||1- de la diferencia Aia - Aib. Ese es el procedimiento estándar para estimar errores en cálculos con matrices, pero ya que es por cabezonería...

    ...vamos a tratar de pensar algo: se me ocurre un modo muy tonto de evitar la división por cero en estimaciones del error, ya me dirás si estoy muy lejos de lo que quieres. Ello puede lograrse si no siempre divides por Aia(i,j), lo cual es admisible ya que en realidad trabajas con cotas del error relativo y no con el error en sí (que es imposible de calcular). Entonces, puedes añadir la variable

    c = max{ |Aia(i,j)| , |Aib(i,j)| }

    y calcular el error como

    E(i,j) = |Aib(i,j) - Aia(i,j)| / c.

    De este modo dejarás de dividir por cero salvo que ambas entradas sean cero, lo cual es menor o igual que la cantidad de veces que solamente Aia(i,j) es cero. El uso del valor absoluto es importante porque si una entrada es negativa y la otra es cero, entonces el máximo es cero, que es justamente lo que no queremos.

    Ahora, si c = 0 significa que Aia(i,j) = Aib(i,j) = 0 => EAbs(i,j) = 0 => E(i,j) = 0, independientemente de que dividas por cero o no, por lo que puedes meter

    Código:
    if(c == 0) E[i][j] = 0;
    tranquilamente.

    Sea como fuere, para calcular inversas de matrices, especialmente si son matrices escasas, Gauss-Seidel es tu amigo. Si quieres ponerte exquisito, sobrerrelajación, pero el esfuerzo de programación no compensa la ganancia en eficiencia respecto de G-S.

    Ahora una pregunta de matemático tocapelotas: ¿Cómo rayos has definido la inversa de una matriz no cuadrada? Eso a priori no existe.
    Jaime, igual se me escapa algo básico, pero con esa solución, ¿el error relativo no daría uno si uno y solo uno de entre (Aia(i,j), Aib(i,j)) es cero? ¿Eso no podría estropear un poco luego la media? Entiendo que la diferencia rondará los valores en [0,1) más próximos a cero, un uno podría hacer "mucho ruido".

    A mí lo único que se me ocurre es que cuando uno sea cero usar error absoluto, teniendo en cuenta que no creo que el otro valor se vaya a 100000. Pero no sé, me parece en general un poco incómodo.

    Igual te puedo ayudar mejor si nos das un poco de pistas por el contexto, ¿pa qué lo necesitas? ¿O es simple curiosidad?
    Jwym, Lord of Cinder y opositivo han agradecido este mensaje.

  4. #4
    Avatar de Jwym, Lord of Cinder Moderation gone hollow
    Registrad@ el
    16/07/2005
    Localidad
    ¿Importa eso en Internet?
    Sexo
    Chico
    Edad
    33
    Mensajes
    10.493
    Agradecido
    2731 veces
    Temas
    85
    Claro que da uno, pero es que piénsalo: si en uno da cero y el otro da distinto de cero estás diciendo que el error relativo es tan grande como se quiera (¡estás comparando con cero!). Bajo mi punto de vista, eso contribuirá a la media lo que tenga que contribuir, pues date cuenta de que si en una inversión estás obteniendo un cero dónde no deberías es que hay algo que estás haciendo realmente mal.
    opositivo y Hijitus han agradecido este mensaje.
    I allò que val és la consciència de no ser res si no s'és poble. De no ser res si no s'és lliure.
    Vicent Andrés Estellés.


  5. #5
    Wiiiiii
    Registrad@ el
    13/02/2010
    Localidad
    Barcelona
    Sexo
    Chico
    Edad
    26
    Mensajes
    1.054
    Agradecido
    686 veces
    Temas
    11
    Jaimériste Galois escribió: Ver mensaje
    Claro que da uno, pero es que piénsalo: si en uno da cero y el otro da distinto de cero estás diciendo que el error relativo es tan grande como se quiera (¡estás comparando con cero!). Bajo mi punto de vista, eso contribuirá a la media lo que tenga que contribuir, pues date cuenta de que si en una inversión estás obteniendo un cero dónde no deberías es que hay algo que estás haciendo realmente mal.
    Tiene lógica visto así. Pero no me convence mucho, Opositivo comentó que descartó agregar un valor B muy pequeño porque si no se le disparaba la media, en este caso sería lo mismo. Y bueno, siempre puede ser que realmente en esa posición la inversa dé cero y el error esté en el otro cálculo.

    Lo que deberías tratar, se me ocurre, es encontrar un modo de no dividir, aprovechando que manejas matrices y listo. Pero ando un poco espeso y no soy capaz de ver cómo sin simplemente no usar error relativo.
    opositivo ha agradecido este mensaje.

  6. #publi
    Publicidad

     

  7. #6
    Avatar de Jwym, Lord of Cinder Moderation gone hollow
    Registrad@ el
    16/07/2005
    Localidad
    ¿Importa eso en Internet?
    Sexo
    Chico
    Edad
    33
    Mensajes
    10.493
    Agradecido
    2731 veces
    Temas
    85
    Hijitus escribió: Ver mensaje
    Tiene lógica visto así. Pero no me convence mucho, Opositivo comentó que descartó agregar un valor B muy pequeño porque si no se le disparaba la media, en este caso sería lo mismo. Y bueno, siempre puede ser que realmente en esa posición la inversa dé cero y el error esté en el otro cálculo.
    Claro, por eso tomamos el máximo, porque lo que miramos es la comparación. Si el error relativo da uno es que uno de los dos cálculos está mal, pero a priori no podemos saber cuál.

    Lo que deberías tratar, se me ocurre, es encontrar un modo de no dividir, aprovechando que manejas matrices y listo. Pero ando un poco espeso y no soy capaz de ver cómo sin simplemente no usar error relativo.
    Esto sería lo suyo, la verdad. Una cosa que quizá podría probarse es ver cuán lejos andan A*Aia y A*Aib de ser la identidad: tomemos las matrices

    Bia = A*Aia
    BiB = A*Aib

    y en lugar de compararlas entre ellas comparémoslas con la identidad, que es lo que sabemos que debería dar. Llegados a este punto, veo muy claro que hay que hacerlo con normas matriciales, porque de hecho, dichas normas no dejan de ser promedios. Yo haría ||Bia||1 y ||Bib||1 y luego tomaría como error relativo E = |1 - ||·||1 | (ya que dividimos por la norma de la identidad, que es uno). Además así podemos comparar los errores en un y otro procedimiento.
    opositivo ha agradecido este mensaje.
    I allò que val és la consciència de no ser res si no s'és poble. De no ser res si no s'és lliure.
    Vicent Andrés Estellés.


  8. #7
    Wiiiiii
    Registrad@ el
    13/02/2010
    Localidad
    Barcelona
    Sexo
    Chico
    Edad
    26
    Mensajes
    1.054
    Agradecido
    686 veces
    Temas
    11
    Vale, me gustó mucho más la última propuesta de Jaime. Yo ya me estaba complicando ahora mismo pensando métodos complicadísimos, eso es mucho más simple (la ley de la navaja de Ockham...).

    El único problema que le veo (soy un tocapelotas xD) es que es mucho cálculo. Si lo quieres para ver qué método de calcular la inversa es mejor, me parece la mejor alternativa, si estás en medio de un programa y forma parte de una operación más compleja, me tiraría por algo menos exacto y más accesible.
    opositivo ha agradecido este mensaje.

  9. #8
    Avatar de Jwym, Lord of Cinder Moderation gone hollow
    Registrad@ el
    16/07/2005
    Localidad
    ¿Importa eso en Internet?
    Sexo
    Chico
    Edad
    33
    Mensajes
    10.493
    Agradecido
    2731 veces
    Temas
    85
    Hombre, puede mejorarse tomando la norma ||·||2 que involucra a los vaps de la matriz. A priori parece peor, pero usando Gerschgorin con astucia pueden aproximarse usando solo los elementos de la diagonal de la matriz en lugar de toda entera. Si se hace bien, queda una aproximación muy decente del radio espectral, pero me temo que esto es meterse ya en maquinaria pesada conceptualmente hablando. No sé hasta dónde llega el control de Opo sobre estas cosas.
    opositivo ha agradecido este mensaje.
    I allò que val és la consciència de no ser res si no s'és poble. De no ser res si no s'és lliure.
    Vicent Andrés Estellés.


  10. #9
    Avatar de November Καλυψώ
    Registrad@ el
    15/03/2008
    Sexo
    Chica
    Edad
    27
    Mensajes
    9.130
    Agradecido
    4387 veces
    Temas
    171
    Qué monos.

  11. #10
    Avatar de opositivo Mega Usuari@
    Registrad@ el
    03/02/2008
    Sexo
    Chico
    Mensajes
    8.696
    Agradecido
    705 veces
    Temas
    428
    Hijitus escribió: Ver mensaje
    Igual te puedo ayudar mejor si nos das un poco de pistas por el contexto, ¿pa qué lo necesitas? ¿O es simple curiosidad?
    Como ha apuntado Jaime, no obtengo la inversa, sino la pseudoinversa conocida como Moore-Penrose mediante Singular Value Decomposition (SVD). Teniendo en cuenta el interés que habéis mostrado, y que agradezco, pequeño background:

    Descomponemos una matriz A cuadrada o no, de cualquier tamaño m x n :

    A = U S V^T

    Donde S es una matriz diagonal que contiene los singular values de A. U y V son matrices ortogonales de m x m y n x n respectivamente. La inversa de A se puede obtener mediante:

    A' = V S' U^T

    La descomposición se realizada mediante Hestenes-Jacobi o one-sided Jacobi. Se obtiene AV=W con una serie de rotaciones planares (Givens). Las normas euclídeas de las columnas de W son los valores singulares, y se obtiene U normalizando W con los valores singulares: AV=US -> A=USV^T.

    Permite obtener soluciones aceptables para problemas LSE del tipo A x = b mediante x' = A' b.

    Buscamos medir la diferencia en la calidad de la solución (accuracy) al implementar el algoritmo con precisión finita. Para ello se resuelve el problema con precisión de máquina (como resultado de referencia, que sin ser real es el "mejor" que se puede obtener en un PC) y se compara con single. Como es un algoritmo iterativo y no conocemos las matrices de entrada a priori, medimos tres errores para diferentes matrices (tamaño, densidad, condition number...):

    Error en la inversa: l-1 del relativo (element wise)
    Error en los eigen: maximo relativo (diag)
    Residuo: l-2 relativo

    En el caso del residuo, después de la factorizacion se reconstruye A* y se calcula la norma l-2 de A*-A. Para normalizar se divide entre la norma l-2 de A. No hay problema, salvo que A este completamente vacía, y eso no tiene sentido.

    El caso de los eigen es más sencillo que el de la inversa, porque hay que elevar al cuadrado los elementos y son siempre positivos. Pero nos podemos encontrar con la misma situación de división por cero sí hay alguna columna nula. Estamos optando por dejar el error absoluto en esos casos.

    En la inversa también estamos siguiendo la misma lógica : si Aia(i,j)=0 o Aib(i,j)=0, dejamos la diferencia sin normalizar.

    Paso a comentar vuestras aportaciones en un segundo mensaje.
    Última edición hecha por opositivo, 15/02/2014 a las 4:44.

  12. #11
    Avatar de opositivo Mega Usuari@
    Registrad@ el
    03/02/2008
    Sexo
    Chico
    Mensajes
    8.696
    Agradecido
    705 veces
    Temas
    428
    Jaimériste Galois escribió: Ver mensaje
    Yo te iba a decir que hacer la media de los errores de las entradas de la matriz no me parece una buena idea y que lo que deberías hacer es calcular la norma -preferiblemente la ||·||1- de la diferencia Aia - Aib. Ese es el procedimiento estándar para estimar errores en cálculos con matrices, pero ya que es por cabezonería...
    Es por cabezonería, no por mi interés particular . Vamos, que os estoy pidiendo sopitas para hacer algo más estandarizado, y esto que me comentas me gusta.

    En caso de querer expresarlo de forma relativa entiendo que: ||Aib-Aia|| / ||Aia||, en ambos casos l-1.

    ¿Qué diferencias se pueden esperar en las medidas comparando este método con el pseudocodigo? ¿Se mantendrán en el mismo orden de magnitud? Voy a hacer la prueba igualmente, pero por conocer el fundamento.

    Jaime escribió:

    c = max{ |Aia(i,j)| , |Aib(i,j)| }

    y calcular el error como

    E(i,j) = |Aib(i,j) - Aia(i,j)| / c.
    ¿En este caso no estaríamos normalizando con respecto a Aia algunas veces y a Aib otras. Ciertamente está bien porque así obtendremos los resultados más pequeños (al dividir entre el más grande), y se introduce menos ruido que dejando simplemente el error absoluto

    Jaime escribió:
    Sea como fuere, para calcular inversas de matrices, especialmente si son matrices escasas, Gauss-Seidel es tu amigo. Si quieres ponerte exquisito, sobrerrelajación, pero el esfuerzo de programación no compensa la ganancia en eficiencia respecto de G-S.
    En realidad el objetivo no es tanto hallar la inversa (que es una aplicación muy demandada), como resolver el SVD, con muy diferentes aplicaciones.

    Más concretamente, está enfocado en la implementación hardware, por lo que se tienen en cuenta las posibilidades de paralelización, para acelerar así la computación.

    Me gusta muy mucho la última propuesta, muy limpia y directa. Pero creo que ya no estoy en condiciones de procesar. Mañana más
    Última edición hecha por opositivo, 15/02/2014 a las 5:22.

  13. #12
    Avatar de Jwym, Lord of Cinder Moderation gone hollow
    Registrad@ el
    16/07/2005
    Localidad
    ¿Importa eso en Internet?
    Sexo
    Chico
    Edad
    33
    Mensajes
    10.493
    Agradecido
    2731 veces
    Temas
    85
    opositivo escribió: Ver mensaje
    Es por cabezonería, no por mi interés particular . Vamos, que os estoy pidiendo sopitas para hacer algo más estandarizado, y esto que me comentas me gusta.

    En caso de querer expresarlo de forma relativa entiendo que: ||Aib-Aia|| / ||Aia||, en ambos casos l-1.
    Sí, dividimos por la norma de Aia. No lo he comentado, pero quizá te interese saber que en dimensión finita todas las normas son equivalentes, y que quizá para aliviar el esfuerzo computacional quieras usar una norma más sencilla, como la norma del máximo o la de Jacobi (que vendría a ser la euclídea pero sobre todas las entradas de la matriz).

    ¿Qué diferencias se pueden esperar en las medidas comparando este método con el pseudocodigo? ¿Se mantendrán en el mismo orden de magnitud? Voy a hacer la prueba igualmente, pero por conocer el fundamento.
    No estoy seguto de entender la pregunta, pero si con seudocódigo te refieres a la convergencia y el error teóricos, dependerá un poco de los errores de entradas de datos. Igual, la teoría dice que los métodos "convergen", es decir, que tras hacer muchas iteraciones, se llega tan cerca como uno quiera del resultado real. Así, tal y como yo lo entiendo, tú decides de entrada la precisión que necesitas, calculas cuantas iteraciones harían falta para alcanzarla y decides si te conviene hacerlas o no.


    ¿En este caso no estaríamos normalizando con respecto a Aia algunas veces y a Aib otras. Ciertamente está bien porque así obtendremos los resultados más pequeños (al dividir entre el más grande), y se introduce menos ruido que dejando simplemente el error absoluto
    Sí, y repito que no me parece un problema porque todo lo que podemos obtener es una cota del error. Sin embargo, está lo que dice Hijitus sobre que habrá casos en los que te salga 1. Esto es así porque el error relativo no está bien definido si la medida real es cero y en este caso nos dará lo máximo que puede dar un error (con sentido), que es un error del 100%.

    Me gusta muy mucho la última propuesta, muy limpia y directa. Pero creo que ya no estoy en condiciones de procesar. Mañana más
    Yo creo que es la menos problemática, sí.
    opositivo ha agradecido este mensaje.
    I allò que val és la consciència de no ser res si no s'és poble. De no ser res si no s'és lliure.
    Vicent Andrés Estellés.


  14. #13
    Avatar de opositivo Mega Usuari@
    Registrad@ el
    03/02/2008
    Sexo
    Chico
    Mensajes
    8.696
    Agradecido
    705 veces
    Temas
    428
    Hijitus escribió: Ver mensaje
    El único problema que le veo (soy un tocapelotas xD) es que es mucho cálculo. Si lo quieres para ver qué método de calcular la inversa es mejor, me parece la mejor alternativa, si estás en medio de un programa y forma parte de una operación más compleja, me tiraría por algo menos exacto y más accesible.
    Aunque no lo he dicho explícitamente, el "programa" (en este caso, circuito digital de aplicación específica) "machaca" SVDs a -esperemos- 50 matrices "grandes" (200x80) por segundo. Cuando está en funcionamiento no nos interesa calcular los errores, ya que requereriría más esfuerzo computacional la comprobación que efectuar la operación. En contextos heurísticos no importa no alcanzar la solución exacta porque en la siguiente iteración se reducirá el error.

    Pero -siempre hay un pero- para ajustar la heurística (léase el factor de aprendizaje) es importante conocer la sensibilidad de la solución. Para ello, estoy escribiendo una especie de Toolbox para analizar matrices de entrenamiento y estudiar sus características para estimar los rangos de error en las soluciones (dependiendo de diferentes umbrales de convergencia).

    Por lo tanto, es importante porque se reduce el tiempo de simulación y caracterización, pero no es crítico porque se realiza offline.

    Jaimériste Galois escribió: Ver mensaje
    Sea como fuere, para calcular inversas de matrices, especialmente si son matrices escasas, Gauss-Seidel es tu amigo. Si quieres ponerte exquisito, sobrerrelajación, pero el esfuerzo de programación no compensa la ganancia en eficiencia respecto de G-S.
    Sinceramente, no me veo capacitado para explicar el por qué del SVD por one-sided Jacobi, ya que de la selección y optimización algorítmica se encarga un compañero y a mí me corresponde su implementación en una arquitectura hardware paralela. Pero he encontrado un par de referencias que trazan el camino. El primero desde Gauss hasta QR, y el segundo introduce los métodos Jacobi por sus posibilidades de paralelización:

    http://www-old.math.gatech.edu/acade...notes/6num.pdf
    http://www.stanford.edu/class/cme335/lecture7.pdf

    Jaimériste Galois escribió: Ver mensaje
    Sí, y repito que no me parece un problema porque todo lo que podemos obtener es una cota del error. Sin embargo, está lo que dice Hijitus sobre que habrá casos en los que te salga 1. Esto es así porque el error relativo no está bien definido si la medida real es cero y en este caso nos dará lo máximo que puede dar un error (con sentido), que es un error del 100%.
    Me parece razonable, y entiendo que lo feo es que el error relativo no está bien definido. Supongo que necesitaba verlo así escrito para entender que la única forma de hacerlo por elementos es trampeando. Mi preferencia era usar l-1 sobre la matriz de diferencias, pero ante la insistencia me quedaba la duda de si realmente habría forma de hacerlo elemento por elemento.

    Jaimériste Galois escribió: Ver mensaje
    Sí, dividimos por la norma de Aia. No lo he comentado, pero quizá te interese saber que en dimensión finita todas las normas son equivalentes, y que quizá para aliviar el esfuerzo computacional quieras usar una norma más sencilla, como la norma del máximo o la de Jacobi (que vendría a ser la euclídea pero sobre todas las entradas de la matriz).
    Me he perdido . Cómo el análisis de los errores lo hago offline, utilizo directamente las funciones de MATLAB:

    http://www.mathworks.es/es/help/matlab/ref/norm.html

    norm(X,p)

    Norm type, specified as 2 (default), a positive integer scalar, Inf, -Inf, or 'fro'. Whether X is a matrix or vector determines the allowed values of p (and what they return). The following table lists the calculated values for each allowed value of p.

    Note: The table does not reflect the actual algorithms used in calculations.

    p
    1 max(sum(abs(X)))
    2 max(svd(X))
    'fro' sqrt(sum(diag(X'*X)))
    ¿Entiendo que es "la norma del máximo"?

    Jaimériste Galois escribió: Ver mensaje
    No estoy seguto de entender la pregunta, pero si con seudocódigo te refieres a la convergencia y el error teóricos, dependerá un poco de los errores de entradas de datos. Igual, la teoría dice que los métodos "convergen", es decir, que tras hacer muchas iteraciones, se llega tan cerca como uno quiera del resultado real. Así, tal y como yo lo entiendo, tú decides de entrada la precisión que necesitas, calculas cuantas iteraciones harían falta para alcanzarla y decides si te conviene hacerlas o no.
    En realidad toda la parafernalia esta es para decidir el umbral en función de la precisión que se quiera a la salida. Cuando preguntaba por el error me refería a cómo cambia el rango de resultados en función de cómo se calcule el error. Es decir:

    http://www.mathworks.es/es/help/imag...imabsdiff.html

    D = imabsdiff(B-A);
    Ew = D ./ max(B,A);
    Em = norm(D,1) / norm(A,1);

    ¿Qué diferencia se puede esperar en el rango de Ew y Em?

    Jaimériste Galois escribió: Ver mensaje
    Yo creo que es la menos problemática, sí.
    Es menos problemática al evitar la división. Sin embargo, dándole un par de vueltas más , al final estamos calculando || · ||_1, dejando a un lado hacerlo elemento por elemento. En este contexto, y teniendo en cuenta que siempre norm(A,1)/=0 y que estamos evaluando sistemas digitales con precisión finita, puede que no compense el coste extra en la simulación y sea más directo tirar por Em. Al fin y al cabo, en la práctica vamos a comparar alternativas a utilizar un PC o un microcontrolador, o entre diferentes umbrales.

    Aún así, me guardo la referencia de la identidad para mostrar el resultado final, una vez se haya hecho una estimación previa.

    Jaimériste Galois escribió: Ver mensaje
    Hombre, puede mejorarse tomando la norma ||·||2 que involucra a los vaps de la matriz. A priori parece peor, pero usando Gerschgorin con astucia pueden aproximarse usando solo los elementos de la diagonal de la matriz en lugar de toda entera. Si se hace bien, queda una aproximación muy decente del radio espectral, pero me temo que esto es meterse ya en maquinaria pesada conceptualmente hablando. No sé hasta dónde llega el control de Opo sobre estas cosas.
    Creo que esa norma es la que utilizamos para mostrar el error en el residuo (salvo que en MATLAB norm(A Aib - A Aia, 2) / norm(A Aia, 2) no haga eso).

    En cuanto a Gerschgorin, creo que es demasiado para mí. Como no es online, a priori no es necesario aproximar el cálculo. Y, ciertamente, no sé por dónde me da el aire.
    Follar contigo debe ser como leer poesía - Undefined speaker 08/09/09
    Zoaz Euskal Herrira, si es que existe. Euskadifrenia. - Zarama, Bermeo 18/04/09

  15. #14
    Avatar de opositivo Mega Usuari@
    Registrad@ el
    03/02/2008
    Sexo
    Chico
    Mensajes
    8.696
    Agradecido
    705 veces
    Temas
    428
    Finalmente, tras comentarlo con los compañeros, no utilizados la identidad porque al estar calculando pseudoinversas la solución siempre va a estar notablemente desplazada.

    En cualquier caso, estas aclaraciones han servido para decidirnos por la primera solución que dio Jaime: utilizar la norma l-1 directamente sobre la matriz de diferencias, y relativizar también mediante la norma de la matriz de referencia. Para el error en los eigen se sigue la misma lógica, pero con la l-inf. Y para el residuo l-2.

    Por otra parte, al obtener resultados he podido comprobar tu valoración sobre que las normas dan resultados en rangos parecidos.

    Por último, agradeceros a ambos la conversación y aportaciones. Un placer leeros.
    Última edición hecha por opositivo, 18/02/2014 a las 11:26.
    Jwym, Lord of Cinder ha agradecido este mensaje.

Permisos de tu Usuario

  • No puedes crear nuevos temas
  • No puedes publicar respuestas
  • No puedes adjuntar archivos
  • No puedes editar tus mensajes
  •  
  • El código BB está activado
  • Los emoticonos están activados
  • La etiqueta [IMG] está activado
  • La etiqueta [VIDEO] está activado
  • El código HTML está desactivado
  • Los Trackbacks están desactivados
  • Los Pingbacks están desactivados
  • Los Refbacks están activados
  • Temas similares

    1. Respuestas: 10
      Último mensaje: 05/06/2009, 1:08
    2. ¿Qué sientes por la música?
      Por Invitado en Música
      Respuestas: 23
      Último mensaje: 07/03/2004, 18:22
    3. [Presentación por todo lo alto]
      Por ¤ sileNciosaH ¤ en elKonsultorio Sentimental
      Respuestas: 20
      Último mensaje: 11/02/2004, 14:36
    4. Respuestas: 3
      Último mensaje: 09/02/2004, 21:25
    5. ¿Por qué salen algunos nicks en VERDE?
      Por aaangelaaa en Foro General
      Respuestas: 9
      Último mensaje: 22/01/2004, 15:05