皮尔逊相关度系数原理,以及java实现

转载请标明出处:http://blog.csdn.net/u010670689/article/details/41895105

1.原理:

以上列出的四个公式等价,其中E是数学期望,cov表示协方差,N表示变量取值的个数。

数学期望,协方差解释文章链接:http://blog.csdn.net/u010670689/article/details/41896399

相关系数的值介于–1与+1之间,即–1≤r≤+1。其性质如下:

  • 当r>0时,表示两变量正相关,r<0时,两变量为负相关
  • 当|r|=1时,表示两变量为完全线性相关,即为函数关系。
  • 当r=0时,表示两变量间无线性相关关系。
  • 当0<|r|<1时,表示两变量存在一定程度的线性相关。且|r|越接近1,两变量间线性关系越密切;|r|越接近于0,表示两变量的线性相关越弱。
  • 一般可按三级划分:|r|<0.4为低度线性相关;0.4≤|r|<0.7为显著性相关;0.7≤|r|<1为高度线性相关。

2.java实现:使用公式二实现的

package youling.studio.pearson;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

/**
*
*
*/
public class Similarity {
   static Logger logger = Logger.getLogger(Similarity.class.getName());
   Map<String, Double> rating_map = new HashMap<String, Double>();
   List<Double> rating_map_list = new ArrayList<Double>(); 

   /**
    * @param args
    */
   public static void main(String[] args) {
       Similarity similarity1 = new Similarity();
       similarity1.rating_map_list.add(20d);
       similarity1.rating_map_list.add(7d);
       similarity1.rating_map_list.add(26d);
       Similarity similarity2 = new Similarity();
       similarity2.rating_map_list.add(7d);
       similarity2.rating_map_list.add(3d);
       similarity2.rating_map_list.add(6d);
       logger.info("" + similarity1.getsimilarity_bydim(similarity2)); //0.8多,属于高度相关

       Similarity similarity3 = new Similarity();
       similarity3.rating_map_list.add(12d);
       similarity3.rating_map_list.add(4d);
       similarity3.rating_map_list.add(8d);
       Similarity similarity4 = new Similarity();
       similarity4.rating_map_list.add(3d);
       similarity4.rating_map_list.add(1d);
       similarity4.rating_map_list.add(2d);
       logger.info("" + similarity3.getsimilarity_bydim(similarity4)); //结果是1.0成比例其实就是前面和后面是倍数关系

  } 

   public Double getsimilarity_bydim(Similarity u) {
       if(this.rating_map_list.size()!=u.rating_map_list.size()){
	   return null;
       }
       double sim = 0d; //最后的皮尔逊相关度系数
       double common_items_len = this.rating_map_list.size(); //操作数的个数
       double this_sum = 0d; //第一个相关数的和
       double u_sum = 0d; //第二个相关数的和
       double this_sum_sq = 0d; //第一个相关数的平方和
       double u_sum_sq = 0d; //第二个相关数的平方和
       double p_sum = 0d; //两个相关数乘积的和

       for(int i = 0;i<this.rating_map_list.size();i++){
	   double this_grade = this.rating_map_list.get(i);
	   double u_grade = u.rating_map_list.get(i);
	   //评分求和                     //平方和                     //乘积和
	   this_sum += this_grade;
	   u_sum += u_grade;
	   this_sum_sq += Math.pow(this_grade, 2);
	   u_sum_sq += Math.pow(u_grade, 2);
	   p_sum += this_grade*u_grade;
       }

       logger.info("common_items_len:"+common_items_len);
       logger.info("p_sum:"+p_sum);
       logger.info("this_sum:"+this_sum);
       logger.info("u_sum:"+u_sum);
       double num = common_items_len * p_sum - this_sum * u_sum;
       double den = Math.sqrt((common_items_len * this_sum_sq - Math.pow(this_sum, 2)) * (common_items_len * u_sum_sq - Math.pow(u_sum, 2)));
       logger.info("" + num + ":" + den);
       sim = (den == 0) ? 1 : num / den; 

       return sim;
   } 

}

3.适用范围:

当两个变量的标准差都不为零时,相关系数才有定义,皮尔逊相关系数适用于:

(1)、两个变量之间是线性关系,都是连续数据。

(2)、两个变量的总体是正态分布,或接近正态的单峰分布。

(3)、两个变量的观测值是成对的,每对观测值之间相互独立。

---

时间: 2024-12-23 11:01:05

皮尔逊相关度系数原理,以及java实现的相关文章

一致性Hash算法原理,java实现,及用途

学习记录: 一致性Hash算法原理及java实现:https://blog.csdn.net/suifeng629/article/details/81567777 一致性Hash算法介绍,原理,及使用场景:https://blog.csdn.net/cbmljs/article/details/88021598 纯转载,侵删 原文地址:https://www.cnblogs.com/dupei/p/12054368.html

多线程断点下载原理(java代码实例演示)

其实多线程断点下载原理,很简单的,那么我们就来先了解下,如何实现多线程的断点下载,首先:你必须明白第一点,那么就是,什么是多线程下载,该知识点可以查看本博客上一篇文章,Android之多线程下载原理,断点下载呢,其实就是在这个的基础之上添加了一些东西,那么添加了什么东西了,现在来做一个详细的了解. 1.在下载的过程中,边下载,变用一个文件来记录下载的位置,也就是下载了多少的数据 1.创建文件 2.记录下载多少数据 3.存储数据 2.第二次下载的时候,就去读取文件中是否存有数据,读取上次下载的位置

synchronized与static synchronized 的差别、synchronized在JVM底层的实现原理及Java多线程锁理解

本Blog分为例如以下部分: 第一部分:synchronized与static synchronized 的差别 第二部分:JVM底层又是怎样实现synchronized的 第三部分:Java多线程锁,源码剖析 第一部分:synchronized与static synchronized的差别 1.synchronized与static synchronized 的差别 synchronized是对类的当前实例进行加锁,防止其它线程同一时候訪问该类的该实例的全部synchronized块.注意这里

synchronized与static synchronized 的区别、synchronized在JVM底层的实现原理及Java多线程锁理解

本Blog分为如下部分: 第一部分:synchronized与static synchronized 的区别 第二部分:JVM底层又是如何实现synchronized的 第三部分:Java多线程锁,源代码剖析 第一部分:synchronized与static synchronized的区别 1.synchronized与static synchronized 的区别 synchronized是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是"类

最短路径A*算法原理及java代码实现(看不懂是我的失败)

算法只要懂原理了,代码都是小问题,先看下面理论,尤其是红色标注的(要源码请留下邮箱,有测试用例,直接运行即可) A*算法 百度上的解释: A*[1](A-Star)算法是一种静态路网中求解最短路最有效的直接搜索方法. 公式表示为: f(n)=g(n)+h(n), 其中 f(n) 是从初始点经由节点n到目标点的估价函数, g(n) 是在状态空间中从初始节点到n节点的实际代价, h(n) 是从n到目标节点最佳路径的估计代价. 保证找到最短路径(最优解的)条件,关键在于估价函数f(n)的选取: 估价值

Jackcard类似度和余弦类似度(向量空间模型)的java实现

版权声明:本文为博主原创文章,地址:http://blog.csdn.net/napoay,转载请留言. 总结Jackcard类似度和余弦类似度. 一.集合的Jackcard类似度 1.1Jackcard类似度 Jaccard类似指数用来度量两个集合之间的类似性,它被定义为两个集合交集的元素个数除以并集的元素个数. 数学公式描写叙述: J(A,B)=|A∩B||A∪B| 这个看似简单的算法有非常大的用处.比方: 抄袭文档 高明的抄袭者为了掩盖自己抄袭的事实,会选择性的抄袭文档中的一些段落,或者对

通过简单的Word Count讲解MapReduce原理以及Java实现

MapReduce原理: MapReduce采用"分而治之"的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果.简单地说,MapReduce就是"任务的分解与结果的汇总". 在Hadoop中,用于执行MapReduce任务的机器角色有两个:一个是JobTracker:另一个是TaskTracker,JobTracker是用于调度工作的,TaskTracker是用于执行工作的.一个Hadoop集群中

分组密码_计数器(CTR)模式_原理及java实现

一.原理: CTR模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码,在CTR模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流.最终的密文分组是通过将计数器加密得到的比特序列与明文分组进行XOR而得到的. 二.原理图: 三.CRT模式的优点: 1.硬件效率高,同三种链接模式相比,CTR能够并行加密和解密. 2.软件效率高,可以充分利用其并行特性进行并行计算 3.由于加密解密过程不依赖明文和密文,因此可以做预处理以提高效率 4.可以随机访问某一明文或者密文分组

自旋锁原理及java自旋锁

转载:http://blog.csdn.net/sunp823/article/details/49886051 锁的状态:无锁状态.偏向锁状态.轻量级锁状态.重量级锁状态. 偏向锁适用于只有一个线程访问同步块的场景. 轻量级锁的,竞争的线程不会阻塞,适用于持有锁的时间比较短.没有竞争到的线程会自旋来获取锁(自旋的次数这个倒不是非常确定,需要看hotspot源代码来查看,从jni.cpp的monitorenter函数入手),获取失败的话,轻量级锁会膨胀为重量级锁,引起阻塞. 一.自旋锁的概念首先