Nube de Etiquetas
(Ah?)

lunes, febrero 11, 2008

¿Regresión usando Programación Lineal?

Alfredo me comentaba que había leído varios tópicos de Investigación de Operaciones, pero que ninguno de los tópicos era Data-Mining, por ejemplo, o métodos Multi-Superficie. En mi respuesta le insinué que ciertamente no son tópicos de la IO, pero no por ello es imposible que si se idea una formulación adecuada del modelo, la IO pueda aportar en campos que en principio se asumen como "diferentes".

En un post anterior escribí sobre la diferencia entre Regresión y Clasificación. Para la mayoría de los que han tenido contacto con cursos introductorios de IO, estará claro que no son parte del temario de IO.

Todo esto me inclinó a escribir hoy acerca de una aplicación de IO para Regresión. Ya a muchos les quedó claro que me he ocupado bastante del uso de la IO para clasificar, y bueno, la Regresión quedó huerfanita, al parecer... ;o)

Antes que todo, quiero dejar claro que el modelo más famoso en la actualidad, para realizar clasificación binaria (los SVM) también es utilizado para regresión. Con esto quiero decir, que lo que voy a desarrollar acá no es la invención de la rueda.
Es un simple ejemplo ilustrativo, que me permitirá (espero yo!) mostrar una regresión mediate IO, sin entrar en detalles sobre los SVMs (vale la pena acotar que fue parte de los ejercicios de un curso de Análisis de Sistemas Lineales del Prof. Ubaldo García Palomares de la USB).

El ejemplo es el siguiente:

Se tienen 4 puntos en el plano cartesiano...
e1 = (0.1 , 1.0)
e2 = (0.8 , 2.2)
e3 = (2.2 , 2.8)
e4 = (3.3 , 3.9)

Que lucen más o menos así, al graficarlos en Excel (disculpen la cuña!):


Bueno. Se nos pide que, sin usar mínimos cuadrados, aproximemos una recta

y = a*x + b

que pase lo más cerca posible a todos esos puntos.

Yo voy a resolver el problema formulando un modelo de programación lineal... primero, tengo como información que la función a aproximar es una línea recta. Si me disculpan una notación extremadamente simple, diré que cuando tenga un i-ésimo punto ei, con componentes (xi , yi), tendré un error dado por la resta

[ yi - yi~ ]

donde yi~ es el estimado que me arroja la función de la recta, es decir:

yi~ = a*xi + b.

En mínimos cuadrados, se quiere hacer pequeña la suma de los errores cuadráticos:

[ yi - yi~ ]^2

Bueno, como me pidieron que no fuese una minimización de los errores cuadráticos, me quedaré con la expresión [ yi - yi~ ].

Ahora, ese error me va a dar positivo cuando el estimado sea menor que el valor real, y negativo cuando pase lo contrario... y si sumo los errores así, podrían cancelarse positivos con negativos, dando una suma que realmente no significará nada para mi.

Así que voy a hacer pequeña, en cambio, a la suma de los errores absolutos:

| yi - yi~ |

Ahora, recordemos de bachillerato que la función "valor absoluto" ( y=|x| ) no es lineal, así que... evidentemente no puedo resolverlo con Programación Lineal....

... O SI!!!

Yo puedo respirar profundo, abrir y cerrar los ojos, y escribir lo mismo, de forma un poquito diferente. Puedo tranquilamente decir que yi~ es igual a yi, más una variable "di" que mide el i-ésimo error de forma no-absoluta, así:

di = yi - yi~

yi~ + di = yi

Ahora, todavía la suma de los errores "di" me deja en las mismas, porque podría tener positivos y negativos (con toda seguridad!). No he hecho nada interesante aún. Sin embargo, ahora si respiro profundo y me aseguro de que mi lapiz tiene punta, porque voy a jugar con ese error "di". Quiero jugar de forma que tenga sólo variables no-negativas, que crezcan cuando hay error. Por ello, voy hacer lo primero que se me ocurre: expresarlo como una resta de dos valores positivos.

NOTA: cualquier número puede expresarse como
la diferencia
de dos valores no-negativos. Ejemplo:
1 = 34-33
-8 = 10 - 18

Por lo tanto, "nadie me quita lo bailao" si yo decido escribir ahora la diferencia así:

yi~ + (dip - din) = yi

donde dip, vale di, si el error es positivo... (y din = 0)
y din, vale -di, si éste es negativo... (y dip = 0)

Digamos, para mostrarlo fácilmente, que si yi = 2, y el estimado yi~ = 3, entonces tendremos:
3 + 0 - 1 = 2

en otras palabras, dip = 0, y din = 1.

Por lo que din estaría sumando 1 a mi total de errores, en lugar de un -1 (aunque el error que he definido es negativo, porque el verdadero valor es más pequeño que el estimado).

Ahora tengo lo siguiente, si lo aplicamos a los 4 puntos:

y1~ + d1p - d1n = y1
y2~ + d2p - d2n = y2
y3~ + d3p - d3n = y3
y4~ + d4p - d4n = y4

con d1p, d2p, d3p, d4p, d1n, d2n, d3n, d4n todos >= 0.

Esas serían las restricciones de mi modelo, que si sustituímos los estimados por la expresión que proporciona el estimado en base a el xi (componente x del i-ésimo punto) en cada caso, sería lo mismo que:

(a*x1 + b) + d1p - d1n = y1
(a*x2 + b) + d2p - d2n = y2
(a*x3 + b) + d3p - d3n = y3
(a*x4 + b) + d4p - d4n = y4
d1p, d2p, d3p, d4p, d1n, d2n, d3n, d4n >= 0

Nótese que he colocado las variables en color azul. Lo que esté en negro es "dato".

Ahora, me podría asustar y gritar: ¡ahora tengo 2 veces más incógnitas que antes! ... pero en este tipo de cosas lo que se nos pide es que tengamos la valentía de seguir adelante a ver a donde se llega, hasta que se llegue,... a la solución...

...o a una calle ciega... lo cual es siempre una posibilidad que no tiene por qué desanimarnos si no estamos en un exámen.. jeje.

Así que tomamos un poco de chocolate caliente para el alma, y nos preguntamos: ¿qué es lo que quiero hacer pequeño? Respuesta: la suma de los errores dip y din.

Es decir, que mi función objetivo es la suma de los errores positivos y negativos:

Minimizar Z = (d1p + d2p + d3p + d4p) + (d1n + d2n + d3n + d4n)

Esto hará, que en la resolución el algoritmo utilizado quiera hacer que todas las variables dip y din tengan el menor valor posible: cero (0), colocando la recta justo para que pase por los puntos.... en tus sueños!! jaja...

Como lo más probable es que no lo logre, tendrá que sacrificar alguna de las variables dejándola que sea mayor que cero. Pero en ningún momento hará que una que no sea necesaria, sea mayor que cero. El modelo entonces queda formulado completo así:

Minimizar Z = (d1p + d2p + d3p + d4p) + (d1n + d2n + d3n + d4n)
din, dip, a, b

Sujeto a:
(a*x1 + b) + d1p - d1n = y1
(a*x2 + b) + d2p - d2n = y2

(a*x3 + b) + d3p - d3n = y3

(a*x4 + b) + d4p - d4n = y4
d1p, d2p, d3p, d4p, d1n, d2n, d3n, d4n >= 0

Abajo tengo una imágen donde muestro en excel como saqué las cuentas en la hoja de cálculo, para la función objetivo y los valores que necesito para las restricciones. Lo amarillo es celda que representa a una variable, y lo azul son celdas que cambian en función de las variables (diferente a como coloreé las cosas en el texto). Guardé ese pantallazo mostrando en particular la fórmula con que estoy calculando el y~.


Ya es el momento de llamar a la máquina que me dirá cuáles son los valores óptimos de "a" y "b" de la recta, es decir, aquellos que podrán existir haciendo la suma de los errores lo más pequeña posible. La forma en que llené los datos en el Solver, la muestro abajo. Dense cuenta de que hice que los dip y din fuesen no-negativos, pero no restringí en absoluto a las variables "a" y "b":

(Las dudas sobre lo que significa lo que se ve arriba las podemos aclarar luego en la medida en que me pregunten, si lo desean)

Finalmente, y para no seguir alargando el post, veamos el resultado que arroja el Solver, así como una graficación de la recta que resulta:


¿No está mal, eh? Bueno. Aquí termina el ejemplo de hoy.

Traté de hacer esto de forma que todos pudiesen replicar el resultado fácilmente. Espero haberlo logrado. ¡Cualquier cosa, como siempre: pregunten!

Así pues, tenemos una regresión, no basada en minimización de errores cuadrados, sino obtenida mediante la resolución de la clase de modelo más emblemático de la IO: la Programación Lineal.

¿Es la Regresión Lineal un problema de IO? Probablemente no... pero no significa que pueda usarla para resolver el problema. ¡Ese es el espíritu!

Nota: para los recién iniciados en esto, que estén curiosos y quieran ver más allá de lo evidente, les adelanto que este tipo de regresión tiene cierto tipo de ventajas respecto a la regresión cuadrática bajo ciertas circunstancias. Se llama minimización en "norma - 1", mientras que en la de mínimos cuadrados se minimiza la "norma - 2"....

...pero eso es parte de otra historia

XoD

sábado, febrero 09, 2008

Respuestas para Alfredo

Primero que todo, Alfredo, gracias por tomar la confianza de escribirme, me gusta ayudar (es una de las principales razones por las cuales escribo el blog... porque yo quisiera haber podido leer algo como esto cuando me iniciaba en el área). Como tus preguntas no son de las que uno quisiera responder con monosílabos, te respondo en un post.

Sabes? No se necesita ser una lumbrera para meterse en esto. Sólo se necesita hacer lo que estás haciendo: dedicarle... y algo que te ayudará a hacerlo, es tener gusto por esto. Al poco tiempo tendrás que explicarle a los demás que tu no eres una lumbrera (si ellos hubiesen pasado el mismo tiempo que tu, dedicándole a esto, no les parecería tan genial lo que tu puedes hacer con estas herramientas). Yo tampoco soy una lumbrera, by the way... jeje.

En cuanto a tus preguntas a mi "como analista de operaciones", tengo que decirte varias cosas:
No he tenido trabajo en la empresa privada como "analista de operaciones". Y con esto me refiero a que no he tenido un trabajo en el que haya podido utilizar la investigación de operaciones (hasta ahora).
  1. El trabajo de una persona que tiene experticia en investigación de operaciones puede ser (en el mundo empresarial/industrial) uno de planificación, por ejemplo, o el de consultor. El resto de los trabajos que he podido ver, puede que requieran puntualmente el uso de investigación de operaciones, pero una vez encontrado el modelo, e implementado, correrlo periódicamente no es un trabajo interesante para una persona con el perfil de IO.
  2. En el mundo académico, es obvio que el trabajo para una persona del área de IO es dar clases, y buscar ampliar los horizontes de la IO mediante la investigación, que además te pone en contacto con lo que otros locos están haciendo respecto a eso en otras partes del mundo.
  3. Recientemente un Gran Amigo de la infancia me propuso trabajar juntos como consultores. Mi actividad cotidiana en ese aspecto estaría formada por actividades de este tipo:
    • reunirme con el cliente para entender su problema
    • definir un modelo (esto es un proceso que es arte y ciencia)
    • definir cómo voy a recoger los datos que necesito y negociar con el cliente cómo vamos a recogerlos.
    • definir qué infraestructura informática necesito para resolver el modelo y negociarlo con el cliente.
    • intentar explicar al cliente en forma sencilla qué es lo que estoy haciendo.
    • fumarme una lumpia para resolver el modelo que planteé.
    • ver los resultados, y traducir eso en algo que pueda digerir el cliente.
    • antes que todo, demostrar al cliente qué beneficios le puede traer contratarte para que apliques IO
    • Eh... creo que esa es una lista que podría darte una idea de la no-cotidianidad del asunto.
  4. En cuanto a que si la IO es tan tomada en serio en Venezuela como lo podría ser en EEUU, te puedo decir, sin que me quede nada por dentro, que la respuesta es: NO. Lo más frecuente es que las respuestas en Venezuela las de alguien con experiencia (al menos aparente) o el viento que pegue en el dedo luego de ser correctamente ensalibado (yuck!). Esto no siempre es criticable, puesto que los "sistemas" que uno analiza en países como el nuestro no siempre son del todo estables, predecibles y bonitos, sino que la alta sensibilidad a miles de variables ... todas en comportamiento caótico... hacen que estas técnicas ameriten una gran inversión, o tengan poca probabilidad de ser efectivas. Eso no significa que haya puestos en las empresas del área de petróleo, comunicaciones, construcción, e industrias manufactureras y de producción "contínua" que denigren de estas técnicas. Simplemente que son pocos los sitios donde lo hacen. Tengo entendido que en "la anterior PDVSA" (dejémoslo así para no entrar en el tema político) había un departamento de gente de IO dedicada específicamente a mejorar los procesos e la empresa mediante estas técnicas. Hay empresas consultoras que valoran MUCHO que una persona tenga formación en IO, aunque no lo usen nunca en el puesto que le van a dar, tan sólo por "el tipo de pensamiento" que tenemos. Con esto termino en lo referente a las posibilidades de trabajo.
La pregunta sobre la "buena paga", no puedo respondértela con propiedad, porque tengo noticias de personas a las que les pagan bien poco, y otras que ganan una millonada. Los sueldos en PDVSA no estaban para nada mal, en "épocas anteriores", por ejemplo. Ahora, consultoras hay de muchas clases, unas que pagan mucho y luego, al finalizar un contrato te botan. Otras te pagan mucho menos, pero no te echan a la calle. Creo que lo importante es saber venderte.

No hay una "moda" como la que hay por la gente que tiene academia SAP, por ejemplo, que siempre son bien pagados, si es lo que querías saber. Espero esto te responda un poco tus inquietudes.

Me preguntas ¿Hacia donde se dirige la IO?... y me pones en problemas. La IO es un campo MUY amplio. No sólo en cuanto al tipo de técnicas que hay, sino a las aplicaciones, y al enfoque que tienen las personas. Por ejemplo, hay gente que se ocupa de la Programación Lineal, desde un punto de vista estrictamente matemático, generando nuevas aproximaciones a la resolución del problema. Otros se paran desde el punto de vista computacional, viendo como resuelven los obstáculos que pueden presentarse al sacar las cuentas con una computadora. Y hay otros, como yo, que nos ocupamos de usar el ingenio en resolver problemas nuevos con técnicas viejas, mediante innovación en la formulación. Aunque pensaba que esa era la última de mi enumeración, creo que también hay gente que se ocupa de mezclar las técnicas de IO con otras técnicas: estadística, lógica difusa, redes neurales, etc.

Cada uno de estos miembros de esta fauna de la IO, a su vez, tienen campos muy específicos en los que investigan, y todos los meses puedes ver en las revistas arbitradas que hay en el mundo, publicaciones de cosas nuevas. La pregunta, Alfredo, para respondértela más certeramente, tendrías que hacérmela restringida a un tipo de fauna de IO, y además restringida a un tipo de problema... vale? y disculpa esa!

Creo que es obvio que mi opinión es que hay MUCHO campo para investigar. No en vano hay revistas arbitradas dedicadas exclusivamente al área de IO.

Sin embargo quiero dejar en claro algo: los temas en los que se inicia el estudio de la IO son la Programación Lineal, la Teoría de Colas, el Pert-CPM, los modelos de Optmización en Redes, la Simulación de Eventos Discretos y la Programación Lineal Entera... eso es cierto...
Pero esos temas son las herramientas básicas.

Ahora, el Data-Mining, por ejemplo, no es en si mismo un tema típico de IO. Los modelos de IO que se han aplicado para hacer Data-Mining son eso mismo: algoritmos de un área, utilizados para resolver un problema de otra área (lo cual nos lleva a ver que las áreas están entrelazadas).

Por ejemplo, un problema de SVM (Support Vector Machine) ciertamente es un modelo de Programación Matemática (y por ende IO), pero no todo modelo de IO puede ser aplicado para el reconocimiento de patrones. Normalmente los modelos de Programación Matemática usualmente dan un resultado válido estrictamente para los parámetros que se utilizan al momento de resovlerlo,... y puedes mantener "la solución" sólo si cambian esos parámetros dentro de los rangos que de da el análisis de sensibilidad. Una vez cambian demasiado los parámetros, la solución es otra. Por lo tanto, en principio, no son buenos para "generalizar". En particular los modelos como el SVM y los utilizados en Métodos Multi-Superficie están construídos con la intención de obtener una buena capacidad de generalización, y los parámetros que reciben al formularlos, SON los elementos sobre los cuales se va a generalizar. Sólo por ello sirven para "simular" aprendizaje. ¡Así que OJO con eso Alfredo! Lo que si puedo permitirme decirte es que esto demuestra que la IO no tiene por qué restringirse a los temas y problemas clásicos.

La imaginación es el límite... dice el cliché por ahí... jeje... aunque yo también diría que ese límite a veces se hace más pequeño debido a las restricciones en capacidad de cómputo que tendremos siempre, obligándonos a simplificar nuestros modelos para poder tener una respuesta en un tiempo razonable.

¡Espero te sientas respondido!

Regresando a la Web

8 días sin internet... no fue algo que me enloqueciera, pero definitivamente la piquiña en los dedos (por escribir) y en los ojos (por leer) era innegable.
Eso si: nunca imaginé que este blog (con pocos posts, y de temática no muy "comercial") iba a tener la cantidad de visitas que tuvo, ni los comentarios que hoy veo que han dejado en este tiempo.
A quienes esperaban el próximo post, o una respuesta a los comentarios, les pido disculpas por hacerles esperar. Sin embargo, créanme: fue por una buena razón.
Mi papá, desde el 1º de Febrero lo ingresamos por emergencia a una clínica, y estuvo hospitalizado hasta ayer, y en esta ocasión el único que podía quedarse allí con él a cuidar de él, era yo. Pero ya todo volvió a la normalidad.
Bueno, dicho esto, no me queda otra cosa que darles las gracias por la recepitividad con que han acogido este blog... y por supuesto ponerme a responder los comentarios ASAP. :o)
Como le digo a mis compañeros de juegos de rol cuando falto a una sesión (virtual o no), "la realidad se me atravesó". Pero ya tengo licencia para seguir soñando despierto nuevamente, y compartirlo con Uds.
See you in the mirror!

viernes, febrero 01, 2008

Regresión vs. Clasificación

Regresión, en el contexto de la estadística y el modelaje matemático, es algo claramente distinto a autoespiarse en una etapa infantil o una vida pasada. Y ciertamente cuando uno hace una regresión típica (digamos, por ejemplo, mínimos cuadrados), uno ciertamente no siente que está regresando en ningún sentido.
El orígen del término data del siglo XIX, cuando fue utilizado en el contexto del análisis de un proceso biológico. Éste proceso tenía que ver con el hecho de que los descendientes de individuos excepcionales, tienden a ser más normalitos que sus excepcionales ancestros. Charles Darwin tenía un primo de apellido Galton (si no me equivoco) que llamó a este proceso "regresión". Este caso fue estudiado luego desde el punto de vista estadístico, y al final se terminó llamando "Regresión" a las técnicas en las que uno examina como se reacciona una variable de respuesta (variable dependiente) en función de una variable explicativa (variable independiente).
Este tipo de procesos de análisis no requieren entender los procesos detrás de la generación de los datos estudiados. Las premisas que se toman, en todo caso, son sólo de tipo estadístico (como por ejemplo que los errores respecto a la curva que "modela" el sistema están distribuídos según la campana de Gauss).
La regresión se usa para realizar pronósticos, probar hipótesis, estimar parámetros, entre otras cosas. He escuchado varias opiniones acerca de estos métodos, y no les quito razón, cuando dicen que debido a que "cualquiera hace una regresión, pero sólo expertos pueden criticarlas", uno encuentra que muchísima gente hace una regresión simplemente por hacerla.
Los que no conocen de estadística o modelos matemáticos ven unas "cuentas" y una curva, y realmente no tienen el tiempo de comprobar que todo lo que se hizo está bien, pero ya la exposición del analista de la regresión queda enmarcada en una supuesta formalidad.
A esto se refiere el dicho de que "la mayoría de las personas usan la estadística de la misma forma que los borrachos usan los postes de luz, para apoyarse, pero no para buscar iluminación".
Al final, simplemente una regresión es una forma de aproximar una expresión matemática para que se comporte de forma similar a un conjunto de datos que uno ha recogido. Por ejemplo: quiero saber cómo varía la presión atmosférica según se sube por una montaña, y hago mi escalada para la montaña, parándome 4 veces en mi camino para sacar mi barómetro y ver cuánto marca, y en el mapa me dicen a que altura está el parador turístico en el que me detuve a hacer la medición, por lo que en mis notas pongo los dos datos juntos.
Al final tengo 4 pares de datos (altitud, presión), y en la próxima tarde lluviosa me pongo a sacar cuentas, para ver qué función matemática pasa por esos puntos de la mejor forma. Cuando la tenga lista, asumiré que cada vez que me digan la altura, podré estimar la presión, y viceversa. Perfecto. Si no tuviese esa técnica (ni conocimientos teóricos sobre termodinámica y fluídos), sólo podría responder a esas preguntas específicamente para los puntos que ya medí. Ahora puedo responderlo para cualquier punto intermedio aunque no me haya parado a medir.
¿Y para donde voy con todo esto? Bien. Ahora que está claro para todos lo que es una regresión, puedo pasar a relacionar el concepto con el de clasificación, que lo hablé en un post anterior.
Resulta que construír un modelo de clasificación es conceptualmente muy similar a construír un modelo de regresión, sólo que la respuesta que se me pide que de, no es un número cualquiera, sino una categoría.
Es algo así como que me pidan que elabore un modelo para saber cuando un lugar es de presión alta y cuando es de presión baja. Me voy de paseo, y en el camino voy preguntando a las personas: "¡Señor! ¿acá la presión es alta o baja?". Voy anotando los valores de altitud, junto a la respuesta del paisano de ese lugar en mi cuadernito. Luego tengo que sentarme en mi casa y ver para cada altura qué me respondieron. El modelo podría ser algo así como "Si la altura es mayor que X, la gente en general piensa que la presión es alta". Ese es mi modelo de clasificación.
En el fondo es un modelo de Regresión, pero que la variable de respuesta (dependiente) no es contínua, sino categórica.
Bueno, a mi me pareció interesante cuando supe esto, y quería compartirlo con los que aún no han pasado a considerarlo trivial, jeje. Son los pequeños asombros que lo animan a uno a seguir investigando estas cosas. ¿No es verdad?