2
$\begingroup$

Suppose that I have the following vectors $v_1$, $v_2$, $v_3$ $\in R^n$,$n= 9$. What I want to do exactly is to combine these $3$ vectors into $1$ representative vector $V$.


According to the following article: Document Classification and Page Stream Segmentation for Digital Mailroom Applications

  • they Perform at first average pooling or just the mean of the $3$ vectors to obtain a single representation of the $3$ vectors
  • The new vector is then L2-Normalized

This is how I interpreted these steps by using the following example:

$v_1 = \ [ x_1,x_2,...,x_n \ ]$

$v_2 = \ [ y_1,y_2,...,y_n \ ]$

$v_3 = \ [ z_1,z_2,...,z_n \ ]$

Step 1: Average Pooling

$V = \frac{v_1 + v_2 + v_3}{3}$

$V = \ [ w_1,w_2,...,w_n \ ]$

$V$ is the vector after the average pooling or mean


Step 2: L2-Norm

$Norm = \sqrt{w_1^2+\ldots+w_n^2}$


Step 3 : divide the components $w_i$ of $V$ by the $Norm$

Are these steps correct?


Code Sample :

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;

int main()
{
     const int size = 5;
     vector<float> v1{1,1,1,1,1};
     vector<float> v2{1,1,1,1,1};
     vector<float> v3{1,1,1,1,1};
     vector<vector<float>> V;
     V.push_back(v1);
     V.push_back(v2);
     V.push_back(v3);
     vector<float> doc(size,0.0);
     //============================================//
     //STEP 1: Average Pooling
     for(size_t i = 0; i < V.size();i++)
     {
         for(size_t j = 0; j < 5;j++)
         {
             doc[j] += V[i][j];
         }
     }

     for(size_t i = 0; i < doc.size();i++)
     {
        doc[i]= doc[i]/(float) V.size();
     }
    //============================================//
    //STEP 2: L2-Normalization
     float y =  *max_element(std::begin(doc), std::end(doc));
     float m_sum = 0.0;

     for (int k = 0; k < doc.size(); k++)
     {
        m_sum +=  pow(doc[k]/y,2);
     }
     //STEP 3: Divide components by the Norm (m_sum)
     for(size_t i = 0; i < V.size();i++)
     {
        cout << doc[i]/sqrt(m_sum)<<"  ";
     }
     cout << endl;
     return 0;
}
$\endgroup$

1 Answer 1

3
$\begingroup$

My interpretation of this sentence is the same as yours, and I would have implemented the algorithm the same way.

$\endgroup$
1
  • $\begingroup$ ok @Wolfgang Bangerth thank you. Sounds good to me $\endgroup$
    – Hani Gotc
    Commented Dec 5, 2013 at 13:02

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.