假设我有以下向量,, ,. 我想要做的就是将这些结合起来向量成代表向量.
根据以下文章:数字邮件室应用程序的文档分类和页面流分割
- 他们首先执行平均池化或仅执行 向量以获得单个表示矢量图
- 然后将新向量进行L2 归一化
这就是我使用以下示例解释这些步骤的方式:
第 1 步:平均池化
是平均池化后的向量或均值
第 2 步:L2 范数
第 3 步:划分组件的由
这些步骤正确吗?
代码示例:
#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;
}