python
import numpy as np
import math
def cosine_distance(a,b):
if a.shape != b.shape:
raise RuntimeError("array {} shape not match {}".format(a.shape, b.shape))
if a.ndim==1:
a_norm = np.linalg.norm(a)
b_norm = np.linalg.norm(b)
elif a.ndim==2:
a_norm = np.linalg.norm(a, axis=1, keepdims=True)
b_norm = np.linalg.norm(b, axis=1, keepdims=True)
else:
raise RuntimeError("array dimensions {} not right".format(a.ndim))
similiarity = np.dot(a, b.T)/(a_norm * b_norm.T) #计算相似度 [-1,1]
dist =similiarity #计算余弦距离:[0,2]
return dist
def getMold(vec,len):
sum = 0.0;
for i in range(len):
sum += vec[i] * vec[i]
return math.sqrt(sum)
def getSimilarity(lhs, rhs,len):
tmp = 0.0;
for i in range(len):
tmp += lhs[i] * rhs[i];
return tmp / (getMold(lhs,len)*getMold(rhs,len));
a=np.random.rand(100)
b=np.random.rand(100)
print(a)
print(b)
print(getSimilarity(a,b,100),cosine_distance(a,b))
c/c++
#include<stdio.h>
#include <math.h>
float getMold(float* vec,int len){ //求向量的模长
float sum = 0.0;
for (int i = 0; i<len; ++i)sum += vec[i] * vec[i];
return sqrt(sum);
}
float getSimilarity(float* lhs, float* rhs,int len){
float tmp = 0.0; //内积
for (int i = 0; i<len; ++i)tmp += lhs[i] * rhs[i];
return tmp / (getMold(lhs,len)*getMold(rhs,len));
}
int main(int argc, char const *argv[])
{
int len=128;
float a[len],b[len];
for (int i = 0; i < len; ++i)
{
a[i]=-100.5+0.2*i;
b[i]=1.5+0.2*i;
}
for (int i = 0; i < len; ++i)printf("%0.3f ",a[i]);printf("\n");
for (int i = 0; i < len; ++i)printf("%0.3f ",b[i]);printf("\n");
float c=getSimilarity(a,b,len);
printf("%f \n",c );
return 0;
}