向量相似度java_特征向量相似度和距离的计算

1 /*2 特征向量相似度和距离的计算3 4 相似度:5 ·夹角余弦6 ·相关系数7 ·Dice8 ·Jaccard9 10 距离11 ·明氏距离12 ·欧氏距离13 ·马氏距离14 ·Jffreys & Matusita 距离15 ·Mahalanobis 距离,未实现,协方差矩阵16 ·Camberra 距离(Lance 距离,Williams 距离)17 */18 19 #include20 #include21 #include22 #include23 usingnamespacestd;24 25 doubledotProduct(constvector&v1,constvector&v2)26 {27 assert(v1.size()==v2.size());28 doubleret=0.0;29 for(vector::size_type i=0; i!=v1.size();++i)30 {31 ret+=v1[i]*v2[i];32 }33 returnret;34 }35 36 doublemodule(constvector&v)37 {38 doubleret=0.0;39 for(vector::size_type i=0; i!=v.size();++i)40 {41 ret+=v[i]*v[i];42 }43 returnsqrt(ret);44 }45 46 //夹角余弦47 doublecosine(constvector&v1,constvector&v2)48 {49 assert(v1.size()==v2.size());50 returndotProduct(v1, v2)/(module(v1)*module(v2));51 }52 53 doublemean(constvector&v)54 {55 assert(v.size()!=0);56 doubleret=0.0;57 for(vector::size_type i=0; i!=v.size();++i)58 {59 ret+=v[i];60 }61 returnret/v.size();62 }63 64 doublecov(constvector&v1,constvector&v2)65 {66 assert(v1.size()==v2.size()&&v1.size()>1);67 doubleret=0.0;68 doublev1a=mean(v1), v2a=mean(v2);69 70 for(vector::size_type i=0; i!=v1.size();++i)71 {72 ret+=(v1[i]-v1a)*(v2[i]-v2a);73 }74 75 returnret/(v1.size()-1);76 }77 78 //相关系数79 doublecoefficient(constvector&v1,constvector&v2)80 {81 assert(v1.size()==v2.size());82 returncov(v1, v2)/sqrt(cov(v1, v1)*cov(v2, v2));83 }84 85 //Dice 系数86 doubledice(constvector&v1,constvector&v2)87 {88 assert(v1.size()==v2.size());89 return2.0*dotProduct(v1, v2)/(dotProduct(v1, v1)+dotProduct(v2, v2));90 }91 92 //Jaccard 系数93 doublejaccard(constvector&v1,constvector&v2)94 {95 assert(v1.size()==v2.size());96 returndotProduct(v1, v2)/(dotProduct(v1, v2)+dotProduct(v2, v2)-dotProduct(v1, v2));97 }98 99 //Minkowsky 距离100 doubleminkowsky(constvector&v1,constvector&v2,doublem)101 {102 assert(v1.size()==v2.size());103 doubleret=0.0;104 for(vector::size_type i=0; i!=v1.size();++i)105 {106 ret+=pow(abs(v1[i]-v2[i]), m);107 }108 returnpow(ret,1.0/m);109 }110 111 //Euclidean 距离112 doubleeuclidean(constvector&v1,constvector&v2)113 {114 assert(v1.size()==v2.size());115 returnminkowsky(v1, v2,2.0);116 }117 118 //Manhattan 距离119 doublemanhattan(constvector&v1,constvector&v2)120 {121 assert(v1.size()==v2.size());122 returnminkowsky(v1, v2,1.0);123 }124 125 //Jffreys & Matusita 距离126 doublejffreysMatusita(constvector&v1,constvector&v2)127 {128 assert(v1.size()==v2.size());129 doubleret=0.0;130 for(vector::size_type i=0; i!=v1.size();++i)131 {132 ret+=(sqrt(v1[i])-sqrt(v2[i]))*(sqrt(v1[i])-sqrt(v2[i]));133 }134 returnsqrt(ret);135 }136 137 //Mahalanobis 距离138 doublemahalanobis(constvector&v1,constvector&v2)139 {140 assert(v1.size()==v2.size());141 return0.0;142 }143 144 //Camberra 距离(Lance 距离,Williams 距离)145 doublecamberra(constvector&v1,constvector&v2)146 {147 assert(v1.size()==v2.size());148 doubleret=0.0;149 for(vector::size_type i=0; i!=v1.size();++i)150 {151 ret+=abs(v1[i]-v2[i])/abs(v1[i]+v2[i]);152 }153 returnret;154 }155 156 intmain()157 {158 doublea[]={1,2,3,4,5};159 doubleb[]={5,4,3,2,1};160 vectorv1(a, a+sizeof(a)/sizeof(*a)), v2(b, b+sizeof(b)/sizeof(*b));161 162 cout<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值