Skip to content

Commit

Permalink
Use linalg in GMM (shogun-toolbox#2747)
Browse files Browse the repository at this point in the history
  • Loading branch information
vinx13 committed Jan 14, 2018
1 parent 0b1383d commit 07bf74a
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 41 deletions.
11 changes: 2 additions & 9 deletions src/shogun/clustering/GMM.cpp
Expand Up @@ -9,15 +9,12 @@
*/
#include <shogun/lib/config.h>

#ifdef HAVE_LAPACK

#include <shogun/base/Parameter.h>
#include <shogun/clustering/GMM.h>
#include <shogun/clustering/KMeans.h>
#include <shogun/distance/EuclideanDistance.h>
#include <shogun/labels/MulticlassLabels.h>
#include <shogun/mathematics/Math.h>
#include <shogun/mathematics/lapack.h>
#include <shogun/mathematics/linalg/LinalgNamespace.h>
#include <shogun/multiclass/KNN.h>
#include <vector>
Expand Down Expand Up @@ -585,11 +582,8 @@ void CGMM::max_likelihood(SGMatrix<float64_t> alpha, float64_t min_cov)
switch (cov_type)
{
case FULL:
cblas_dger(
CblasRowMajor, num_dim, num_dim,
alpha.matrix[j * alpha.num_cols + i], v.vector, 1,
v.vector, 1, (double*)cov_sum.matrix, num_dim);

linalg::dger(
alpha.matrix[j * alpha.num_cols + i], v, v, cov_sum);
break;
case DIAG:
{
Expand Down Expand Up @@ -827,4 +821,3 @@ void CGMM::register_params()
m_parameters->add(&m_coefficients, "m_coefficients", "Mixture coefficients.");
}

#endif
3 changes: 0 additions & 3 deletions src/shogun/clustering/GMM.h
Expand Up @@ -12,8 +12,6 @@

#include <shogun/lib/config.h>

#ifdef HAVE_LAPACK

#include <shogun/distributions/Distribution.h>
#include <shogun/distributions/Gaussian.h>
#include <shogun/lib/common.h>
Expand Down Expand Up @@ -249,5 +247,4 @@ class CGMM : public CDistribution
SGVector<float64_t> m_coefficients;
};
}
#endif //HAVE_LAPACK
#endif //_GMM_H__
60 changes: 31 additions & 29 deletions tests/unit/clustering/gmm_unittest.cc
Expand Up @@ -5,55 +5,60 @@
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* 1. Redistributions of source code must retain the above copyright notice,
* this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
* FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those
* of the authors and should not be interpreted as representing official policies,
* The views and conclusions contained in the software and documentation are
* those
* of the authors and should not be interpreted as representing official
* policies,
* either expressed or implied, of the Shogun Development Team.
*
* Authors: 2018 Wuwei Lin
* Written (W) 2018 Wuwei Lin
*/

#include <shogun/lib/common.h>
#include <shogun/features/DenseFeatures.h>
#include <shogun/clustering/GMM.h>
#include <gtest/gtest.h>
#include <shogun/base/some.h>
#include <shogun/clustering/GMM.h>
#include <shogun/features/DenseFeatures.h>
#include <shogun/lib/common.h>

using namespace shogun;

TEST(GMM, train_em_full_cov)
{
/*create a rectangle with four points as (0,0) (1,7) (10,6) (4,4) */
SGMatrix<float64_t> rect(2, 4);
rect(0,0)=0;
rect(0,1)=1;
rect(0,2)=10;
rect(0,3)=4;
rect(1,0)=0;
rect(1,1)=7;
rect(1,2)=6;
rect(1,3)=4;
rect(0, 0) = 0;
rect(0, 1) = 1;
rect(0, 2) = 10;
rect(0, 3) = 4;
rect(1, 0) = 0;
rect(1, 1) = 7;
rect(1, 2) = 6;
rect(1, 3) = 4;

const int num_components = 2;
CGMM *clustering = new CGMM(num_components, FULL);
CDenseFeatures<float64_t>* features=new CDenseFeatures<float64_t>(rect);
SG_REF(clustering);
SG_REF(features);
auto clustering = some<CGMM>(num_components, FULL);
auto features = some<CDenseFeatures<float64_t> >(rect);

clustering->train(features);
clustering->train_em();
Expand All @@ -72,14 +77,11 @@ TEST(GMM, train_em_full_cov)
EXPECT_NEAR(mean[1], 7.0, 1e-10);

SGVector<float64_t> cov = clustering->get_nth_cov(0);
EXPECT_NEAR(cov[0], 16.88888888888, 1e-10);
EXPECT_NEAR(cov[1], 9.77777777777, 1e-10);
EXPECT_NEAR(cov[0], 16.88888888888, 1e-10);
EXPECT_NEAR(cov[1], 9.77777777777, 1e-10);

cov = clustering->get_nth_cov(1);
EXPECT_NEAR(cov[0], 0.000000001, 1e-10);
EXPECT_NEAR(cov[1], 0.0, 1e-10);
EXPECT_NEAR(cov[0], 0.000000001, 1e-10);
EXPECT_NEAR(cov[1], 0.0, 1e-10);

SG_UNREF(clustering);
SG_UNREF(features);
}

0 comments on commit 07bf74a

Please sign in to comment.