SHOGUN
v3.2.0
|
00001 /* 00002 * This program is free software; you can redistribute it and/or modify 00003 * it under the terms of the GNU General Public License as published by 00004 * the Free Software Foundation; either version 3 of the License, or 00005 * (at your option) any later version. 00006 * 00007 * Written (W) 2012 Viktor Gal 00008 * Copyright (C) 2012 Viktor Gal 00009 */ 00010 00011 #include <shogun/preprocessor/PNorm.h> 00012 #include <shogun/preprocessor/DensePreprocessor.h> 00013 #include <shogun/mathematics/Math.h> 00014 #include <shogun/features/Features.h> 00015 00016 #ifdef HAVE_LAPACK 00017 #include <shogun/mathematics/lapack.h> 00018 #endif 00019 00020 using namespace shogun; 00021 00022 CPNorm::CPNorm () 00023 : CDensePreprocessor<float64_t>(), 00024 m_p (2.0) 00025 { 00026 register_param (); 00027 } 00028 00029 CPNorm::CPNorm (double p) 00030 : CDensePreprocessor<float64_t>(), 00031 m_p (p) 00032 { 00033 ASSERT (m_p >= 1.0) 00034 register_param (); 00035 } 00036 00037 CPNorm::~CPNorm () 00038 { 00039 } 00040 00042 bool CPNorm::init (CFeatures* features) 00043 { 00044 ASSERT(features->get_feature_class()==C_DENSE) 00045 ASSERT(features->get_feature_type()==F_DREAL) 00046 00047 return true; 00048 } 00049 00051 void CPNorm::cleanup () 00052 { 00053 } 00054 00056 bool CPNorm::load (FILE* f) 00057 { 00058 SG_SET_LOCALE_C; 00059 SG_RESET_LOCALE; 00060 return false; 00061 } 00062 00064 bool CPNorm::save (FILE* f) 00065 { 00066 SG_SET_LOCALE_C; 00067 SG_RESET_LOCALE; 00068 return false; 00069 } 00070 00074 SGMatrix<float64_t> CPNorm::apply_to_feature_matrix (CFeatures* features) 00075 { 00076 SGMatrix<float64_t> feature_matrix=((CDenseFeatures<float64_t>*)features)->get_feature_matrix(); 00077 00078 for (int32_t i=0; i<feature_matrix.num_cols; i++) 00079 { 00080 float64_t* vec= &(feature_matrix.matrix[i*feature_matrix.num_rows]); 00081 float64_t norm = get_pnorm (vec, feature_matrix.num_rows); 00082 SGVector<float64_t>::scale_vector(1.0/norm, vec, feature_matrix.num_rows); 00083 } 00084 return feature_matrix; 00085 } 00086 00089 SGVector<float64_t> CPNorm::apply_to_feature_vector (SGVector<float64_t> vector) 00090 { 00091 float64_t* normed_vec = SG_MALLOC(float64_t, vector.vlen); 00092 float64_t norm = get_pnorm (vector.vector, vector.vlen); 00093 00094 for (int32_t i=0; i<vector.vlen; i++) 00095 normed_vec[i]=vector.vector[i]/norm; 00096 00097 return SGVector<float64_t>(normed_vec,vector.vlen); 00098 } 00099 00100 void CPNorm::set_pnorm (double pnorm) 00101 { 00102 ASSERT (pnorm >= 1.0) 00103 m_p = pnorm; 00104 register_param (); 00105 } 00106 00107 double CPNorm::get_pnorm () const 00108 { 00109 return m_p; 00110 } 00111 00112 void CPNorm::register_param () 00113 { 00114 m_parameters->add (&m_p, "norm", "P-norm parameter"); 00115 } 00116 00117 inline float64_t CPNorm::get_pnorm (float64_t* vec, int32_t vec_len) const 00118 { 00119 float64_t norm = 0.0; 00120 if (m_p == 1.0) 00121 { 00122 for (int i = 0; i < vec_len; ++i) 00123 norm += fabs (vec[i]); 00124 } 00125 else if (m_p == 2.0) 00126 { 00127 norm = SGVector<float64_t>::twonorm(vec, vec_len); 00128 } 00129 else 00130 { 00131 norm = SGVector<float64_t>::qnorm(vec, vec_len, m_p); 00132 } 00133 00134 return norm; 00135 }