要计算两个对象的相似性,有很多种方法可以做相关性分析。

简单的举例几个常用的样本相似性度量方法:
欧式距离(Euclidean Distance)
汉明距离(Hamming Distance)
曼哈顿距离(Manhattan Distance)
余弦相似度(Cosine)
修正余弦相似度(Adjusted Cosine)
皮尔逊相关系数(Pearson)
斯皮尔曼相关系数(Spearman)

1、 欧式距离(Euclidean Distance)

欧式距离全称是欧几里距离,是最易于理解的一种距离计算方式,这里不多介绍。

2、汉明距离(Hamming distance)

汉明距离表示的是两个字符串(相同长度)对应位不同的数量。比如有两个等长的字符串 str1 = “0001” 和 str2 = “0100” 那么它们之间的汉明距离就是2。汉明距离多用于图像像素的匹配(同图搜索)。

3.曼哈顿距离(Manhattan Distance)
想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,那么驾驶的最近距离并不是直线距离,因为你不可能横穿房屋。所以,曼哈顿距离表示的就是你的实际驾驶距离,即两个点在标准坐标系上的绝对轴距总和。

4.余弦相似度(Cosine)

即,高维度上的“余弦夹角”。
夹角越小,余弦值越接近于1,则越正相关;反之趋于-1则负相关。趋于0则不相关。

欧式距离和夹角余弦的区别:
夹角余弦更能反映两者之间的变动趋势,对向量的方向更敏感,对绝对的数值不敏感,而欧式距离较则对数值敏感。

5.修正余弦相似度(Adjusted Cosine)
为什么需要在余弦相似度的基础上使用修正余弦相似度?请看下面这个例子:
有两用户对两个内容评分,按5分制,X和Y两个用户对这两个内容的评分分别为(1,2)和(4,5),使用余弦相似度得到的结果是0.98,两者极为相似。但从评分上看X似乎不喜欢第2个内容,而Y则比较喜欢,余弦相似度对数值的不敏感导致了结果的误差,需要修正这种不合理性就出现了调整余弦相似度,即所有维度上的数值都减去所有评分的均值,比如X和Y的评分均值是(1+2+4+5)/4=3,那么调整后为(-2,-1)和(1,2),再用余弦相似度计算,得到-0.8。

6、皮尔逊相关系数(Pearson Correlation Coefficient)

皮尔逊相关系数公式实际上就是在计算夹角余弦之前将两个向量减去各个样本的平均值,达到中心化的目的。皮尔逊相关函数是余弦相似度在维度缺失上面的一种改进方法。

7.斯皮尔曼相关系数(Spearman)

斯皮尔曼相关系数被定义成等级变量之间的皮尔逊相关系数。注意:当变量的两个值相同时,它们的排行是通过对它们位置进行平均而得到的。
例如:
有变量A =(10,8.9,4.5,4.5,2,0.6),其对应按降序的等级变量是xi=(6,5,3.5,3.5,2,1)。变量B =(4,28.1,8,7.5,2.9,5),其对应按降序的等级变量是yi=(5,1,2,3,6,4)。

它是衡量两个变量的依赖性的 非参数 指标。 它利用单调方程评价两个统计变量的相关性。 如果数据中没有重复值, 并且当两个变量完全单调相关时,斯皮尔曼相关系数则为+1或−1。

总结:

  • 如果数据存在“分数膨胀”,可用皮尔逊相关系数。
  • 如果数据之间比较“密集”,数据比较完整,变量之间基本存在公有值,且这些距离数据是非常重要的,那就使用欧几里得或曼哈顿距离。
  • (空缺值处理:用0代替空缺值的方法可能会造成较大误差,“平均值”填充效果好于0值填充)
  • 如果数据是稀疏的,则使用余弦相似度。

其他相关参考:

  • 5种常用的相关分析方法:http://bluewhale.cc/2016-06-30/analysis-of-correlation.html
  • Pearson相关系数和Spearman相关系数的区别:https://blog.csdn.net/Android_xue/article/details/100136612

对应C++代码:

bool Cosine(double* A, double* B, V3DLONG Length, double &similarity)
{//余弦相似度
//   similarity   相关性
//    0.8-1.0     极强相关
//    0.6-0.8     强相关
//    0.4-0.6     中等程度相关
//    0.2-0.4     弱相关
//    0.0-0.2     极弱相关或无相关//计算相关系数double R1(0), R2(0), R3(0);for (long i = 0; i < Length; i++){R1 += A[i] * B[i];R2 += pow(A[i], 2);R3 += pow(B[i], 2);}similarity = R1 / sqrt(R2*R3);return true;
}
bool AdjustedCosine(double* A, double* B, V3DLONG Length, double &similarity)
{//修正余弦相似度
//   similarity   相关性
//    0.8-1.0     极强相关
//    0.6-0.8     强相关
//    0.4-0.6     中等程度相关
//    0.2-0.4     弱相关
//    0.0-0.2     极弱相关或无相关double sum(0.0), ave(0.0);//求和for(int i=0; i<Length; i++){sum+=A[i];}for(int i=0; i<Length; i++){sum+=B[i];}//求平均值ave = sum / double(Length*2);//计算相关系数double R1(0), R2(0), R3(0);for (long i = 0; i < Length; i++){R1 += (A[i] - ave) * (B[i] - ave);R2 += pow((A[i] - ave), 2);R3 += pow((B[i] - ave), 2);}similarity = R1 / sqrt(R2*R3);return true;
}
bool Pearson(double* A, double* B, V3DLONG Length, double &similarity)
{//皮尔逊相关系数
//   similarity   相关性
//    0.8-1.0     极强相关
//    0.6-0.8     强相关
//    0.4-0.6     中等程度相关
//    0.2-0.4     弱相关
//    0.0-0.2     极弱相关或无相关double sumA(0.0), sumB(0.0), aveA(0.0), aveB(0.0);//求和for(int i=0; i<Length; i++){sumA+=A[i];}for(int i=0; i<Length; i++){sumB+=B[i];}//求平均值aveA = sumA / double(Length);aveB = sumB / double(Length);//计算相关系数double R1(0), R2(0), R3(0);for (long i = 0; i < Length; i++){R1 += (A[i] - aveA) * (B[i] - aveB);R2 += pow((A[i] - aveA), 2);R3 += pow((B[i] - aveB), 2);}similarity = R1 / sqrt(R2*R3);return true;
}
bool SpearmanLevel(double* A, V3DLONG Length, vector<double> &level)
{//先冒泡排序,对应等级为1~Length,再检查重复值,将其等级修改为平均等级double* sortedA = new double[Length];for (V3DLONG i = 0; i < Length; i++) {sortedA[i] = A[i];}level.clear();for (V3DLONG i = 0; i < Length; i++) {level.push_back(i+1);}for (V3DLONG i = 0; i < Length - 1; i++){for (V3DLONG j = 0; j < Length - 1 - i; j++){if (sortedA[j] > sortedA[j+1])         // 相邻元素两两对比{double temp = sortedA[j+1];        // 元素交换sortedA[j+1] = sortedA[j];sortedA[j] = temp;}}}//排序已完成,开始检查是否有相同的数组元素,如果有,则其索引变为对应索引均值double tmp_sum_level = 0; V3DLONG count_repeat = 0;for (V3DLONG i = 1; i < Length; i++){if(sortedA[i] == sortedA[i-1]){tmp_sum_level += level[i-1];count_repeat++;}else{if(count_repeat>0){tmp_sum_level += level[i];double tmp_ave_level = tmp_sum_level/(count_repeat+1);for(V3DLONG j=i; j>i-(count_repeat+1); j--){   level[j] = tmp_ave_level; }count_repeat = 0; tmp_sum_level = 0;}}if((i==Length-1)&&(count_repeat>0)){tmp_sum_level += level[i];double tmp_ave_level = tmp_sum_level/(count_repeat+1);for(V3DLONG j=i; j>i-(count_repeat+1); j--){   level[j] = tmp_ave_level; }}}if(sortedA){delete []sortedA; sortedA=NULL;}return true;
}bool Spearman(double* A, double* B, V3DLONG Length, double &similarity)
{//斯皮尔曼相关系数
//   similarity   相关性
//    0.8-1.0     极强相关
//    0.6-0.8     强相关
//    0.4-0.6     中等程度相关
//    0.2-0.4     弱相关
//    0.0-0.2     极弱相关或无相关vector<double> levelA, levelB;SpearmanLevel(A,Length,levelA); SpearmanLevel(B,Length,levelB);double sumA(0.0), sumB(0.0), aveA(0.0), aveB(0.0);//求和for(int i=0; i<Length; i++){sumA+=levelA[i];}for(int i=0; i<Length; i++){sumB+=levelB[i];}//求平均值aveA = sumA / double(Length);aveB = sumB / double(Length);//计算相关系数double R1(0), R2(0), R3(0);for (long i = 0; i < Length; i++){R1 += (levelA[i] - aveA) * (levelB[i] - aveB);R2 += pow((levelA[i] - aveA), 2);R3 += pow((levelB[i] - aveB), 2);}similarity = R1 / sqrt(R2*R3);return true;
}

相关性分析和相似度计算相关推荐

  1. iMeta | 张彦琼/许海玉/周雪忠联合开发基于SoFDA病-证-方关联的本体表征、富集分析和相似度计算评价...

    点击蓝字 关注我们 基于SoFDA病-证-方关联的本体表征.富集分析和相似度计算评价 iMeta主页:http://www.imeta.science 方法论文 ● 原文链接DOI: https:// ...

  2. 文本分析—余弦相似度计算

    文本分析-余弦相似度计算 一.余弦相似度简介 欧几里得点积公式:a · b = || a || || b || cosθ 我们从图中可以看出,利用两个向量之间夹角的余弦值来代表两个向量之间的差异. 那 ...

  3. Python_文本分析_困惑度计算和一致性检验

    在做LDA的过程中比较比较难的问题就是主题数的确定,下面介绍困惑度.一致性这两种方法的实现. 其中的一些LDA的参数需要结合自己的实际进行设定 直接计算出的log_perplexity是负值,是困惑度 ...

  4. snownlp 中文文本情感分析、相似度计算、分词等

    snownlp 官网:https://pypi.org/project/snownlp/ SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了[TextBlob](https ...

  5. python实现词语相似度计算分析_相似度计算的方法及Python实现

    现实生活中,我们经常提到距离这个词,本文谈的相似度就是基于距离定义的,当两个向量之间的距离特别小时,就说这俩个向量相似度高,反之相似度不高.所以,衡量相似度的指标就是距离度量. 经常使用的相似度计算公 ...

  6. 关联分析中的支持度、置信度和提升度 计算

    目录 项集(Itemset) 事务的宽度 支持度.置信度和提升度 定义 例一 例二 项集(Itemset) 包含0个或多个项的集合,如果包含k个项,则称为k-项集. 事务的宽度 事务中出现的项的个数 ...

  7. 基于滑动窗口的时间序列数据相关性分析计算

    在以往的项目中,我们想要计算时间序列的相关性的话,大都是把整体的数据中不同维度的数据当做是一个整体序列来进行两两序列之间的相关性分析计算,也比较简洁实用一些,这里今天遇上一个新的需求就是,我们需要把滑 ...

  8. R语言相关性计算及使用ggcorrplot包相关性分析热力图可视化分析实战

    R语言相关性计算及使用ggcorrplot包相关性分析热力图可视化分析实战 目录 R语言相关性计算及使用ggcorrplot包相关性分析热力图可视化分析实战

  9. pytorch 模型可视化_PyTorch Tips(FLOPs计算/参数量/计算图可视化/相关性分析)

    最近在做Research Project的时候,发现有些小工具很好用,记录在此. 1. 准确的FLOPS 计算 网上开源的很多计算flops的工具只支持计算PyTorch内置层的flops,不能有效计 ...

最新文章

  1. C++ 协程介绍[译]
  2. 深度学习被高频引用的41篇论文下载(附下载)
  3. smbus使用 树莓派_树莓派学习笔记——I2C使用 PCF8574 Python SMBUS
  4. John细说PHP的验证码
  5. 联想EDU同传系统 版本7.5 7.6在机房中出现的一些故障和解决办法
  6. 台州银行登录显示服务器异常,台州银行网上银行异常问题处理
  7. matlab张量工具初步
  8. 结对开发——返回一个整数数组中最大子数组的和 (首尾相接版)
  9. python跳出循环重新开始_python怎么跳出循环
  10. c#web页面显示弹窗_C# .NET弹出窗口
  11. 敏捷个人:免费下载【敏捷个人 –认识自我、管理自我 V0.2.pdf】
  12. 【数据库】数据库安全(授权,回收)
  13. 贴片铝电容识别及型号_贴片式铝电解电容常用型号封装
  14. python游戏解法图_python 游戏(记忆拼图Memory_Puzzle)
  15. 微信小程序html的font-size,字体大小(font-size)
  16. sklearn预测员工离职率
  17. APM —全链路追踪
  18. 【火炉炼AI】机器学习031-KNN回归器模型的构建
  19. 关于pip 的依赖项解析器当前未考虑安装的所有包。此行为是以下依赖项冲突的根源。
  20. 去除push完数组里面的逗号

热门文章

  1. python m4a转mp3_python脚本实现音频m4a格式转成MP3格式
  2. B05 - 008、什么是大数据
  3. oracle reco进程停止,oracle的后台进程能否杀掉
  4. php中单选框可以默认选中吗,php selectradio和checkbox默认选择的简单示例
  5. 五子棋(含较高级的人机对战)
  6. type Vector takes type parameters
  7. 基于云的文档管理软件/文档管理系统(DMS)
  8. Java Stream map flatMap mapMulti的升维和降维
  9. 翻译程序、编译程序和解释程序的区别和联系
  10. 关于微信第三方平台$APPID$.wx.abc.com的问题