diff --git a/scikits/learn/lda.py b/scikits/learn/lda.py index 0b71a4a82a01855fcda2bb1f0896507ace0f704f..25b05d8008a125496368984c08c87062ca1220ca 100644 --- a/scikits/learn/lda.py +++ b/scikits/learn/lda.py @@ -222,3 +222,19 @@ class LDA(BaseEstimator, ClassifierMixin): # compute posterior probabilities return likelihood / likelihood.sum(axis=1)[:, np.newaxis] + def predict_log_proba(self, X): + """ + This function return posterior log-probabilities of classification + according to each class on an array of test vectors X. + + Parameters + ---------- + X : array-like, shape = [n_samples, n_features] + + Returns + ------- + C : array, shape = [n_samples, n_classes] + """ + # XXX : can do better to avoid precision overflows + probas_ = self.predict_proba(X) + return np.log(probas_) diff --git a/scikits/learn/qda.py b/scikits/learn/qda.py index f0cf284177f0ad8bf1f51e67f7da0d4cb0bce780..c65fcd8ee18f643cf1cb989163184acfa6c21301 100644 --- a/scikits/learn/qda.py +++ b/scikits/learn/qda.py @@ -199,3 +199,20 @@ class QDA(BaseEstimator, ClassifierMixin): likelihood = np.exp(values - values.min(axis=1)[:, np.newaxis]) # compute posterior probabilities return likelihood / likelihood.sum(axis=1)[:, np.newaxis] + + def predict_log_proba(self, X): + """ + This function return posterior log-probabilities of classification + according to each class on an array of test vectors X. + + Parameters + ---------- + X : array-like, shape = [n_samples, n_features] + + Returns + ------- + C : array, shape = [n_samples, n_classes] + """ + # XXX : can do better to avoid precision overflows + probas_ = self.predict_proba(X) + return np.log(probas_) diff --git a/scikits/learn/tests/test_lda.py b/scikits/learn/tests/test_lda.py index 0fb1583f5f3e6608f4aefdd72ba4a9c78dea2d73..5bb82f2ab7debfadc81ab730a2ed5d29698229e3 100644 --- a/scikits/learn/tests/test_lda.py +++ b/scikits/learn/tests/test_lda.py @@ -1,5 +1,5 @@ import numpy as np -from numpy.testing import assert_array_equal +from numpy.testing import assert_array_equal, assert_array_almost_equal from nose.tools import assert_true from .. import lda @@ -29,6 +29,12 @@ def test_lda(): y_pred1 = clf.fit(X1, y).predict(X1) assert_array_equal(y_pred1, y) + # Test probas estimates + y_proba_pred1 = clf.predict_proba(X1) + assert_array_equal((y_proba_pred1[:,1] > 0.5) + 1, y) + y_log_proba_pred1 = clf.predict_log_proba(X1) + assert_array_almost_equal(np.exp(y_log_proba_pred1), y_proba_pred1, 8) + # Primarily test for commit 2f34950 -- "reuse" of priors y_pred3 = clf.fit(X, y3).predict(X) # LDA shouldn't be able to separate those diff --git a/scikits/learn/tests/test_qda.py b/scikits/learn/tests/test_qda.py index 8c699240e74b041b4edbe8f0976c44f6862a2b15..39352b2bec9ebc2cd37ce95eef709b97be592289 100644 --- a/scikits/learn/tests/test_qda.py +++ b/scikits/learn/tests/test_qda.py @@ -1,5 +1,5 @@ import numpy as np -from numpy.testing import assert_array_equal +from numpy.testing import assert_array_equal, assert_array_almost_equal from nose.tools import assert_true from .. import qda @@ -29,6 +29,12 @@ def test_qda(): y_pred1 = clf.fit(X1, y).predict(X1) assert_array_equal(y_pred1, y) + # Test probas estimates + y_proba_pred1 = clf.predict_proba(X1) + assert_array_equal((y_proba_pred1[:,1] > 0.5) + 1, y) + y_log_proba_pred1 = clf.predict_log_proba(X1) + assert_array_almost_equal(np.exp(y_log_proba_pred1), y_proba_pred1, 8) + y_pred3 = clf.fit(X, y3).predict(X) # QDA shouldn't be able to separate those assert_true(np.any(y_pred3 != y3))