两数据间的余弦相似度:
cos
θ
=
∑
i
n
x
i
y
i
∑
i
n
x
i
2
∑
i
n
y
i
2
\cos \theta=\frac{\sum_{i}^{n} x_{i} y_{i}}{\sqrt{\sum_{i}^{n} x_{i}^{2}} \sqrt{\sum_{i}^{n} y_{i}^{2}}}
cosθ=∑inxi2∑inyi2∑inxiyi
c++代码:
void similarity(const vector< vector<float> >& similar, vector< vector<float> >& simil)
{
vector<float> s1_t;
for(int i=0;i<similar.size();i++)
{
float s1=0;
for(int j=0;j<similar[i].size();j++)
{
s1=s1+similar[i][j]*similar[i][j];
}
s1_t.push_back(s1);
}
vector< vector<float> > s2_t;
for(int i=0;i<similar.size();i++)
{
vector<float> s2;
for(int j=0;j<similar.size();j++)
{
float s2_=0;
for(int k=0;k<similar[j].size();k++)
{
s2_=s2_+similar[i][k]*similar[j][k];
}
s2.push_back(s2_);
}
s2_t.push_back(s2);
}
for(int i=0;i<similar.size();i++)
{
vector<float>s3_;
for(int j=0;j<similar.size();j++)
{
float s3=0;
s3=s2_t[i][j]/(sqrt(s1_t[i])*sqrt(s1_t[j]));
s3_.push_back(s3);
}
simil.push_back(s3_);
}
}
数据如:
x:1 2 3 4 5 6 7 8 9 0
y:1 2 3 4 5 6 7 8 9 9
z:1 2 3 4 5 6 7 7 8 8
w:1 2 3 4 5 6 7 8 9 9
h:1 1 1 1 1 1 1 1 1 1
返回值:各向量间相似度
x | y | z | w | h | |
---|---|---|---|---|---|
x | |||||
y | |||||
z | |||||
h | |||||
w |