Lithographica

Un cuaderno más de Juan Antonio Fernández Madrigal

Las imágenes del ZX Spectrum

Julio25/2011

Pedazo de entrada retro-friqui que os espera ;)

De vez en cuando me da la nostalgia ochentera, habitualmente coincidiendo con la cercanía a las vacaciones de verano (no me preguntéis por qué), y con bastante probabilidad me da en lo relacionado con esa maravillosa máquina, el ZX Spectrum, con el que se nos descubrió un nuevo mundo a tantos niños y no tan niños de la época.

Normalmente la cosa se resuelve visitando una vez más WorldOfSpectrum, echando unas partidillas a mis adorados Xeno y Manic Miner, y pensando por enésima vez por qué aquel emulador de Spectrum que me hice en 1991 para un i286 no me dio por hacerlo diez años después, que seguro que podía haberlo terminado mejor (con mucha más documentación disponible de la que yo tuve); ahora podría estar incluido en la lista de emuladores.

En fin. Esta vez me ha dado la picá por otro lado. No sé cómo he acabado pensando que podría ser curiosón el poder convertir imágenes bitmap a la apariencia que tenían las imágenes en el ZX Spectrum, y, ya puestos, hacer un plug-in para el programa de diseño gráfico GIMP que haga esa transformación. Hay alguna utilidad por ahí relacionada con la conversión de imágenes del Spectrum, pero no algo como lo que propongo en forma de plug-in de GIMP. Así que, ni corto ni perezoso, me he puesto a la tarea :)

Las imágenes del ZX Spectrum en su modo gráfico original, es decir, sin usar hardware/software especial que consiguiera incrementar la resolución, eran bitmaps de 256×192 píxeles, con el píxel 0,0 en la esquina inferior izquierda si mal no recuerdo (estoy escribiendo de memoria). Estos píxeles no se podían poner a ningún color concreto, sólo a apagado (0) o encendido (1), lo que suponía 256×192/8=6144 bytes de información que estaban almacenados a partir de la dirección 16384 de la RAM, es decir, justo tras los primeros 16KB de la ROM del sistema.

El color era el verdadero meollo de la historia de los gráficos de Spectrum. La paleta del ZX (de la que ya hablamos por aquí) tenía 8 colores, algunos de los cuales se observan en la esquina inferior derecha de la carcasa de la foto de arriba. Si Sir Clive Sinclair hubiera querido que pudiéramos especificar uno de esos 8 colores por cada píxel del bitmap, a tres bits por píxel, hubiera gastado un total de 256x192x3/8=18432 bytes de memoria para la imagen de pantalla, en lugar de los 6144 del blanco y negro. Definitivamente, 18KB era algo prohibitivo para la época, especialmente teniendo en cuenta que la RAM del Spectrum era de 48KB: con esa capacidad gráfica sólo hubieran quedado 30KB para variables del sistema, programas del usuario y pila de la CPU. Pero mucho peor: hubiera habido bastantes problemas de rendimiento a la hora de que una CPU Z80A a 3.47MHz direccionara los píxeles y no digamos ya de que hiciera animación, por mucho que yo siga admirando a esa CPU.

La solución no pudo ser más ingeniosa, a la par que enrevesada a la hora de su uso posterior: dividamos los 256×192 píxeles en celdas de 64 píxeles cada una (de 8×8 píxeles, para ser exactos), y asignemos un byte extra a cada celda, llamado “atributo”, que indique el color que tienen los píxeles de esa celda que estén a 0 -píxeles de “papel”- y el que tienen los píxeles que estén a 1 -píxeles de “tinta”. Además, al dividir la imagen en celdas de 8×8 podemos montar un modo texto además del modo gráfico, con sus rutinas específicas: en cada celda se podrá dibujar un carácter, pudiendo tener en pantalla 24 líneas por 32 columnas de texto. Bondadoso que es el destino: si dedicamos 1 byte al atributo de cada celda, dado que especificar un color, ya sea el de tinta o el de papel, ocupa 3 bits, nos quedan todavía 2 bits libres para jugar. Uno de ellos se dedicó al “brillo”, y otro al “parpadeo”. El esquema final de un byte cualquiera de atributo quedó así:

Lo del brillo es otra genialidad: con ese bit a 1 cualquier atributo podía indicar que los colores de papel y tinta no vinieran de la paleta original, sino de otra que contenía los mismos colores pero con más brillo -excepto el negro, que era el mismo-, es decir, que con el bit de brillo prácticamente se duplicaban los colores disponibles en la pantalla, con la salvedad de que no se podía usar un color con brillo y otro sin brillo en la misma celda.

Lo del parpadeo tenía también su enjundia: con otro bit por celda se podía hacer que el color que en ésta estaba asignado a la tinta pasara a ser mostrado en los píxeles de papel, y viceversa, intermitentemente (con una frecuencia de 1Hz, si tampoco recuerdo mal), todo eso sin necesidad de que el programador cambiara nada en memoria, puesto que lo realizaba automáticamente la ULA (uncommitted logic array), la circuitería gráfica del Spectrum. Esto del parpadeo puede parecer una tontería de poca utilidad, pero imaginad qué pasa si relleno algunas celdas de la pantalla con todos sus píxeles en tinta, otras con todos sus píxeles en papel, y activo el parpadeo: puedo montarme un cartel -con poca resolución, eso sí- que va cambiando de apariencia intermitentemente, es decir, puedo tener dos imágenes que se turnan en pantalla alegremente.

Se puede ver precisamente este efecto del parpadeo a partir del segundo 10 del siguiente vídeo, grabado del juego ya mencionado Manic Miner. También se observa claramente el típico aspecto de los gráficos del ZX Spectrum. El pedazo de borde que rodea a la imagen de pantalla estaba en principio desperdiciado: sólo se podía poner a un color, aunque si variabas ese color lo suficientemente rápido, como por ejemplo hacía la ROM mientras cargaba un programa en memoria desde la cinta de cassette, podías conseguir efectos muy curiosos.

En resumen: tenemos 6144 bytes que guardan qué píxeles de la imagen son papel y cuáles son tinta, y además otros 768 bytes a continuación de éstos, correspondientes a las 768 celdas de 8×8 píxeles que hay en una imagen de 256×192 píxeles, los cuales definen los atributos de color. El total es 6912 bytes, casi 7KB, para toda la imagen (bueno, 3 bits más si contamos el color del borde ;P), lo cual es absolutamente óptimo en términos de tamaño en memoria, funcionalidad gráfica y potencia de procesamiento. El ZX Spectrum introdujo verdaderas genialidades para su época, y este modo gráfico, por muy ridículo que nos parezca hoy en día, fue una de ellas.

Respecto al plug-in de GIMP que he escrito para transformar el aspecto de cualquier bitmap al de una imagen del ZX Spectrum no hay tanto que contar… Es fácil hacer plug-ins para GIMP, especialmente sobre sistemas Linux (GIMP también tiene versiones para otros sistemas) y programando en C. Aquí hay un tutorial que demuestra lo sencilla de usar que es la API de GIMP: te da un entorno de ejecución bastante completo donde se puede acceder a la imagen en curso.

El plug-in requiere que la imagen original sea RGB (no lo he probado pero está supuestamente preparado para trabajar también con imágenes que tengan canal de transparencia). La resolución de ésta no importa, aunque para tener una experiencia cercana a la de un verdadero ZX Spectrum es interesante reducirla primero de tamaño, concretamente a 256 píxeles de ancho (el alto da bastante igual), antes de aplicar el filtro. El plug-in se instala a sí mismo en una nueva carpeta de filtros de GIMP llamada “ZX” y no requiere ningún parámetro antes de ejecutarse. Hace la conversión directamente sobre la imagen, y usa una paleta de colores que he comprobado que es bastante parecida a la original del ZX. Incluso lo he probado sobre capturas de pantalla de emuladores del Spectrum y he validado que no cambia su contenido.

El algoritmo tiene su intríngulis porque hay que tomar algunas decisiones a la hora de reducir la gama de colores de la imagen inicial. Para empezar, se trata cada celda de 8×8 de la imagen inicial por separado (pueden sobrar píxeles en los bordes si el tamaño de la imagen original no es múltiplo de 8; éstos se mostrarán en negro). Dentro de cada celda se calcula qué color de la paleta del ZX Spectrum es más cercano al color del píxel en la imagen original, usando para ello la distancia cartesiana en el espacio tridimensional de coordenadas RGB. Tras esa conversión de color se hace un histograma para ver qué color del Spectrum aparece más frecuentemente dentro de la celda, y también cuál es el segundo más frecuente. El primero será el de tinta y el segundo el de papel -esta elección es arbitraria. Todos los píxeles de la celda que no sean del color de tinta ni del de papel serán convertidos al color de esos dos que quede más cercano en el espacio RGB. Finalmente está la decisión sobre el brillo (el parpadeo no se trata). Si ambos colores de la celda tienen el mismo brillo no hay que hacer nada. Si no, hay que cambiar uno para que tenga el mismo brillo que el otro porque sólo está permitido tener los dos con brillo o los dos sin brillo. Si uno de ellos es negro se le cambia el brillo a ése para que coincida con el brillo del otro y ya está, ya que el negro con brillo es el mismo color que el negro sin brillo. Si no es el caso, se le cambia el brillo al color que sea menos frecuente en la celda, en nuestro caso al papel. Voilà :)

Obviamente, se puede enriquecer este algoritmo con muchísimas cosas, principalmente para tener en cuenta la imagen completa y no por celdas separadas, ya que esto podría mejorar mucho la apariencia final al tomar decisiones que dependieran de la distribución global de los colores. Esto lo dejo para cuando tenga ganas de escribir el paper “Back to eighties: a new approach to draw ZX Spectrum bitmaps from RGB images” y mandarlo a algún sitio donde me lo rechacen inmisericordemente por irrelevante XDD (lástima que no exista ninguna IEEE Transactions on Freak Stuff indexada para el currículum ;P).

En este enlace podéis descargar el código fuente del plug-in. No he tenido ningún cuidado con la estructura ni elegancia del programa (aunque está bastante documentado), así que no respondo si se os caen las pestañas pensando cómo he podido hacer tal guarrerida programatística. Era pa jugar un ratillo ;) Para instalarlo en una máquina con Linux sólo hay que instalar previamente la librería de desarrollo de GIMP (libgimp-dev, típicamente en los repositorios) y luego usar la herramienta “gimptool-2.0″ desde línea de comandos como se explica en el mismo código fuente del plug-in.

Aquí dejo algunos ejemplos de lo que se puede conseguir (el último está ligeramente manipulado ;P). Podéis darle al Ctrl+ varias veces en vuestro Firefox para apreciar mejor los detalles:









Calificaciones alternativas

Junio22/2011

Oficialmente, las calificaciones numéricas que se emplean para evaluar a los alumnos en España están en el típico intervalo [0,10]. No sé si esto sigue aplicándose en las enseñanzas primaria y media; sí en la universidad. Este rango da bastante resolución: incluso aunque sólo se considere un decimal tenemos 101 valores distintos.

No creo que seamos pocos los que consideramos que es, de hecho, demasiada resolución. Sobre todo teniendo en cuenta que terminan convirtiéndose en notas cualitativas, que son sólo 5: {suspenso, aprobado, notable, sobresaliente, matrícula de honor}. ¿Por qué no calificar de esa manera desde el principio? De hecho, siguen valorando el expediente final de un alumno univesitario con la suma ponderada de éstas, haciendo la asignación: suspenso-0 (este caso no se da en un expediente terminado, claro), aprobado-1, notable-2, sobresaliente-3, mh-4.

Aún más, diría yo: ¿por qué no usar diversos métodos de calificación para diversos tipos de ejercicios? A priori, es lo más lógico.

A mí personalmente me resulta en la mayoría de los casos más natural distinguir cinco puntuaciones (cuando no tres: mal-regular-bien): las cinco anteriores más las intermedias (es decir, “aprobado-” y “aprobado+”, por ejemplo), lo que no es sino una manera bastante tosca de incluir notas difusas.

El problema de las calificaciones alternativas como ésta (llamemos alternativa a la que no sea del rango [0,10]) es que finalmente tienen que transformarse, porque te lo piden para las actas oficiales, en las no alternativas, las que te dan una resolución de 101 valores distintos. “¿Por qué puede ser esto un problema?”, dirá el atento lector. “¡Pues se transforman y listo!”. Apliquemos la lupa matemática que todo científico friki tiene en su mesita de noche al asunto.

En la Universidad de Málaga, las calificaciones oficiales de asignaturas tienen la siguiente correspondencia cualitativa: [0,5) -> suspenso, [5,7) -> aprobado, [7,9) -> notable, [9,10] -> sobresaliente o mh. Los intervalos son semiabiertos: el número de la izquierda entra en el intervalo pero el de la derecha no.

Teniendo esto en cuenta, la transformación lógica desde una nota [0,4] a una nota [0,10] para que se preserve el significado de la nota inicial pasaría por suponer que un 1 en la primera coincide con el 5 (aprobado) en la segunda, un 2 en la primera con el 7 (notable) en la segunda, un 3 en la primera con el 9 (sobresaliente) en la segunda, y un 4 en la primera con el 10 en la segunda. Este mapeo toma como puntos de correspondencia en la segunda los inicios de las notas cualitativas (5 es el inicio del aprobado).

También sería lógico suponer un mapeo lineal en los puntos intermedios de un intervalo. Es decir, si a un alumno le califico con 1.5 en un ejercicio, que está en el punto medio del intervalo [1,2) (o sea, entre el aprobado y el notable), debería corresponderle un 6 en la nota oficial, que es el punto medio en el intevalo [5,7).

Matemáticamente estaríamos definiendo la siguiente función (añado su gráfica; ay, qué haría uno sin Matlab):

Si para obtener la calificación final de un alumno se hacen todas las operaciones parciales que haya que hacer con notas del rango [0,4], y sólo al final se convierten en notas del rango oficial, este mapeo no da mayores problemas. Es más, la función así definida es monótona creciente, lo que significa que preserva cualquier monotonicidad de las operaciones que se hagan con las notas parciales. Supongamos por ejemplo que tenemos dos series de notas del rango [0,4] (sean de dos alumnos en el mismo conjunto de ejercicios). Si la media de la primera serie (nuestra operación para obtener la nota final) es mayor que la media de la segunda serie, eso seguirá siendo así aunque primero mapeemos las notas al rango oficial y después hagamos las medias.

El problema es si en el camino que va desde las calificaciones parciales hasta las finales mezclas notas oficiales y no oficiales, o notas pertenecientes a distintos sistemas de calificación, hablando más en general. En ese caso te puedes encontrar el siguiente problema: la media ponderada de una serie de notas en el rango [0,4], una vez mapeada al resultado del rango oficial, no es el mismo valor que el resultante de mapear las notas primero al rango oficial y luego hacer la media. (Seguramente a nadie más le ha pasado esto, pero para eso éste es mi blog y el visitante asiduo está ya curado de la mayoría de mis espantos frikis ;P)

En general, a cualquier operación lineal (la media lo es) de una serie de notas en el rango [0,4] le pasará lo mismo que acabo de explicar. Y esto es así porque la función arriba escrita no es lineal, como cualquiera ha podido apreciar hace rato al ver que está definida por trozos de segmentos rectos distintos. Es decir, se cumple lo siguiente:

\psi(ax_{1}+bx_{2}) \ne a\psi(x_{1})+b\psi(x_{2})

Siendo x_{1} y x_{2} las notas involucradas en la operación y a y b dos constantes cualquiera.

Parece poco problema, pero puede dar alguna sorpresa y quizás dolor de cabeza al profesor descuidado. La solución: si usas diversos medios de calificación alternativos, o bien utilizas mapeos lineales de unos a otros (cosa que no es posible, por ejemplo, para pasar de las [0,4] a las [0,10] sin perder la semántica de las primeras), o bien no usas el mapeo hasta el final. ¡No los mezcles en el camino!

P.D.: Esto lo escribo porque me gustan las matemáticas. Sin embargo, cada vez soy más partidario de calificar por “intuición” (o mejor dicho, por mi experiencia y observación), y sólo me meto en estos juegos matemáticos para entretenerme mientras hago una de las partes de mi trabajo que menos me gustan. Por completitud, diré que hace tiempo discutí por aquí las ventajas e inconvenientes de las calificaciones intuitivas frente a las precisas. En concreto, la forma de evaluación intuitiva tiene dos problemas relevantes: no es explicable ni objetiva. Eso quiere decir que probablemente tengas más ojo para puntuar acertadamente a unos que a otros, simplemente por cómo tienes la cabeza de cargada ese día, y, lo que es más injusto desde mi punto de vista: los alumnos no se enfrentan a algo que comprendan y por tanto puedan prepararse; dicho de otra manera: no conocen bien cuáles son las reglas del juego que deben ganar, porque o bien pueden variar arbitrariamente o bien pueden ser difíciles de explicar, o ambas cosas. La forma de evaluación numérico-matemática es más justa en relación al conjunto de alumnos, aunque seguramente menos exacta al asignarles una calificación -la experiencia de un profesor no es sustituible por una fórmula matemática-.

Vídeos en cámara lenta pero perfectamente sincronizados con el cantante

Mayo25/2011

Sí, no se me ha ocurrido un título más corto para esta entrada ;P El caso es que es de esas cosas que se te quedan en la cabeza sin hacer mucho ruido durante mucho tiempo, hasta que un día te despiertas un poco más dormido del lóbulo frontal que del parietal y te dices: “Ostras, ¿cómo lo harán?”.

Se trata de conseguir que en un vídeoclip el cantante (o la cantanta) hagan su labor perfectamente sincronizada en el tiempo… a pesar de que la imagen va claramente en cámara lenta. Bueno, no demasiado claramente, sólo lo suficiente para que todos babeemos de lo chulo que queda cualquiera moviéndose un poquitín más lento de lo habitual (¿por qué nos gustará tanto esto?).

En fin, os dejo con un maravilloso ejemplo para que vayáis dándole al caletre, a ver si se os ocurre alguna explicación del cómo se hace más sencillita que las paranoias que yo pergeñaba mientras lo veía. A la vuelta, os digo cómo lo hacen realmente:

Como veis, este vídeo tiene además un efecto de clareado de la luz ambiente que imita a un amanecer (me imagino que fue rodado todo con la luz que aparece al final, y oscurecido al principio, porque en tan pocos minutos es difícil conseguir que se vean desde las estrellas hasta la claridad del día).

El asunto: el efecto de cámara lenta unido al sincronizado de labios (que es como se dice en inglés) no se consigue toqueteando cada fotograma para hacer coincidir los labios con la música, cambiándolos de sitio y de ritmo de movimiento (¡qué horror!), sino como sigue: grábese la música sólamente, a una velocidad superior a lo normal, digamos un x% más rápida de lo que sería normal; grábese el susodicho vídeo con una cámara capaz de capturar más fotogramas de lo normal por segundo mientras al interfecto o interfecta se le pone la música acelerada y se le obliga a que la cante a esa velocidad sin morirse de la risa; únanse finalmente imagen y audio y proyéctese al número de fotogramas por segundo que hagan al audio volver a su ritmo habitual. Y tachán :)

(Hay más detalles técnicos que tratar, pero ésta es la idea básica)

Eaolsndruitcpm

Mayo9/2011

Puede ser que algún día escriba una entrada al regresar del trabajo y me salga algo como lo de arriba, especialmente si me da por ahí un jueves del segundo cuatrimestre a las diez de la noche; pero no, esta vez no es fruto de una conexión espontánea del centro cerebral del lenguaje escrito con el plexo neuronal encargado de dar forma a las emociones primarias contra los partidos políticos.

Eso de ahí arriba es la frecuencia de uso, en perfecto orden de mayor a menor, de las letras en lenguaje escrito. No sabría decir si en castellano (creo que sí) o en inglés (pudiera ser), dado que me lo sé de memoria desde que tenía unos quince años y lo leí en un libro que había en el antiguo PRYCA (PRecio Y CAlidad) que no quería comprar por no hacer gasto y que por tanto no conservo. Ni siquiera recuerdo de qué iba el libro, pero el poder saber matemáticamente las letras que más se usan fue algo que me impactó bastante (a la vista está). Por aquel entonces no sabía nada del amigo Shannon y su teoría de la información, que da mucho juego y queda muy vistosa para este tipo de cosas.

Pues el caso es que me he acordado de esa secuencia de letras porque el otro día estaba concentrado escribiendo con el teclado, al que le empieza a fallar el blanco de las pegatinas de las teclas, y en vez de pensar, como siempre, “vaya mierda de pegatinas de las teclas”, pensé “leñes, de aquí se deduce algo”. He aquí el teclado en cuestión:

Como se ve, no sólo está el hecho de que las pegatinas son una mierda, sino el de que no todas están gastadas por igual. Las más gastadas parecen ser: e, a, s, d, i, l, m, que fue lo que me recordó el “eaolsndruitcpm” de esta entrada. También podemos ponernos técnicos y hacer una detección de bordes de esa imagen para ver dónde se detectan mejor, aunque realmente dependerá mucho el resultado del método elegido (yo lo he hecho con el operador de Sobel que viene con el GIMP), y al final creo que es más razonable fiarse de la capacidad de procesamiento de imágenes del cerebro. Esto es lo que obtenemos con el Sobel:

En fin. Que asumiendo un tiempo de uso no demasiado largo del teclado (de ahí mi afirmación de que las pegatinas son una mierda), y por tanto una incertidumbre más o menos elevada en la coincidencia de lo gastado con lo predicho teóricamente, tenemos que la coincidencia observada no está nada mal.

Mi santa me dijo luego que hay una historia de Sherlock Holmes parecida a todo esto. Qué de cosas pueden salir de una mirada perdida en medio de una labor rompeneuronas…

De cómo aprendí con el ZX Spectrum: teoría del color

Mayo2/2011

Yo con catorce años no sabía nada de teoría del color. Algún detallito que me habían enseñado en esa asignatura que entonces se llamaba “Pretecnología” (que era muy “Pre” porque no se usaba ni Photoshop ni nada para hacer las manualidades) sobre los colores “cálidos” y los colores “fríos”, pero poco más.

Entonces me regalaron un ZX Spectrum: un artilugio maravilloso que no sólo me llevó a estudiar lo que estudié y a trabajar en lo que trabajo, sino que me permitió aprender tantas cosas que me sigo maravillando de ello aún hoy. Y ya han pasado unos añitos.

Por ejemplo: el sistema de color del ZX constaba sólo de 8 colores distintos (luego empleados en ordenadores más sofisticados), a saber:

Índice Color Muestra
0 Negro
1 Azul
2 Rojo
3 Morado (magenta)
4 Verde
5 Celeste (cyan)
6 Amarillo
7 Blanco

También tenía otros ocho que eran estos mismos con brillo, y un sistema de mostrarlos en pantalla bastante enrevesado que sin embargo tenía un par de buenas ventajas: ahorraba mucha memoria (768 bytes para 256×192=49152 píxeles) y fomentaba una jartá la imaginación de los diseñadores de programas para que no se notara el tremendo pixelado de los colores. Pero ésas son otras historias.

Vista esa tabla de colores como está arriba no parece gran cosa, ni que eso suponga que un niño aprenda nada del otro jueves. Pero veamos qué pasa si añadimos el número de cada color en binario:

Índice Binario Color Muestra
0 000 Negro
1 001 Azul
2 010 Rojo
3 011 Morado (magenta)
4 100 Verde
5 101 Celeste (cyan)
6 110 Amarillo
7 111 Blanco

Fijaos qué cosa más curiosa: en binario, se puede interpretar que el número es como una serie de tres interruptores, cada uno encendiendo (si está a 1) una luz de un color “básico”, o apagándola (si está a 0). Concretamente, podemos deducir de la tabla anterior los siguientes colores “básicos” asignados a cada uno de los tres bits:

Bit Luz
0 (menos significativo, o sea, más a la derecha) Azul
1 (en medio) Roja
2 (más significativo, o sea, más a la izquierda) Verde

Visto de esta manera, está claro que si no encendemos ninguna de estas luces “básicas” tenemos ausencia total de color (=negro), si las encedemos todas tenemos el color más luminoso (=blanco), y si encendemos sólo algunas tenemos una mezcla de “luces básicas” que da otra luz que ya no es básica:

Índice Binario Color Mezcla
0 000 Negro (ningún color)
1 001 Azul (color “básico” puro)
2 010 Rojo (color “básico” puro)
3 011 Morado (magenta) Rojo+Azul
4 100 Verde (color “básico” puro)
5 101 Celeste (cyan) Verde+Azul
6 110 Amarillo Verde+Rojo
7 111 Blanco (todos los colores)

Es decir: que la mezcla de luz roja y azul da una luz morada; la de verde y azul, celeste; la de verde y roja, amarilla. Que es exactamente lo que pasa en la realidad física. En teoría del color, los colores verde, rojo y azul (ésos tan conocidos en las teles y monitores por sus siglas RGB), en el contexto de luces que se emiten con esos colores, se llaman primarios, porque no son mezcla de otros. Los que sí lo son, concretamente de dos primarios, se llaman colores secundarios, formando así una especie de operación aditiva matemática (commutativa) de los colores1.

No es poca cosa todo esto para haberlo aprendido sin darme cuenta -mientras aprendía otras muchas de las que sí me daba cuenta- y para haberme servido luego en multitud de ocasiones. De hecho, ahora recuerdo perfectamente de memoria el índice de cada uno de los colores del ZX, simplemente porque recuerdo que el azul es el 1, el rojo el 2 y el verde el 4 (potencias de dos). Como el resto son sumas de ésos, y sé que el morado es azul más rojo, su número en el ZX tenía que ser forzosamente el 3.

También recuerdo de memoria números como 16384, 6144, 768, 6912, 17, 65536, 32768, 49152, 23728-23729, 23552, 256 y otros que aprendí mientras jugaba con el Spectrum. Como he dicho antes, cada uno de ellos también tiene su historia :)



1 En el caso de la luz reflejada (que no emitida), la aditividad del color es distinta, e incluso los colores primarios cambian: básicamente, un pigmento es de un color determinado porque refleja hacia tus ojos la luz de ese color, absorbiendo el resto, así que si le añades otro pigmento que absorba luces de colores diferentes a los que absorbe el primero, tienes bastantes posibilidades de recibir en tus ojos menos luz en total: ése es el motivo por el que la mezcla de muchos pigmentos diferentes da un pigmento negro (al contrario que la mezcla de muchas luces emitidas diferentes, que da una luz emitida blanca).

Cómo poner las tipografías de Ubuntu “claras” (al menos en una pantalla de portátil)

Abril12/2011

Hace unos días he limpiado la máquina para instalarle la última de Ubuntu, y, para variar, me he tenido que comer el tarro (bueno, he usado Google ;P) para ponerle de nuevo el modo de renderizado de fonts como a mí me gusta, es decir, para que las letras se vean claritas, no ese atentado visual del desenfoque que sugiere la instalación por defecto y que viene siendo una de las pocas cositas de Ubuntu que no trago desde hace años.

He aquí los pasos a seguir, para que quede constancia para la próxima:

  1. Instalar ttf-mscorefonts-installer y ttf-bitstream-vera desde el Synaptic.
  2. En Appearance/Fonts, poner Application Font -> Arial, Document Font -> Tahoma, Desktop Font -> Arial, Window Title Font -> Sans Bold, Fixed Width Font -> Monospace (todas a 10 puntos).
  3. Appearance/Fonts/Rendering/Monochrome. Cualquiera que tenga astigmatismo odia que le toquen los píxeles y los subpíxeles.
  4. Los programas de Mozilla no hacen caso del renderizado del sistema operativo y hay que tocarlos aparte. En Firefox: Edit/Preferences/Content/Font&Colors-Advanced y poner las tipografías algo más bonitas: serif -> Bitstream Vera Serif, sans-serif -> Bitstream Vera Sans, monospace -> Bitstream Vera Mono. Hacer lo propio en thunderbird: Edit/Preferences/Display/Font&Colors-Advanced.
  5. Crear un fichero en el home que se llame .fonts.conf y que contenga esto (cuidado con las comillas dobles y los guiones si copias y pegas):

    <?xml version=”1.0″?>
    <!DOCTYPE fontconfig SYSTEM “fonts.dtd”>
    <!– /etc/fonts.conf file to configure system font access –>
    <fontconfig>

    <!– Antialias –>

    <match target=”font”><edit mode=”assign” name=”antialias”>
    <bool>false</bool>
    </edit>
    </match>
    </fontconfig>

Rearrancar firefox y thunderbird y recoger los ojos del suelo, que ya se puede mirar.

Esto es un estadístico (gordo) que va con una Wii y…

Noviembre22/2010

No es que no me guste el deporte, es que me causa las mismas sensaciones que visitar una tienda de ropa abarrotada de gente mientras trago un vaso de leche agria. Eso ha llevado a que el número total de horas que he dedicado a hacer ejercicio oficialmente en mi vida se remonte a unas dos coma cinco (en el cole, a regañadientes, hacía la gimnasia correspondiente, pero con el profe que teníamos se trataba más bien de instrucción militar que de lo que viene en llamarse deporte, por eso no sé si contabilizarlo).

Hasta la Universidad estuve más bien gordo, para qué nos vamos a engañar (aunque de chico estaba más bien canijo, qué cosas). En la Universidad adelgacé por el lógico trauma del cambio de vida, ciudad, alimentación y la larga experiencia en pensiones y pisos de estudiantes. Y como además andaba mucho de un lado a otro, logré mantenerme esbelto y atractivísimo hasta tan sólo unos pocos años atrás, cuando la vida definitivamente sedentaria y estresante pudo conmigo, con el pelo que me quedaba (ahora ya sólo me queda medio), y con la báscula, a la que creo que un día oí decir ay.

No engordé exageradamente; de hecho es probable que no se notara demasiado porque estaba dentro de los márgenes que definen el índice de masa corporal normal. Pero esa tripa me deprimía porque habían sido bastantes años sin conocernos, ella y yo, y me pareció que se presentara de improviso, la muy maleducada. Esto, unido a que para la espalda no es que sea precisamente buena, y a una estimación de mi peso futuro nada halagüeña si seguía así, me empujó, a partir de este verano pasado, a hacer todos los días una hora de ejercicio (en casa, baratito y tranquilito; si odio los deportes y odio las masas humanas, no digamos lo que puedo odiar los deportes practicados en masa). Además, me quité de aquello de cenar embutidos y comer más cosas ricas de la cuenta, aunque sigo comiendo de todo -en algo menos de cantidad- y no hago dieta.

El resultado, con comida sana, ni escasa ni excesiva, media hora de estiramientos más media hora de aeróbico suavito al día, y más … que el caballo de Espartero, es el siguiente, según nuestra amiga la Wii atestigua (yo, de agraciado avatar, abajo a la derecha):

Como se puede observar, no aparenta gran cosa (unos dos kilos y medio adelgazados en menos de tres meses), pero a mí me subió mucho la moral ver cómo me alejaba de la franja del sobrepeso.

Tanto, que no pude evitar meter los datos en Matlab, ese software que, de desaparecer, acabaría instantáneamente con el noventa por ciento de la investigación científica mundial (los puntos azules son los datos que metí):

Como digo, en la mitad de arriba se pueden ver las muestras de peso de la Wii. Parece que no son los mismos puntos que los de la primera foto sólo porque la Wii los muestra escalados en vertical, pero en verdad, en verdad lo son. Además, con la útil herramienta de ajuste de algunos modelos teóricos de Matlab, he sobreimpreso los modelos lineal, cuadrático y cúbico que mejor se ajustan a esos datos (las distintas curvas que aparecen).

El que mejor se ajusta es el cuadrático, y, de hecho, el cúbico, que debería ser mejor, lo tapa exactamente (línea curvada continua de color morado), lo que significa que no es necesario un ajuste cúbico. El ajuste lineal (línea roja) no es tan bueno para explicar la tendencia de los datos, como se ve a simple vista. Esto de que el cuadrático es mejor se observa también en la mitad inferior de la figura: el error de los datos con cada modelo aparece numéricamente, y el cuadrático y el cúbico tienen prácticamente el mismo (2.2 aprox.), lo que indica que no vale la pena pasarse al más complejo modelo cúbico para seguir estudiando el problema.

En resumen: que mi peso ha ido decreciendo como un polinomio de segundo grado cóncavo (como mi tripa, aunque depende del lado desde el que se mire), lo cual no es algo que pueda mantenerse indefinidamente en ningún tipo de universo en que las personas ocupemos espacio físico, pero es posible durante un tiempo finito.

Averiguar el mejor modelo para los datos de peso, como el cuadrático en mi caso, puede servir para predecir, por ejemplo, que, de seguir así, llegaré a pesar 74Kg a los 320 días de este año (el eje horizontal de la figura de la mitad superior son días a contar desde el 1 de Enero de 2010).

Pues bien. La figura de arriba sólo recogió datos hasta el 8 de Noviembre. Los 320 días del año se cumplieron el 17 de Noviembre, 9 días después. El 16 de Noviembre comprobé que había llegado a pesar 73.9Kg, y desde el 15 de Noviembre me estoy moviendo alrededor de los 74Kg. Esos pesos encajan bien con lo que predice el modelo cuadrático, pero no con el lineal, que hubiera predicho unos 74.6Kg para la misma fecha.

¡La estadística funciona!

Bueno, el que la estadística funcione ya era algo sabido. Sin embargo, esto de predecir estadísticamente es peligroso: el modelo cuadrático que teóricamente explica mejor los datos, a pesar del ruido que éstos tienen, no se debe usar mucho más allá del último dato: tarde o temprano me quedaré estancado y no seguiré adelgazando (espero).

Pero sí hay otras cosas que se pueden seguir estudiando a través de la estadística. Por ejemplo, el hecho de que durante estos meses me haya sentido más desmoralizado que otra cosa, hasta que vi la tendencia a la baja en la Wii: ha sido raro el día que no subía de peso después de haber bajado de peso, y en cantidades subjetivamente muy parecidas. ¿Cómo es posible que te veas engordando cuando en realidad estás adelgazando?

La respuesta está en el ruido: eso que hace que las muestras de peso no estén exactamente sobre el modelo cuadrático teórico, sino “revoloteando” a su alrededor. Ese ruido es producido por múltiples causas, la mayoría no modelables (¡por eso se llama ruido!): días que bebes más líquido que otros, días que -ejem- no tienes tanto éxito en el baño, días que comes algo más, días que comes algo menos, días que sudas diferente, etc, etc.

Pues bien, vamos a restar a cada muestra del peso tomada por la Wii el peso teórico que correspondería en ese momento según el modelo cuadrático, para tener una imagen más clara de cómo es ese ruido (esto se llamaría en inglés “detrending”, o “quitar la tendencia”):

No hagáis caso a eso de “linear” (no tiene nada que ver con el modelo lineal que he comentado antes): la línea roja es como la curva cuadrática, pero estirada hasta convertirse en una recta, de manera que arrastre las muestras de peso -puntos azules- con ese estiramiento, hasta quedar como se ve.

Esta distribución del ruido es bastante simétrica alrededor del modelo cuadrático: los pesos se sitúan de manera equitativa por encima y por debajo (salvo algún rebelde, lo que en inglés se llama “outlier”). Eso significa que más o menos hay la misma probabilidad de que un día determinado pese más porque haya bebido, comido, etc. más de la cuenta que de que pese menos por haber bebido, comido, etc., menos de la cuenta. Además, se puede ver que esos incrementos/decrementos de peso se extienden como mucho (quitando los rebeldes) en una franja de aproximadamente medio kilo por encima y por debajo del peso teórico.

O sea, que cada día, cuando me peso, la máquina me puede indicar tranquilamente medio kilo más o menos de lo que realmente sería esperable que pesara (y que conste que yo me peso siempre a la misma hora, porque el peso puede variar también a lo largo del día).

Sólo por curiosidad: aquí abajo pongo el mejor ajuste teórico para el ruido de mis medidas, según otra herramienta muy cómoda para hacer algunas operaciones estadísticas, llamada Input Analyzer, que viene con el software de simulación Arena (la figura muestra la misma información que la gráfica anterior, sólo que en horizontal está el valor de ruido y en vertical la frecuencia con que se ha encontrado ese valor de ruido entre las muestras de peso):

Se ve en los datos numéricos de abajo que la media, efectivamente (el ruido esperado), es casi 0, concretamente 0.000000000254 (2.54e-10 en notación científica), y la desviación esperada de esa media es 0.289 Kg. Teniendo en cuenta que el ajuste teórico a esas frecuencias (curva azul oscuro en forma de campana) es casi gaussiano, concretamente una función de probabilidad beta muy levemente asimétrica, se deduce que el ruido que la Wii superpondrá a mi peso esperado estará entre +0.455Kg y -0.470Kg con una probabilidad del 95%, como se ve en este cálculo numérico que he hecho con un pequeño trozo de código en Matlab -no se pueden calcular algebraica y exactamente esos límites porque la integral de la función beta no tiene forma cerrada-:

Por otra parte, según el modelo teórico cuadrático de mi evolución del peso, ¿cuánto es esperable que adelgace cada día? (Es seguro que algo adelgazo, porque la cuadrática es decreciente en todo el período temporal que cubre). Para calcular el decremento de peso esperado, basta con calcular los decrementos de peso entre días consecutivos según el modelo cuadrático, y luego hacer la media.

Yo, ya puestos, lo he hecho con los datos reales (lo que incluye el ruido, pero eso no influye en al estimación de esa media porque la media del ruido es 0), y no he calculado sólo la media, sino la distribución de probabilidad teórica que mejor se ajusta a los decrementos de peso (que resulta ser nuestra gran amiga la gaussiana):

En el eje horizontal: el incremento de peso diario. En el vertical: la frecuencia con que se ha encontrado ese incremento de un día para otro durante el experimento. Muy bien. Pues como se ve en los datos numéricos de la mitad inferior, el modelo teórico de estos incrementos (la curva azul oscura en forma de campana) es una gaussiana o normal con media -0.021Kg.

Resumo para que se vea la relevancia de todo esto para mi psique castigada: dijimos antes que cada día puedo encontrarme con un peso que está en una franja tan amplia como más/menos medio kilo alrededor del peso que sería esperable, por motivos diversos difícilmente modelables. Lo que nos dice esta última gráfica es que, a pesar de todo, cada día es esperable que adelgace 21 gramos.

Claro, por mucho que adelgace un día 21 gramos… ¡el ruido se come ese decremento de peso fácilmente! Lo oculta sin problemas: con que al ruido, que es impredecible y caprichoso como su propio nombre indica, le dé por valer más de +21 gramos varios días seguidos, lo cual os aseguro que pasa, es suficiente para que mi experiencia subjetiva sea ver cómo la Wii me dice que mi peso, a lo largo de esos días, se incrementa.

Afortunadamente, tarde o temprano -más temprano que tarde- el ruido se va a un valor menor de 21 gramos y me sube el ánimo de nuevo :)

La conclusión es clara: se puede adelgazar a un ritmo muy interesante y suave (casi a kilo por mes) haciendo poca cosa (aunque teniendo mucha voluntad)… ¡pero no se os ocurra estar pendientes del peso todos los días! Hasta que no pasen unos meses no lo miréis, que no vais a poder ver la tendencia y, como os desaniméis y dejéis de hacer vida sana, se acabó el adelgazar ;)

The product of two gaussian pdfs is not a pdf, but it is gaussian (a.k.a. loving algebra)

Noviembre9/2010

(A brief note for the spanish readers: lo siento, tenía ganas desde hace mucho tiempo de añadir notas técnicas -dan menos disgustos que las entradas sobre irritaciones-, quería apuntar la solución a un problema que me ha surgido en más de una ocasión, y, además, resulta que los sitios de internet donde lo he encontrado ni se molestan en desarrollarlo -de ahí que lo ponga en inglés-. No sólo de tontás vive el ingeniero ;P )

Gaussian probability density functions (pdf), which have two parameters and this nice syntax -in the unidimensional case-:

p(x; \mu, \sigma) = \frac{1}{\sqrt{2 \pi \sigma^2}} e^{-\frac{(x-\mu)^2}{2 \sigma^2}}

and, of course, with an integral over x \in \left [ -\infty,+\infty \right ] that yields 1 (as any pdf), are the most common formalization for the shape of uncertainty in science. When we do not know why and how some measurement varies over time in spite of the underlying system staying invariant (apparently), and in addition have no idea about the internals of the process that is producing that measurement, and in addition we do know that measurements move around a central value with high simmetry, it is usual to bring the familiar (and beautiful) graph of a gaussian to light:

The main reason for the prevalence of this pdf is the formidable evidence that supports the Central Limit Theorem, by which, for example, the sum of many measurements taken from a given random process -independently-, divided by the number of them, is a new measurement which tends to have a gaussian shape, more and more gaussian as that number of measurements increases. Actually, the CLT works very well in so many disciplines and problems, even when the measurements do not come from identically distributed processes, that gaussians are taken as the default probabilistic model of uncertainty in countless situations.

Not to mention the important mathematical simplifications that are enabled when the gaussian assumption is made ;)

Well, sometimes you find in your calculations products of gaussian functions. Some of those times what you actually find are products of gaussian pdfs, which are a subset of all the possible gaussian functions; for example, when you assume independent, multiple measurements in the likelihood factor of the bayes rule (ok, in estimation theory that factor is evaluated pointwise and it is common not to need any closed form for it -it is just a number after all-, but at other times you need to know that form in order to figure out its influence on the prior; or maybe it is just you are curious ;) ).

Anyway, the difference between a gaussian function and a gaussian pdf is that the former does not need to integrate to 1 in its whole support.

You can find easily in Internet that the product of two gaussian functions is a gaussian function. That is true, although it is rare -I could’nt- to find an algebraic demonstrarion of why. Moreover, in some places you can find even the value for the parameters of the resulting gaussian pdf of the product of two gaussian pdfs, but again an algebraical deduction is missing, and, more importantly…

… it turns out that the product of two gaussian pdfs is not a gaussian pdf! It is a gaussian function, or, in other words, a scaled gaussian pdf (which cannot be called a pdf at all!).

The purpose of this post is to show why is that so, thus let us go for the demonstration.

Let p1 and p2 be two gaussian pdfs with the same support:

p1(x; \mu_1, \sigma_1)=\frac{1}{\sqrt{2 \pi {\sigma_1}^2}} e^{-\frac{(x-\mu_1)^2}{2 {\sigma_1}^2}} \quad p2(x; \mu_2, \sigma_2)=\frac{1}{\sqrt{2 \pi {\sigma_2}^2}} e^{-\frac{(x-\mu_2)^2}{2 {\sigma_2}^2}}

Their product is:

p1(x; \mu_1, \sigma_1) p2(x; \mu_2, \sigma_2) =     \frac{1}{\sqrt{2 \pi {\sigma_1}^2}} e^{-\frac{(x-\mu_1)^2}{2 {\sigma_1}^2}}    \frac{1}{\sqrt{2 \pi {\sigma_2}^2}} e^{-\frac{(x-\mu_2)^2}{2 {\sigma_2}^2}} =

    \frac{1}{\sqrt{2 \pi {\sigma_1}^2 {\sigma_2}^2 2 \pi }}         e^{ -\frac{(x-\mu_1)^2}{2 {\sigma_1}^2} - \frac{(x-\mu_2)^2}{2 {\sigma_2}^2} } =    \frac{1}{\sqrt{2 \pi {\sigma_1}^2 {\sigma_2}^2 2 \pi }}         e^{ \frac{ - {\sigma_2}^2 (x-\mu_1)^2 - {\sigma_1}^2 (x-\mu_2)^2 } { 2 {\sigma_1}^2 {\sigma_2}^2 } }

The first trick: since { {\sigma_{1}}^{2} + {\sigma_{2}}^{2} } is greater than zero (otherwise we are talking about the product of two Dirac’s delta functions, which would be 0 unless \mu_1 = \mu_2 ), we can complicate the previous product a little bit without altering its value:

p1 p2 =    \frac{1}{\sqrt{2 \pi \frac { {\sigma_1}^2 {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} ( {\sigma_1}^2 + {\sigma_2}^2 ) 2 \pi }}         e^{ \frac{ - \frac { {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} (x-\mu_1)^2 - \frac{ {\sigma_1}^2 }{{\sigma_1}^2 + {\sigma_2}^2} (x-\mu_2)^2 } { 2 \frac { {\sigma_1}^2 {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} } }

Now we can separate a factor which resembles the scale factor of a gaussian pdf:

p1 p2 =    \frac{1}{\sqrt{2 \pi \frac { {\sigma_1}^2 {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} }}     \frac{1}{\sqrt{2 \pi ( {\sigma_1}^2 + {\sigma_2}^2 ) }}         e^{ \frac{ - \frac { {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} (x-\mu_1)^2 - \frac{ {\sigma_1}^2 }{{\sigma_1}^2 + {\sigma_2}^2} (x-\mu_2)^2 } { 2 \frac { {\sigma_1}^2 {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} } } =

    \frac{1}{\sqrt{2 \pi \frac { {\sigma_1}^2 {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} }}     e^{ ln { \frac{1}{\sqrt{2 \pi ( {\sigma_1}^2 + {\sigma_2}^2 ) }} }  }        e^{ \frac{ - \frac { {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} (x-\mu_1)^2 - \frac{ {\sigma_1}^2 }{{\sigma_1}^2 + {\sigma_2}^2} (x-\mu_2)^2 } { 2 \frac { {\sigma_1}^2 {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} } } =

    \frac{1}{\sqrt{2 \pi \frac { {\sigma_1}^2 {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} }}     e^{ ln { \frac{1}{\sqrt{2 \pi ( {\sigma_1}^2 + {\sigma_2}^2 ) }} }  +           \frac{ - \frac { {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} (x-\mu_1)^2 - \frac{ {\sigma_1}^2 }{{\sigma_1}^2 + {\sigma_2}^2} (x-\mu_2)^2 } { 2 \frac { {\sigma_1}^2 {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} } } =

    \frac{1}{\sqrt{2 \pi \frac { {\sigma_1}^2 {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} }}     e^{  - \frac{1}{2} ln ( 2 \pi ( {\sigma_1}^2 + {\sigma_2}^2 ) )  +           \frac{ - \frac { {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} (x-\mu_1)^2 - \frac{ {\sigma_1}^2 }{{\sigma_1}^2 + {\sigma_2}^2} (x-\mu_2)^2 } { 2 \frac { {\sigma_1}^2 {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} } }

Ok, it is time to focus only on the exponent of e. Firstly, we incorporate the previous scale factor into it:

    \frac        {             - ( \frac { {\sigma_1}^2 {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2}) ln ( 2 \pi ( {\sigma_1}^2 + {\sigma_2}^2 ) )              - \frac { {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} (x-\mu_1)^2 - \frac{ {\sigma_1}^2 }{{\sigma_1}^2 + {\sigma_2}^2} (x-\mu_2)^2          }          {             2 \frac { {\sigma_1}^2 {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2}          }

Then we expand the square terms that include x:

    \frac        {             - ( \frac { {\sigma_1}^2 {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2}) ln ( 2 \pi ( {\sigma_1}^2 + {\sigma_2}^2 ) )  +            - \frac { {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} (x^2 + {\mu_1}^2 -2x \mu_1)             - \frac{ {\sigma_1}^2 }{{\sigma_1}^2 + {\sigma_2}^2} (x^2 + {\mu_2}^2 -2x \mu_2)          }          {             2 \frac { {\sigma_1}^2 {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2}          }

And then we collect the numerator as a polynomial in x:

    \frac        {            x^2 ( \frac {- {\sigma_1}^2 - {\sigma_2}^2 }{ {\sigma_1}^2 + {\sigma_2}^2 } )            - 2x ( \frac {- \mu_1 {\sigma_2}^2 - \mu_2 {\sigma_1}^2 }{ {\sigma_1}^2 + {\sigma_2}^2} )            + ( \frac { - {\mu_1}^2 {\sigma_2}^2 - {\mu_2}^2 {\sigma_1}^2 - {\sigma_1}^2 {\sigma_2}^2 ln( 2 \pi ({\sigma_1}^2 + {\sigma_2}^2) ) }{ {\sigma_1}^2 + {\sigma_2}^2 } )         }         {             2 \frac { {\sigma_1}^2 {\sigma_2}^2 }{ {\sigma_1}^2 + {\sigma_2}^2 }          } =

    \frac        {            - x^2            + 2x ( \frac { \mu_1 {\sigma_2}^2 + \mu_2 {\sigma_1}^2 }{ {\sigma_1}^2 + {\sigma_2}^2} )            - ( \frac { {\mu_1}^2 {\sigma_2}^2 + {\mu_2}^2 {\sigma_1}^2 + {\sigma_1}^2 {\sigma_2}^2 ln( 2 \pi ({\sigma_1}^2 + {\sigma_2}^2) ) }{ {\sigma_1}^2 + {\sigma_2}^2 } )         }         {             2 \frac { {\sigma_1}^2 {\sigma_2}^2 }{ {\sigma_1}^2 + {\sigma_2}^2 }          }

The second trick: a polynomial of the form -x^2+2Ax-(A^2+C) turns out to be equivalent to -(x-A)^2-C, which is the form of the exponent of an unidimensional gaussian pdf plus a constant term. Casually, we had in the above expresion that polynomial if we do:

A=\frac { \mu_1 {\sigma_2}^2 + \mu_2 {\sigma_1}^2 }{ {\sigma_1}^2 + {\sigma_2}^2}

A^2+C=\frac { {\mu_1}^2 {\sigma_2}^2 + {\mu_2}^2 {\sigma_1}^2 + {\sigma_1}^2 {\sigma_2}^2 ln( 2 \pi ({\sigma_1}^2 + {\sigma_2}^2) ) }{ {\sigma_1}^2 + {\sigma_2}^2 }

We are just a few steps from knowing how close is our product of gaussian pdfs to yield another gaussian pdf! But first, let us take a short detour to obtain the value of C in our expression:

C=\frac { {\mu_1}^2 {\sigma_2}^2 + {\mu_2}^2 {\sigma_1}^2 + {\sigma_1}^2 {\sigma_2}^2 ln( 2 \pi ({\sigma_1}^2 + {\sigma_2}^2) ) }{ {\sigma_1}^2 + {\sigma_2}^2 } - A^2=

     \frac { {\mu_1}^2 {\sigma_2}^2 + {\mu_2}^2 {\sigma_1}^2 + {\sigma_1}^2 {\sigma_2}^2 ln( 2 \pi ({\sigma_1}^2 + {\sigma_2}^2) ) }{ {\sigma_1}^2 + {\sigma_2}^2 } -     ( \frac { \mu_1 {\sigma_2}^2 + \mu_2 {\sigma_1}^2 }{ {\sigma_1}^2 + {\sigma_2}^2} )^2 =

\frac  {      ( {\mu_1}^2 {\sigma_2}^2 + {\mu_2}^2 {\sigma_1}^2 + {\sigma_1}^2 {\sigma_2}^2 ln( 2 \pi ({\sigma_1}^2 + {\sigma_2}^2) ) ) ({\sigma_1}^2 + {\sigma_2}^2) -      (\mu_1 {\sigma_2}^2 + \mu_2 {\sigma_1}^2)^2  }  {      ({\sigma_1}^2 + {\sigma_2}^2)^2  }

Let \alpha be an abbreviation of that disturbing ln( 2 \pi ({\sigma_1}^2 + {\sigma_2}^2) ) and proceed with expanding terms:

C=\frac  {      ( {\mu_1}^2 {\sigma_2}^2 + {\mu_2}^2 {\sigma_1}^2 + {\sigma_1}^2 {\sigma_2}^2 \alpha ) ({\sigma_1}^2 + {\sigma_2}^2) -      (\mu_1 {\sigma_2}^2 + \mu_2 {\sigma_1}^2)^2  }  {      ({\sigma_1}^2 + {\sigma_2}^2)^2  } =

\frac  {      {\mu_1}^2 {\sigma_2}^4 + {\mu_2}^2 {\sigma_1}^2 {\sigma_2}^2 + {\sigma_1}^2 {\sigma_2}^4 \alpha + {\mu_1}^2 {\sigma_2}^2 {\sigma_1}^2 + {\mu_2}^2 {\sigma_1}^4 + {\sigma_1}^4 {\sigma_2}^2 \alpha - {\mu_1}^2 {\sigma_2}^4 - {\mu_2}^2 {\sigma_1}^4 - 2{\mu_1}{\mu_2} {\sigma_1}^2 {\sigma_2}^2  }  {      ({\sigma_1}^2 + {\sigma_2}^2)^2  } =

\frac  {      {\mu_2}^2 {\sigma_1}^2 {\sigma_2}^2 + {\sigma_1}^2 {\sigma_2}^4 \alpha + {\mu_1}^2 {\sigma_2}^2 {\sigma_1}^2 + {\sigma_1}^4 {\sigma_2}^2 \alpha - 2{\mu_1}{\mu_2} {\sigma_1}^2 {\sigma_2}^2  }  {      ({\sigma_1}^2 + {\sigma_2}^2)^2  } =

\frac  {      {\sigma_1}^2 {\sigma_2}^2 ( {\mu_2}^2 + {\sigma_2}^2 \alpha + {\mu_1}^2 + {\sigma_1}^2 \alpha - 2{\mu_1}{\mu_2} )  }   {      ({\sigma_1}^2 + {\sigma_2}^2)^2  } =

\frac  {      {\sigma_1}^2 {\sigma_2}^2 ( ( {\mu_1} - {\mu_2} )^2 + ({\sigma_1}^2 + {\sigma_2}^2) \alpha )  }   {      ({\sigma_1}^2 + {\sigma_2}^2)^2  } =

\frac { {\sigma_1}^2 {\sigma_2}^2 }{ ({\sigma_1}^2 + {\sigma_2}^2)^2 } ({\mu_1} - {\mu_2} )^2+\frac { {\sigma_1}^2 {\sigma_2}^2 }{ {\sigma_1}^2 + {\sigma_2}^2 } ln( 2 \pi ({\sigma_1}^2 + {\sigma_2}^2) )

Ook. We have already values for A and C. Using those letters, the resulting product of the two gaussian pdfs has become:

p1p2=    \frac{1}{\sqrt{2 \pi \frac { {\sigma_1}^2 {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} }}    e^{ \frac{-(x-A)^2-C}{2 \frac{{\sigma_1}^2 {\sigma_2}^2}{{\sigma_1}^2 + {\sigma_2}^2}} } =    \frac{1}{\sqrt{2 \pi \frac { {\sigma_1}^2 {\sigma_2}^2 }{{\sigma_1}^2 + {\sigma_2}^2} }}    e^{ \frac{-(x-A)^2}{2 \frac{{\sigma_1}^2 {\sigma_2}^2}{{\sigma_1}^2 + {\sigma_2}^2}} }   e^{- \frac {C}{2 \frac{{\sigma_1}^2 {\sigma_2}^2}{{\sigma_1}^2 + {\sigma_2}^2}} }

Notice that the first factor and the first exponential are a gaussian pdf. The whole result, however, is just a gaussian function, unless the second exponential equals 1…

Let us take a closer look to that second exponential, the reason why our result is not a gaussian pdf but a gaussian function:

   e^{- \frac {C}{2 \frac{{\sigma_1}^2 {\sigma_2}^2}{{\sigma_1}^2 + {\sigma_2}^2}} } =   e^{- \frac { \frac { {\sigma_1}^2 {\sigma_2}^2 }{ ({\sigma_1}^2 + {\sigma_2}^2)^2 } ({\mu_1} - {\mu_2} )^2+\frac { {\sigma_1}^2 {\sigma_2}^2 }{ {\sigma_1}^2 + {\sigma_2}^2 } ln( 2 \pi ({\sigma_1}^2 + {\sigma_2}^2) ) }        {2 \frac{{\sigma_1}^2 {\sigma_2}^2}{{\sigma_1}^2 + {\sigma_2}^2}} } =

   e^{- \frac { ({\mu_1} - {\mu_2} )^2 }{ 2 ({\sigma_1}^2 + {\sigma_2}^2) }         - \frac{1}{2} ln( 2 \pi ({\sigma_1}^2 + {\sigma_2}^2) )       } =   e^{- \frac { ({\mu_1} - {\mu_2} )^2 }{ 2( {\sigma_1}^2 + {\sigma_2}^2 )} }   e^{- \frac{1}{2} ln( 2 \pi ({\sigma_1}^2 + {\sigma_2}^2) ) } =

   \frac {1}{ \sqrt{2 \pi ({\sigma_1}^2 + {\sigma_2}^2)} }   e^{- \frac { ({\mu_1} - {\mu_2} )^2 }{ 2({\sigma_1}^2 + {\sigma_2}^2) } }

Surprisingly, this last expression is a gaussian pdf if we consider \mu_1 a variable, i.e., p(\mu_1; \mu_2, \sqrt{({\sigma_1}^2+{\sigma_2}^2)}) (we can also consider \mu_2 the variable). But what we are interested in is knowing under which conditions this expression equals 1, and, thus, the product of our original pdfs p1 and p2 is actually a gaussian pdf:

   \frac {1}{ \sqrt{2 \pi ({\sigma_1}^2 + {\sigma_2}^2)} }   e^{- \frac { ({\mu_1} - {\mu_2} )^2 }{ 2({\sigma_1}^2 + {\sigma_2}^2) } } = 1  \Leftrightarrow    - \frac { ({\mu_1} - {\mu_2} )^2 }{ 2({\sigma_1}^2 + {\sigma_2}^2) }   = ln ( \sqrt{2 \pi ({\sigma_1}^2 + {\sigma_2}^2)} )  \Leftrightarrow

   - \frac { ({\mu_1} - {\mu_2} )^2 }{ 2({\sigma_1}^2 + {\sigma_2}^2) }   = \frac {1}{2} ln ( 2 \pi ({\sigma_1}^2 + {\sigma_2}^2) )  \Leftrightarrow

   -  ({\mu_1} - {\mu_2} )^2    = ({\sigma_1}^2 + {\sigma_2}^2) ln ( 2 \pi ({\sigma_1}^2 + {\sigma_2}^2) )

Since { {\sigma_{1}}^{2} + {\sigma_{2}}^{2} } is greater than zero, and the expectations are independent from the variances, we will always find cases (infinite cases, actually) in which the equality does not hold. Thus, we will find infinite cases where the product of two gaussian pdfs is a gaussian function but not a gaussian pdf.

Nevertheless: the scaled gaussian function obtained as the result of the product has the following pdf-like parameters:

\mu_{1 x 2} = A = \frac { \mu_1 {\sigma_2}^2 + \mu_2 {\sigma_1}^2 }{ {\sigma_1}^2 + {\sigma_2}^2}

{\sigma_{1 x 2}}^2 = \frac{{\sigma_1}^2 {\sigma_2}^2}{{\sigma_1}^2 + {\sigma_2}^2}

which are the same you can find in the Internet… But remember: it is not a gaussian pdf even when we use these parameters to describe it!

El dilema de las asignaturas optativas

Septiembre20/2010

Las asignaturas optativas en las carreras universitarias siempre me han causado perplejidad. Cuando era estudiante, porque no veía claro cuál coger (aunque tenía algunas claras, la elección de otras no era cuestión de sus contenidos… no sabía suficiente para escoger). Cuando fui profesor, porque realmente vi los efectos perniciosos, tanto en el profesorado como en el alumnado, que ese sistema causaba.

Siempre se han vendido como una forma de aumentar las posibilidades de elección de los alumnos, orientada a mejorar la diversidad/especialización de un aprendizaje que puede resultar demasiado complejo como para que todo esté rígidamente establecido de antemano. Como habréis notado, mi facilidad para hacer de abogado del diablo aún no está oxidada del todo ;)

Porque lo que realmente pienso es que lo primero (aumentar las posibilidades de elección) es una obviedad, aparte de no ser las optativas la única manera de llevarlo a cabo, y lo segundo ha terminado, en la práctica, perdiéndose. ¿Por qué? Pues por una cuestión básica: ninguna asignatura es (ni puede ser) de igual dificultad que otra. Este hecho es natural y lógico, no es malo.

El problema viene cuando se crean las optativas en un plan de estudios con asignaturas desiguales en dificultad: eso lleva a que haya una tendencia estadística clarísima (y también natural y muy humana) a tener más alumnos en las asignaturas más fáciles (sí, no me llaméis facha tan pronto: los de mi quinta ya nos lo planteábamos así cuando nos tocó de estudiantes, y como profesor no ha habido un sólo año en que no me hayan preguntado cómo se evalúa mi asignatura optativa antes de preguntarme qué se da en ella; de hecho, o no me preguntaban lo segundo o me lo preguntaban para saber cuánto se parecía a lo que ya habían estudiado en otras…).

Al haber pocos estudiantes en las asignaturas optativas más duras o menos atractivas, aunque sean precisamente los estudiantes más motivados, se empiezan a crear problemas en la universidad: los recursos destinados a ellas dejan de ser rentables (es lo que tiene usar el libre mercado, que no facilita precisamente la diversidad, en cosas en que no se debería). Hay universidades que regulan eso dejando de dar cada año las optativas que se quedan con pocos alumnos, y hay otras que no dejan de impartirlas aunque tengan un sólo alumno, pero no se las tienen en cuenta a los departamentos como carga docente, moviendo el problema de un sitio a otro, sin solucionarlo.

No digamos cuando las optativas se agrupan por horario de tal manera que entre las que caen a una misma hora las hay más fáciles y más difíciles…

En mi opinión, implantar la diversidad curricular (¡arg, qué logse-bolónico me ha quedao eso!) con optativas es un error: los alumnos no han terminado la carrera, luego no saben (no tienen por qué saber) lo suficiente para escoger con suficiente fundamento qué estudiar, o, como mínimo, para escogerlo al nivel tan fino de granularidad que permite el sistema de optativas; por otra parte, los profesores, al verse ellos o sus departamentos “penalizados” por los efectos que provoca la falta de alumnos, pueden caer en bajar el nivel de las asignaturas más difíciles, reducir contenidos y exigencia para no perder alumnos, lo cual, aunque ya pocos lo decimos, no beneficia precisamente a la formación de éstos…

Yo creo que la implementación con una granularidad más gruesa, en la que el alumno pueda escoger conjuntos coherentes de asignaturas pero no asignaturas individuales (ramas, o itinerarios, como se llaman ahora) es bastante mejor: el alumno encuentra varias posibilidades de especialización, están (supuestamente) bien escogidas para que sean un todo y reflejen una parcela del conocimiento asociado a su carrera, no causan tantos problemas de falta de alumnos (aunque inevitablemente las ramas más difíciles tenderán a tener menos alumnos que las más accesibles), en definitiva, no se afecta tanto a los conocimientos y formación finales del alumnado.

Además, el problema de la diversidad de dificultades en las ramas es más fácil de resolver que con las optativas: sin tocar cada asignatura pueden diseñarse ramas más o menos equilibradas, aparte de que la dificultad total de cada rama (la suma de dificultades de sus asignaturas) será bastante parecida, por lo general, a la de las demás. Al menos, será muy fácil conseguir que las dificultades totales de las ramas (relativas a la máxima dificultad de una rama) tengan menos diversidad que las dificultades individuales de las asignaturas (relativas a la máxima de una asignatura)1.

Obviamente, todo esto no va a ningún sitio a estas alturas, mucho menos poniéndolo en este blog…


1 Que esto se cumple es fácil de demostrar matemáticamente: si tenemos un conjunto de n ramas {\{R_{i}\}}_{i \in [1,n]}, cada una con m_{i} asignaturas {\{ a_{j} \}}_{j \in [1,m_{i}]}, con dificultades absolutas individuales mayores o iguales que cero {\{ d_{i,j} \}}_{j \in [1,m_{i}]}, la dificultad relativa de una rama puede definirse como \tilde{D}_{i}= \frac{ \sum_{j=1}^{j=m_{i}} d_{i,j} } { max_{i} \{ \sum_{j=1}^{j=m_{i}} d_{i,j} \} }  . Por otra parte, podemos considerar la dificultad relativa de la asignatura (i,j), que será \tilde{d}_{i,j}=\frac{d_{i,j}}{max_{i,j} \{d_{i,j}\}}. Está claro que la máxima diferencia entre dos dificultades relativas que puede haber en el caso de asignaturas individuales es 1, mientras que en el caso de las ramas, sólo con asegurarse de que en cada rama haya al menos una asignatura de dificultad mayor que 0, ya es inferior a 1, y más pequeña cuantas más asignaturas con dificultad mayor que 0 haya en la rama; es decir: se percibirán mayores diferencias entre dificultades relativas de asignaturas individuales que entre dificultades relativas de ramas, incluso diferencias muy pequeñas en el caso de las ramas, y eso con muy poco esfuerzo de diseño del plan de estudios.

16’5 años después…

Septiembre4/2010

No voy a decir ná, que no me gusta hablar hasta que no termino las cosas, pero ya me hace ilu poder comparar lo que había hace más de dieciséis años:

Con lo que va empezando a haber ahora, a base de vacaciones y ratos libres:

P.D.: Dedicado al Hombre Mecatrónico Temporalmente Inglés, y a J.C. Vega. Que sepáis que, aparte de tener mucha culpa en todo esto, lo que había hace más de dieciséis años es aún una de las mejores implementaciones posibles ;)

« Antiguas
  • Últimas lecturas:

  • Andanzas artísticas:

  • Criaturas:

  • Creative Commons License