Seite 1 von 1

Score einer Gaussmixturverteilung

Verfasst: Montag 21. Mai 2012, 14:06
von anogayales
Hallo allerseits,

so heute bin ich mal mit "Hausaufgaben" dran :) Ich soll den Score einer Gaussmixturverteilung mittels dieser Formel berechnen:
Bild mit Bild

Die Mixturverteilung besteht aus zwei Gausglocken mit den Eigenschaften:
1. Gauss:
Gewicht: 0.4
Mittelwertsvektor : [3, 4.5]
Kovarianzmatrix : [[3,0],
[0,3]]

2. Gauss:
Gewicht: 0.6
Mittelwertsvektor : [4, -1]
Kovarianzmatrix : [[2,0],
[0,2]]


und der Vektor [2,1.5] soll bewertet werden.

Hier mein Ansatz in python:

Code: Alles auswählen

from __future__ import division
import numpy
from numpy import linalg
import math

def gauss(m, sigma, x, n):
  return 1/(math.sqrt((2*math.pi)**n*linalg.det(sigma)))*math.exp(-0.5*(x-m).transpose()*linalg.inv(sigma)*(x-m))

def calculate_gaussian_score():
  weights = [0.4, 0.6]
  ms = [numpy.array([[3,4.5]]), numpy.array([[4,-1]])]
  sigmas = [numpy.diag([3,3]), numpy.diag([2,2])]
  vector = numpy.array([[2, 1.5]])
  return sum([weights[index]*gauss(ms[index].transpose(), numpy.matrix(sigmas[index]), vector.transpose(), len(weights)) for index in range(2)])
Leider ist irgendwo der Wurm drin. Ich bekomm ein Score von 0.00768987819712, sollte aber im 4er bereich liegen. Mach ich irgendwo eine Berechnung falsch?

Grüße,
anogayales

Re: Score einer Gaussmixturverteilung

Verfasst: Montag 21. Mai 2012, 14:34
von nomnom
Ich bin kein Mathematiker, aber ist |Σ| nicht der Betrag von Σ?

Re: Score einer Gaussmixturverteilung

Verfasst: Montag 21. Mai 2012, 14:39
von EyDu
Ich sehe da keinen Fehler, bzw. keinen der sich hier auswirkt. Das n in der Funktion ist bei dir falsch gewählt, dies sollte die Dimension von x sein und nicht die Anzahl der Gewichte. In diesem Fall ist das natürlich egal, da beides zwei ist. Woher hast du denn die Annahme, dass dein Ergebnis falsch ist?

Die Summe kannst du übrigens noch besser schreiben:

Code: Alles auswählen

sum(w*gauss(mu, cov, x, len(x)) for (mu, cov, w) in zip(mus, covs, weights))

Re: Score einer Gaussmixturverteilung

Verfasst: Montag 21. Mai 2012, 14:40
von EyDu
nomnom hat geschrieben:Ich bin kein Mathematiker, aber ist |Σ| nicht der Betrag von Σ?
Nein, hier ist die Determinante gemeint.

Re: Score einer Gaussmixturverteilung

Verfasst: Montag 21. Mai 2012, 15:37
von anogayales
EyDu hat geschrieben:Ich sehe da keinen Fehler, bzw. keinen der sich hier auswirkt. Das n in der Funktion ist bei dir falsch gewählt, dies sollte die Dimension von x sein und nicht die Anzahl der Gewichte.
Wenn ich ganz stur, der Formel oben glaub (die mit der Summe). Dann ist n in der Tat die Anzahl der Mixturgewichte.
EyDu hat geschrieben:In diesem Fall ist das natürlich egal, da beides zwei ist. Woher hast du denn die Annahme, dass dein Ergebnis falsch ist?
Wir haben ein Testprogramm, das den Score berechnet. Leider hab ich kein Zugriff auf die Quellen des Programms. Das genaue Ergebnis lautet: 4.596764
EyDu hat geschrieben: Die Summe kannst du übrigens noch besser schreiben:

Code: Alles auswählen

sum(w*gauss(mu, cov, x, len(x)) for (mu, cov, w) in zip(mus, covs, weights))
Vielen Dank! Bin immer davon ausgegangen, dass zip nur zwei Iterables zippen kann. :)

Werde mal einen Betreuer kontaktieren und ihn nach Rat fragen. Eine Möglichkeit wäre, dass die Eingangsparameter falsch sind. Ab zum Betreuer!

Grüße,
anogayales