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.
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
Das elementweise Produkt '. *' Mit Punkt-Punkt 'Punkt' zu ersetzen ist wahrscheinlich falsch. Das elementweise Produkt in numpy ist '*'. – kazemakase
@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