Score einer Gaussmixturverteilung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

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
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Ich bin kein Mathematiker, aber ist |Σ| nicht der Betrag von Σ?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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))
Das Leben ist wie ein Tennisball.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

nomnom hat geschrieben:Ich bin kein Mathematiker, aber ist |Σ| nicht der Betrag von Σ?
Nein, hier ist die Determinante gemeint.
Das Leben ist wie ein Tennisball.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

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
Antworten