4 votos

Encontrar la matriz diagonal más adecuada para minimizar el error

Quiero que un conjunto de valores de entrada sea lo más parecido posible a los valores de salida. Tengo una matriz de entrada X (m*n) que tiene m puntos de datos y n dimensiones para cada punto de datos. También tengo una matriz de salida Y (m*n) que tiene m puntos de datos y n dimensiones.

Quiero resolver la ecuación X A + e = Y donde A es una matriz diagonal (n n) y e es el error. Quiero encontrar la matriz diagonal A que minimizaría e. La matriz diagonal A me daría esencialmente un valor para cada dimensión que acercaría mi X a Y. Esperaría que A minimizara la suma de cuadrados entre cada punto de datos.

La restricción adicional es que la matriz diagonal debe tener valores entre 0 y 1.

Cualquier ayuda es muy apreciada. Cualquier enfoque alternativo para encontrar un valor para cada dimensión que acerque X a Y es apreciado.

0 votos

@Firebug. Gracias. He editado la pregunta para añadir la restricción de que los valores de la matriz diagonal deben estar entre 0 y 1. ¿Podrías decirme cuál es el planteamiento \solution para la matriz diagonal sería?

5voto

jldugger Puntos 7490

Que las columnas de $X$ sea $X_1,X_2,\ldots, X_n$ las entradas correspondientes de $A$ sea $a_1, a_2, \ldots, a_n$ las columnas de $Y$ sea $Y_1, Y_2, \ldots, Y_n$ y las columnas de error son $e_1, e_2, \ldots, e_n$ .

Observe que

$$e_i = Y_i - a_i X_i.$$

Cada parámetro $a_i$ sólo interviene en una de estas expresiones. Por lo tanto, la suma de los cuadrados de las $e_i$ igual a $\sum_{i=1}^n |e_i|^2$ puede minimizarse hallando por separado y de forma independiente $a_i$ que minimicen las normas al cuadrado $|e_i|^2 = e_i^\prime e_i$ . Es un conjunto de $n$ problemas de regresión (univariante) a través del origen. Sin restricciones en el $a_i$ las soluciones serían

$$\hat a_i = \frac{Y_i^\prime X_i}{X_i^\prime X_i}.$$

Si alguno de los $\hat a_i$ queda fuera del intervalo de restricción $[0,1]$ la convexidad de la función objetivo demuestra que sólo es necesario examinar sus valores en la frontera $\partial[0,1]=\{0,1\}$ . Un planteamiento sencillo es una búsqueda exhaustiva de ambos puntos: es decir, comparar los valores de $|Y_i - X_i|^2$ y $|Y_i|^2$ , eligiendo $\hat a_i = 1$ cuando el primero es más pequeño y $\hat a_i=0$ de lo contrario.


He aquí dos ejemplos con $m=100$ filas y $n=5$ columnas. Se generaron creando el $X$ y $A$ matrices al azar y añadiéndoles errores aleatorios para obtener $Y$ . Siempre que las entradas en $A$ se encuentran en el intervalo $[0,1]$ los valores estimados deberían aproximarse a los originales (dependiendo de la magnitud de los errores aleatorios). El gráfico de la izquierda de cada ejemplo es un gráfico de puntos de la estimación $\hat a_i$ y el valor original del parámetro $a_i$ lo que permite comparar visualmente las estimaciones con los parámetros. El gráfico de la derecha de cada ejemplo es un diagrama de dispersión de los residuos de este ajuste (los $\hat e_i$ ) frente a los errores originales. Cuando no se aplican las restricciones (como en la fila inferior), este diagrama de dispersión debería estar muy centrado en la línea de igualdad. Cuando se aplican restricciones (fila superior), habrá más dispersión (aportada por las columnas correspondientes).

Figure


En R para producir esta figura le permitirá experimentar con valores arbitrarios de $m$ y $n$ . La estimación de $A$ consta de cuatro líneas exactamente paralelas al análisis: cálculo del coeficiente de regresión, de los dos valores en la frontera y las comparaciones necesarias para seleccionar el mejor. Es rápido y paralelizable: aparte del paso de trazado, se ejecutará en segundos incluso cuando $n$ es de millones ( $10^6$ ).

m <- 100
n <- 5
par(mfrow=c(2,2))

for (i in c(23, 19)) {
  #
  # Generate data.
  #
  set.seed(i)
  x <- matrix(rnorm(m*n), m)
  alpha <- rnorm(n, 1/2, 1/2)
  eps <- matrix(rnorm(m*n, 0, 1/4), m)
  y <- t(t(x) * alpha) + eps
  #
  # Compute A.
  #
  a <- colSums(x*y) / colSums(x*x)
  a.0 <- colSums(y*y)
  a.1 <- colSums((y-x)*(y-x))
  a <- ifelse(0 <= a & a <= 1, a, ifelse(a.0 <= a.1, 0, 1))
  #
  # Plot results.
  #
  e <- y - x %*% diag(a)
  u <- rbind(Parameter=alpha, Estimate=a)
  dotchart(u, col=ifelse(abs(u-1/2)>1/2, "Red", "Blue"), cex=0.6, pch=20, 
           xlab="Parameter value")
  plot(as.vector(eps), as.vector(e), asp=1, col="#00000040", 
       xlab="Error", ylab="Residual")
}

4voto

Mark L. Stone Puntos 2037

Aquí hay una forma más automatizada de resolver todo a la vez que la proporcionada por @whuber. Pero estoy de acuerdo con todos sus puntos de vista, y su enfoque podría ser utilizado en su lugar. Esta forma de hacer las cosas esencialmente pilas de varios independientes (es decir, separables) problemas en uno, y maneja automáticamente las restricciones límite.

Me gustaría resolver el siguiente problema:

Minimizar la norma de Frobenius de $Y-XA$ sujeto a la restricción de que A sea diagonal, con entradas en el rango de $0$ a $1$ .

La norma de Frobenius al cuadrado es la suma de las entradas al cuadrado de la matriz $Y-AX$ . También podemos minimizar la norma de Frobenius, debido a que la raíz cuadrada es estrictamente creciente monotónicamente, produciendo así la misma solución óptima A.

Este es el aspecto que tendría en CVX bajo MATLAB. Esto encontrará la solución globalmente óptima al problema que he especificado. Usted podría hacer algo similar en otro entorno informático.

Inventemos algunos datos de problemas de muestra:

AA = diag([0.2 0.9 0.8])
% Randomly generate some 5 by 3 X as matrix of independent N(0,1)
X = rand(5,3);
% Generate a sample Y, by adding matrix of Normal error with standard deviation 0.1
Y = X * AA + 0.1 * randn(5,3);

% Ahora aquí está el código para resolverlo

cvx_begin
variable A(3,3) diagonal
minimize(norm(Y-X*A,'fro'))
0 <= diag(A) <= 1
cvx_end

He aquí la solución:

0.2637         0         0
     0    0.8482         0
     0         0    0.7914

Ahora utiliza AA = diag([0,2 0,9 1,1]), por lo que la solución "verdadera" violaría los límites. Reutilizaré los mismos dibujos de error que antes, y generaré la nueva Y correspondiente a este nuevo AA. La solución esta vez es

0.2637         0         0
     0    0.8482         0
     0         0    1.0000

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X