Estoy trabajando en un modelo de aprendizaje de categoría en línea que utiliza el descenso de gradiente estocástico para adaptarse a un modelo de mezcla gaussiana. El modelo se basa en el modelo de aprendizaje en línea utilizado en Toscano y McMurray (2010).
Si bien el descenso de gradiente parece estar funcionando bastante bien para estimar las medias y frecuencias / probabilidades de mezcla de las categorías, estoy teniendo problemas para estimar las covarianzas de los componentes de la mezcla. Las derivadas parciales que he estado usando para la actualización de descenso de gradiente provienen de Petersen y Pedersen (2008) (p. 44)
Empezando con
Petersen y Pedersen dan la derivada parcial con respecto a la matriz de covarianza como
El paso de descenso de gradiente para cada , como lo tengo implementado en Python es (esto es una ligera simplificación y el para todos los componentes se calcula antes de realizar la actualización):
j.sigma += learning_rate*(G(x)/M(x))*0.5*(-inv(j.sigma) + inv(j.sigma).dot((x-j.mu).dot((x-j.mu).transpose())).dot(inv(j.sigma)))
Donde j es un objeto que representa el componente de la mezcla y j.sigma y j.mu son la media y la varianza de ese componente. G (x) / M (x) a un código que calcula
Entonces, me pregunto si hay algo mal con mi código (muy probable) o si esta es solo una forma realmente mala de ajustar este tipo de modelo cuando se trata de datos con más de dos dimensiones (consulte Toscano y McMurray para ver algoritmos para univariante y datos bivariados que definitivamente funcionan).
referencias: Toscano, JC y McMurray, B. (2010). Integración de señales con categorías: ponderación de señales acústicas en el habla utilizando aprendizaje no supervisado y estadísticas de distribución. Ciencia cognitiva, 34, 434-464.
Petersen y Pederson. The Matrix Cookbook, Versión: 14 de noviembre de 2008