I have a clustering algorithm, where if I use an euclidian distance as similarity, it works well on any dataset. If I replace it by a cosine similarity (see my code bellow), it will give a degenerate results (will not work at all). Did I do an error in coding this cosine similarity or it is the cosine similarity that should by nature work only on some kind of data ?!
And by the way, this is a "similarity", is there any different between it and the "distance" ?
Here are example vectors from two datasets that I use. The second dataset may contain many repeated vectors:
Examples from dataset1: http://pastebin.com/6iYcqgWF
Examples from dataset2: http://pastebin.com/4MtLXwp7
Note: the square is just because the function is called under a root in the main program ..
// My squared euclidean distance similarity
float computeSqrDistance(vector<float> pos1, vector<float> pos2)
{
float sum = 0;
for(unsigned int i = 0; i < pos1.size(); ++i)
{
sum += pow( (pos1[i] - pos2[i]), 2.0 );
}
return sum;
}
// My squared cosine distance similarity
float computeSqrDistance(vector<float> pos1, vector<float> pos2)
{
float sum0 = 0, sum1 = 0, sum2 = 0;
for(unsigned int i = 0; i < pos1.size(); ++i)
{
sum0 += pos1[i] * pos2[i];
sum1 += (pos1[i]*pos1[i]);
sum2 += (pos2[i]*pos2[i]);
}
float similarity = sum0 / ( sqrt(sum1) * sqrt(sum2) );
similarity = 1 - (acos(similarity) / M_PI);
return (similarity*similarity);
}