2011-11-18 12 views
6

Tengo dos variables independientes, GSH y Gls. Usando estas dos variables, estoy tratando de predecir un resultado, prob. Utilizando una función de la forma:cómo: solucionador fundación mínimos cuadrados cuadráticos

prob=a*Gls^2+b*GSH^2+c*Gls+d*GSH+e // (where a,b,c,d,e are coefficients) 

muestra de datos:

Gls(2.3 2.3 2.5 2.5 2.5 2.5 2.7 2.7 2.7 2.7 2.7 2.9 2.9 2.9 2.9 2.9 3.1 3.1 3.1 3.1 3.1 3.1 3.3 3.3 3.3 3.3 3.3 3.3 3.5 3.5 3.5 3.5 3.5) 

GSH(0.475 0.525 0.425 0.475 0.525 0.575 0.425 0.475 0.525 0.575 0.625 0.425 0.475 0.525 0.575 0.625 0.375 0.425 0.475 0.525 0.575 0.625 0.375 0.425 0.475 0.525 0.575 0.625 0.425 0.475 0.525 0.575 0.625) 

prob(0.263636 0.324159 0.319328 0.291295 0.286086 0.253994 0.233766 0.284644 0.273818 0.263743 0.175182 0.243986 0.284848 0.28066 0.247863 0.183468 0.181818 0.237288 0.269266 0.2555 0.240924 0.206081 0.209677 0.216949 0.263261 0.25966 0.23588 0.203252 0.239316 0.209184 0.234818 0.242424 0.192118) 

Me gustaría encontrar los mejores valores de los coeficientes de minimizar la suma de los mínimos cuadrados.

He leído mucho sobre el solucionador de cimientos, pero no he podido averiguar cómo solucionar este problema en la C# Solver Foundation. Todas las sugerencias de códigos son muy apreciadas.

Gracias

+0

hago esto bien: tienes f (gls, gsh) ~ = prob, y quieres optimizar los parámetros de la función del modelo? – Efrain

+0

Trabajar esto oh en un papel theoritac enorme puede dar un resultado exacto usando la diferenciación.Trate de convertir ese papel a una función – Dani

Respuesta

2

supongo que no es necesario fundación solucionador para eso. No es necesario en la optimización numérica, porque la solución (el vector de los coeficientes polinomiales que minimiza la suma de las distancias verticales al cuadrado entre las respuestas observadas en el conjunto de datos y las respuestas pronosticadas) existe en forma cerrada.

Ver wikipedia para más detalles.

+1

hola, esto es genial para resolver este problema (que ya he hecho usando esto, así que muchas gracias), sin embargo, también esperaba aprender a usar la base de resolución. – user1054524

0

Puede usar la base de solucionador. Su regresión ya es no lineal, y en realidad es generalized linear regression. En R, puede usar el paquete como glm para hacer la regresión.

En C#, no estoy seguro de si existe algún código fuente abierto. Pero de todos modos, usted mismo puede resolver la optimización y MSF tiene un solucionador no lineal. Así que acaba de escribir dos funciones:

  1. la función objetivo y

  2. su gradiente

Como un ejemplo rápido, se puede ver mi artículo:

Logistic Regression in F# using Microsoft Solver Foundation

Pero no necesita saber acerca de la regresión logística, en el artículo, también incluyo un ejemplo más simple que muestra cómo optimizar una función Rosenbrock de 2 variables.

MSF también tiene un lenguaje específico de dominio incorporado para C# utilizando su característica de conversión de lenguaje implícita. [Puede encontrar el ejemplo en los documentos de MSF.]

1

La siguiente solución es muy sencilla, simplemente tratando de encontrar el mínimo local utilizando el algoritmo que describe. Su uso consigo los siguientes valores

a = 0,02527237, b = 0,04768372, c = -0.001549721, d = 0,01382828, e = 0,002026558

con el cuadrado total de 0,2139592.

static void Main(string[] args) 
    { 
     var a = FindLocalMinimum(x => SumSq(x, 0, 0, 0, 0)); 
     var b = FindLocalMinimum(x => SumSq(a, x, 0, 0, 0)); 
     var c = FindLocalMinimum(x => SumSq(a, b, x, 0, 0)); 
     var d = FindLocalMinimum(x => SumSq(a, b, c, x, 0)); 
     var e = FindLocalMinimum(x => SumSq(a, b, c, d, x)); 
    } 

    private static float SumSq(float a, float b, float c, float d, float e) 
    { 
     var gls = new[] 
         { 
          2.3, 2.3, 2.5, 2.5, 2.5, 2.5, 2.7, 2.7, 2.7, 2.7, 2.7, 2.9, 2.9, 2.9, 2.9, 2.9, 3.1, 3.1, 3.1 
          , 3.1, 3.1, 3.1, 3.3, 3.3, 3.3, 3.3, 3.3, 3.3, 3.5, 3.5, 3.5, 3.5, 3.5 
         }; 

     var gsh = new[] 
         { 
          0.475, 0.525, 0.425, 0.475, 0.525, 0.575, 0.425, 0.475, 0.525, 0.575, 0.625, 0.425, 0.475, 
          0.525, 0.575, 0.625, 0.375, 0.425, 0.475, 0.525, 0.575, 0.625, 0.375, 0.425, 0.475, 0.525, 
          0.575, 0.625, 0.425, 0.475, 0.525, 0.575, 0.625 
         }; 

     var prob = new[] 
         { 
          0.263636, 0.324159, 0.319328, 0.291295, 0.286086, 0.253994, 0.233766, 0.284644, 0.273818, 
          0.263743, 0.175182, 0.243986, 0.284848, 0.28066, 0.247863, 0.183468, 0.181818, 0.237288, 
          0.269266, 0.2555, 0.240924, 0.206081, 0.209677, 0.216949, 0.263261, 0.25966, 0.23588, 
          0.203252, 0.239316, 0.209184, 0.234818, 0.242424, 0.192118 
         }; 

     var res = 0.0; 
     for (var i = 0; i < prob.Length; i++) 
     { 
      var p = a*Math.Pow(gls[i], 2) + a*Math.Pow(gsh[i], 2) + c*gls[i] + d*gsh[i] + e; 
      res += Math.Pow(p - prob[i], 2); 
     } 
     return (float)res; 
    } 

    private static float FindLocalMinimum(Func<float, float> f) 
    { 
     float bestV = float.MaxValue; 
     float bestX = 0; 
     float x = 0; 
     float lastV = bestV; 
     float diff = 1000.0f; 
     while (Math.Abs(diff) > 0.0001f) 
     { 
      float v = f(x); 
      if (v < bestV) 
      { 
       bestV = v; 
       bestX = x; 
      } 
      else if (v > lastV) 
      { 
       diff *= -0.5f; 
      } 
      lastV = v; 
      x += diff; 
     } 
     return bestX; 
    } 
+0

¡Buena respuesta! Encontré un pequeño error tipográfico (aquí corregido): var p = a * Math.Pow (gls [i], 2) + b * Math.Pow (gsh [i], 2) + c * gls [i] + d * gsh [i] + e; – Hannish

Cuestiones relacionadas