Changeset 1536
- Timestamp:
- Sep 25, 2008, 9:31:57 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/test/normalization_test.cc
r1524 r1536 24 24 #include "yat/normalizer/Centralizer.h" 25 25 #include "yat/normalizer/ColumnNormalizer.h" 26 #include "yat/ utility/DataIterator.h"26 #include "yat/normalizer/Gauss.h" 27 27 #include "yat/normalizer/QuantileNormalizer.h" 28 28 #include "yat/normalizer/RowNormalizer.h" 29 29 #include "yat/normalizer/Spearman.h" 30 30 #include "yat/normalizer/Zscore.h" 31 #include "yat/utility/DataIterator.h" 31 32 32 33 #include "yat/utility/DataIterator.h" … … 41 42 void test_centralizer(test::Suite&); 42 43 void test_column_normalize(test::Suite&); 44 void test_gauss_normalize(test::Suite&); 43 45 void test_quantile_normalize(test::Suite&); 44 46 void test_row_normalize(test::Suite&); … … 55 57 test_column_normalize(suite); 56 58 test_quantile_normalize(suite); 59 test_gauss_normalize(suite); 57 60 test_row_normalize(suite); 58 61 test_spearman(suite); … … 178 181 179 182 183 void test_gauss_normalize(test::Suite& suite) 184 { 185 suite.err() << "Testing Gauss\n"; 186 normalizer::Gauss gauss; 187 std::vector<double> vec; 188 vec.push_back(1); 189 gauss(vec.begin(), vec.end(), vec.begin()); 190 suite.add(suite.equal(vec.front(), 0)); 191 vec.push_back(1); 192 gauss(vec.begin(), vec.end(), vec.begin()); 193 suite.add(suite.equal(vec.front(), -vec.back())); 194 195 } 196 180 197 void test_spearman_weighted(test::Suite& suite) 181 198 { -
trunk/yat/normalizer/Gauss.h
r1533 r1536 1 #ifndef _theplu_yat_normalizer_ spearman_2 #define _theplu_yat_normalizer_ spearman_1 #ifndef _theplu_yat_normalizer_gauss_ 2 #define _theplu_yat_normalizer_gauss_ 3 3 4 4 /* … … 21 21 */ 22 22 23 #include " yat/utility/DataIterator.h"23 #include "Spearman.h" 24 24 #include "yat/utility/iterator_traits.h" 25 #include "yat/utility/sort_index.h"26 #include "yat/utility/WeightIterator.h"27 25 28 #include <algorithm> 29 #include <functional> 30 #include <vector> 26 #include <gsl/gsl_cdf.h> 31 27 32 28 namespace theplu { … … 35 31 36 32 /** 37 \brief Replace elements with normalized rank33 \brief Gaussian Normalizer 38 34 39 35 \since New in yat 0.5 40 36 */ 41 class Spearman37 class Gauss 42 38 { 43 39 public: 44 /**45 \brief default constructor46 */47 Spearman(void){}48 49 40 /** 50 41 It is possible to centralize a range "in place"; it is … … 52 43 same. 53 44 54 Each element x is replaced by \f$ \frac{\sum I(x_i-x) 55 w_i}{\sum w_i} \f$ where I(x) = 1 for x>0, I(x) = 0.5 for x=0, 56 and I(x) = 0 for x<0. 45 The range is first rank normalized using Spearman, after which 46 each element is between 0 and unity. Second each element is 47 replaced by inverse cumulative standard Gaussian distribution. 48 49 After normalization the range will follow a standard Gaussian 50 distribution (mean zero and unity variance). 51 52 \see gsl_cdf_ugaussian_Pinv 57 53 58 54 \return result + (last-first) … … 62 58 RandomAccessIterator result) const 63 59 { 64 typename utility::weighted_iterator_traits<ForwardIterator>::type tag; 65 return normalize(first, last, result, tag); 60 Spearman spearman; 61 spearman(first, last, result); 62 RandomAccessIterator end = result + (last-first); 63 utility::iterator_traits<RandomAccessIterator> trait; 64 while (result != end) { 65 trait.data(result) = gsl_cdf_ugaussian_Pinv(trait.data(result)); 66 ++result; 67 } 68 69 return result; 66 70 } 67 71 68 72 69 73 private: 70 // unweighted version71 template<typename ForwardIterator, typename RandomAccessIterator>72 RandomAccessIterator normalize(ForwardIterator first, ForwardIterator last,73 RandomAccessIterator result,74 utility::unweighted_iterator_tag) const75 {76 std::vector<size_t> perm;77 utility::sort_index(first, last, perm);78 double n = perm.size();79 size_t i=0;80 while ( i<perm.size() ) {81 size_t min_i = i;82 while (i<perm.size() && first[perm[i]]<=first[perm[min_i]])83 ++i;84 double res = static_cast<double>(i + min_i)/(2*n);85 for ( ; min_i < i; ++min_i)86 result[perm[min_i]] = res;87 }88 return result + std::distance(first, last);89 }90 91 92 // weighted version93 template<typename ForwardIterator, typename RandomAccessIterator>94 RandomAccessIterator normalize(ForwardIterator first, ForwardIterator last,95 RandomAccessIterator result,96 utility::weighted_iterator_tag) const97 {98 std::copy(utility::weight_iterator(first),99 utility::weight_iterator(last),100 utility::weight_iterator(result));101 // set values with w=0 to 0 to avoid problems with NaNs102 utility::iterator_traits<ForwardIterator> trait;103 for (ForwardIterator i=first; i!=last; ++i)104 if (trait.weight(i)==0)105 trait.data(i)=0.0;106 107 std::vector<size_t> perm(std::distance(first, last));108 utility::sort_index(utility::data_iterator(first),109 utility::data_iterator(last), perm);110 utility::iterator_traits<RandomAccessIterator> rtrait;111 112 double sum_w=0;113 size_t i=0;114 while ( i<perm.size() ) {115 double w=0;116 size_t min_i = i;117 while (i<perm.size() && (trait.weight(first+perm[i])==0 ||118 trait.data(first+perm[i]) <=119 trait.data(first+perm[min_i])) ) {120 w += trait.weight(first+perm[i]);121 ++i;122 }123 double res=sum_w + 0.5*w;124 for ( size_t j=min_i; j<i; ++j)125 rtrait.data(result+perm[j]) = res;126 sum_w += w;127 }128 129 size_t n = std::distance(first, last);130 std::transform(utility::data_iterator(result),131 utility::data_iterator(result+n),132 utility::data_iterator(result),133 std::bind2nd(std::divides<double>(), sum_w));134 return result + n;135 }136 137 74 }; 138 75 -
trunk/yat/normalizer/Makefile.am
r1521 r1536 26 26 27 27 include_normalizer_HEADERS = Centralizer.h ColumnNormalizer.h \ 28 QuantileNormalizer.h RowNormalizer.h Spearman.h Zscore.h28 Gauss.h QuantileNormalizer.h RowNormalizer.h Spearman.h Zscore.h
Note: See TracChangeset
for help on using the changeset viewer.