文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JAVA实现基于皮尔逊相关系数的相似度详解

2023-05-30 20:33

关注

最近在看《集体智慧编程》,相比其他机器学习的书籍,这本书有许多案例,更贴近实际,而且也很适合我们这种准备学习machinelearning的小白。

这本书我觉得不足之处在于,里面没有对算法的公式作讲解,而是直接用代码去实现,所以给想具体了解该算法带来了不便,所以想写几篇文章来做具体的说明。以下是第一篇,对皮尔逊相关系数作讲解,并采用了自己比较熟悉的java语言做实现。

皮尔逊数学公式如下,来自维基百科。

JAVA实现基于皮尔逊相关系数的相似度详解

其中,E是数学期望,cov表示协方差,\sigma_X和\sigma_Y是标准差。

化简后得:

JAVA实现基于皮尔逊相关系数的相似度详解

JAVA实现基于皮尔逊相关系数的相似度详解

皮尔逊相似度计算的算法还是很简单的,实现起来也不难。只要求变量X、Y、乘积XY,X的平方,Y的平方的和。我的代码所使用的数据测试集来自集体智慧编程一书。代码如下:

package pearsonCorrelationScore;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;public class PearsonCorrelationScore {private Map<String, Map<String, double>> dataset = null;public PearsonCorrelationScore() {initDataSet();}private void initDataSet() {dataset = new HashMap<String, Map<String, double>>();// 初始化Lisa Rose 数据集Map<String, double> roseMap = new HashMap<String, double>();roseMap.put("Lady in the water", 2.5);roseMap.put("Snakes on a Plane", 3.5);roseMap.put("Just My Luck", 3.0);roseMap.put("Superman Returns", 3.5);roseMap.put("You, Me and Dupree", 2.5);roseMap.put("The Night Listener", 3.0);dataset.put("Lisa Rose", roseMap);// 初始化Jack Matthews 数据集Map<String, double> jackMap = new HashMap<String, double>();jackMap.put("Lady in the water", 3.0);jackMap.put("Snakes on a Plane", 4.0);jackMap.put("Superman Returns", 5.0);jackMap.put("You, Me and Dupree", 3.5);jackMap.put("The Night Listener", 3.0);dataset.put("Jack Matthews", jackMap);// 初始化Jack Matthews 数据集Map<String, double> geneMap = new HashMap<String, double>();geneMap.put("Lady in the water", 3.0);geneMap.put("Snakes on a Plane", 3.5);geneMap.put("Just My Luck", 1.5);geneMap.put("Superman Returns", 5.0);geneMap.put("You, Me and Dupree", 3.5);geneMap.put("The Night Listener", 3.0);dataset.put("Gene Seymour", geneMap);}public Map<String, Map<String, double>> getDataSet() {return dataset;}public double sim_pearson(String person1, String person2) {// 找出双方都评论过的电影,(皮尔逊算法要求)List<String> list = new ArrayList<String>();for (Entry<String, double> p1 : dataset.get(person1).entrySet()) {if (dataset.get(person2).containsKey(p1.getKey())) {list.add(p1.getKey());}}double sumX = 0.0;double sumY = 0.0;double sumX_Sq = 0.0;double sumY_Sq = 0.0;double sumXY = 0.0;int N = list.size();for (String name : list) {Map<String, double> p1Map = dataset.get(person1);Map<String, double> p2Map = dataset.get(person2);sumX += p1Map.get(name);sumY += p2Map.get(name);sumX_Sq += Math.pow(p1Map.get(name), 2);sumY_Sq += Math.pow(p2Map.get(name), 2);sumXY += p1Map.get(name) * p2Map.get(name);}double numerator = sumXY - sumX * sumY / N;double denominator = Math.sqrt((sumX_Sq - sumX * sumX / N)* (sumY_Sq - sumY * sumY / N));// 分母不能为0if (denominator == 0) {return 0;}return numerator / denominator;}public static void main(String[] args) {PearsonCorrelationScore pearsonCorrelationScore = new PearsonCorrelationScore();System.out.println(pearsonCorrelationScore.sim_pearson("Lisa Rose","Jack Matthews"));}}

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯