/
test_principal_component_analysis.cc
52 lines (37 loc) · 1.51 KB
/
test_principal_component_analysis.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <tests/Base.hh>
#include <aleph/config/Eigen.hh>
#include <aleph/math/PrincipalComponentAnalysis.hh>
#include <algorithm>
#include <iterator>
#include <vector>
#include <cmath>
template <class T> void testSimpleMatrix()
{
ALEPH_TEST_BEGIN( "Simple matrix" );
std::vector< std::vector<T> > matrix( 3, std::vector<T>( 2 ) );
matrix[0][0] = T( 2.0/3.0); matrix[0][1] = T(-3.0 - 2.0/3.0);
matrix[1][0] = T( 2.0/3.0); matrix[1][1] = T( 4.0 + 1.0/3.0);
matrix[2][0] = T(-4.0/3.0); matrix[2][1] = T(-2.0/3.0 );
aleph::math::PrincipalComponentAnalysis pca;
auto result = pca( matrix );
std::vector<T> eigenvalues;
std::transform( result.singularValues.begin(), result.singularValues.end(),
std::back_inserter( eigenvalues ),
[] ( T value ) { return value * value; } );
ALEPH_ASSERT_THROW( eigenvalues.empty() == false );
ALEPH_ASSERT_EQUAL( eigenvalues.size(), 2 );
ALEPH_ASSERT_THROW( std::abs( eigenvalues[0] - 16.3629 ) < 1e-4 );
ALEPH_ASSERT_THROW( std::abs( eigenvalues[1] - 1.3037 ) < 1e-4 );
ALEPH_ASSERT_THROW( std::abs( result.components[0][0] - 0.0443134 ) < 1e-6 );
ALEPH_ASSERT_THROW( std::abs( result.components[0][1] - 0.9990180 ) < 1e-6 );
ALEPH_ASSERT_THROW( std::abs( result.components[1][0] - 0.9990180 ) < 1e-6 );
ALEPH_ASSERT_THROW( std::abs( result.components[1][1] + 0.0443134 ) < 1e-6 );
ALEPH_TEST_END();
}
int main(int, char**)
{
#ifdef ALEPH_WITH_EIGEN
testSimpleMatrix<float> ();
testSimpleMatrix<double>();
#endif
}