结合nn向量使用L 2 - n o r m a l i z我_ _ _ _L2−normalization

计算科学 算法 向量
2021-12-03 01:14:29

假设我有以下向量v1,v2,v3 Rn,n=9. 我想要做的就是将这些结合起来3向量成1代表向量V.


根据以下文章:数字邮件室应用程序的文档分类和页面流分割

  • 他们首先执行平均池化或仅执行3 向量以获得单个表示3矢量图
  • 然后将新向量进行L2 归一化

这就是我使用以下示例解释这些步骤的方式:

v1= [x1,x2,...,xn ]

v2= [y1,y2,...,yn ]

v3= [z1,z2,...,zn ]

第 1 步:平均池化

V=v1+v2+v33

V= [w1,w2,...,wn ]

V是平均池化后的向量或均值


第 2 步:L2 范数

Norm=w12++wn2


第 3 步:划分组件wiVNorm

这些步骤正确吗?


代码示例:

#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;
}
1个回答

我对这句话的解释和你的一样,我会以同样的方式实现算法。