2017-04-20 4 views
0

Ich habe weiterhin Probleme mit Matlab-Übersetzung zu Python. Ich habe Code in Matlab, den ich letztes Jahr geschrieben habe (funktioniert) und versuche nun, die Funktionen in Python zu übersetzen. 5 von ihnen arbeiten, 4 nicht. Ich bin wirklich fest und würde etwas Hilfe lieben. In diesem Fall wird die Naive-Bayes-Wahrscheinlichkeit geschätzt. Hier ist die Funktion in Matlab:Schätzung Naive - Bayes Wahrscheinlichkeitsfunktion

function [ p_x_y ] = estimate_p_x_y_NB(Xtrain,ytrain,a,b) 

% Function calculates probability distribution p(x|y), assuming that x is binary 
% and its elements are independent from each other 

% Xtrain - training dataset NxD 
% ytrain - training dataset class labels 1xN 
% p_x_y - binomial distribution estimators - element at position(m,d) 
% represents estimator p(x_d=1|y=m) MxD 
% N - number of elements in training dataset 
D = size(Xtrain,2); 
M = length(unique(ytrain)); 
p_x_y = zeros(M,D); 
for i=1:M 
    for j=1:D 
     numerator = sum((ytrain==i).*((Xtrain(:,j)==1))')+a-1; 
     denominator = sum(ytrain==i)+a+b-2; 
     p_x_y(i,j) = numerator/denominator; 
    end 
end 
end 

Dies ist meine Übersetzung Python:

def estimate_p_x_y_nb(Xtrain, ytrain, a, b): 
    """ 
    :param Xtrain: training data NxD 
    :param ytrain: class labels for training data 1xN 
    :param a: parameter a of Beta distribution 
    :param b: parameter b of Beta distribution 
    :return: Function calculated probality p(x|y) assuming that x takes binary values and elements 
    x are independent from each other. Function returns matrix p_x_y that has size MxD. 
    """ 
    D = Xtrain.shape[1] 
    M = len(np.unique(ytrain)) 
    p_x_y = np.zeros((M, D)) 
    for i in range (M): 
     for j in range(D): 
      up = np.sum((ytrain == i+1).dot((Xtrain[:, j]==1)).conjugate().T) + a - 1 
      down = np.sum((ytrain == i+1) + a + b -2) 
      p_x_y[i,j] = up/down 
    return p_x_y 

Traceback:

p_x_y[i,j] = up/down 
ValueError: setting an array element with a sequence. 

Wenn Sie Probleme mit der Funktion sehen kann, würde ich Sei super glücklich, dass es darauf hingewiesen wurde. Außerdem habe ich .dot anstelle von * in der up Variablen verwendet, seit wann es * war, habe ich einen Fehler über ungenaue Dimensionen, aber mit diesem, scheint es zu funktionieren. Vielen Dank.

+0

Haben Sie versucht, die Ergebnisse aus dem MATLAB-Code mit denen von Python in jeder Zeile zu vergleichen, um zu sehen, wo das Problem liegt? Es ist eine einfache Möglichkeit, Ihr Problem einzugrenzen. Oder stellen Sie ein [minimales, vollständiges und überprüfbares Beispiel] bereit (http://stackoverflow.com/help/mcve). – DavidG

+0

Das elementweise Produkt '. *' Mit Punkt-Punkt 'Punkt' zu ersetzen ist wahrscheinlich falsch. Das elementweise Produkt in numpy ist '*'. – kazemakase

+0

@kazemakase in Ordnung, also sagst du, es sollte wahrscheinlich bleiben *? (in Python?). Aber wenn ich es so belasse, bekomme ich einen "ValueError: dimension mismatch". Ich nehme an, es ist wegen der Transponierung später, aber es funktioniert in Matlab :( – Swaglina

Antwort

3

Ich denke, es gibt ein Problem in der Anweisung, wo Sie den Nenner zuweisen. Sie haben eine falsche Verwendung von Klammern

down = np.sum((ytrain == i+1) + a + b -2)

sollte

gemacht
down = np.sum((ytrain == i+1)) + a + b -2 

auch sein, versuchen

up = np.sum((ytrain == i+1).dot((Xtrain[:, j]==1)).conjugate().T) + a - 1

zu

up = np.sum((ytrain == i+1) * (Xtrain[:, j]==1)) + a - 1 

ich, dass Werke hoffen zu ändern. Ich sehe keine anderen Probleme mit Ihrem Code.

Nach dem Wechsel nutzte ich die Werte

Xtrain = np.array([[1,2,3,4,5], [1,2,3,4,5]]) 
ytrain = np.array([1,2]) 
a = 1 
b = 1 

Dies gab die Ausgabe als

array([[ 1., 0., 0., 0., 0.], 
     [ 1., 0., 0., 0., 0.]]) 

sowohl in MATLAB und Python. Sie können diese Werte überprüfen, wenn das Ergebnis wie erwartet ist.

+0

danke, habe das nicht bemerkt! änderte es, aber mein Programm noch Fehler auf/ab, leider – Swaglina

+0

Ich stimme mit diesem ammportal überein, wenn ich den Python-Code in 'down = np.sum ((ytrain == i + 1)) + a + b -2 geändert habe 'Ich habe die gleiche Antwort in Python wie in Matlab. – qbzenker

+0

@Lin K Für mich nach dieser Änderung gibt es keinen Fehler.Sind Sie sicher, dass Ihr Code korrekt ist und nichts anderes störend ist? Ich habe meine Antwort bearbeitet, um die Ausgabe anzuzeigen, die ich erhalte. – anyanwu

Verwandte Themen