皮尔逊相关系数介绍及实现(python,java)

什么是皮尔逊相关系数?

皮尔逊相关系数(Pearson correlation coefficient):由卡尔·皮尔逊(Karl Pearson)提出,是衡量两个变量线性相关程度的统计指标,它的值介于-1与1之间,其中1表示完全正相关,-1表示完全负相关,0则意味着没有线性相关。
公式:
r = ∑ i = 1 n ( x i − x ‾ ) ( y i − y ‾ ) ∑ i = 1 n ( x i − x ‾ ) 2 ∑ i = 1 n ( y i − y ‾ ) 2 r = \frac{\sum_{i=1}^{n} (x_i - \overline{x})(y_i - \overline{y})} {\sqrt{\sum_{i=1}^{n} (x_i - \overline{x})^2} \sqrt{\sum_{i=1}^{n} (y_i - \overline{y})^2}} r=i=1n(xix)2 i=1n(yiy)2 i=1n(xix)(yiy)

简单实现

有一个旅游平台,有景点信息,计算用户之间的相似度,从而实现景点推荐
Python实现:

# 用字典的形式表示测试数据data,其中键是用户id,值是另一个字典,该字典的键是景点id,值是对该景点评分
data = {"user1": {"spot1": 5, "spot2": 3, "spot3": 2},"user2": {"spot1": 5, "spot2": 1, "spot3": 2, "spot4": 4, "spot5": 5}
}def cal_similarity(user1, user2):# 1.获取两个用户都评论的景点,避免不必要计算common_spots = set(data[user1]).intersection(data[user2])n = len(common_spots)if n == 0:return 0# 2.计算用户对景点评分和''' sum1 = 0for spot in common_spots:sum1 += data[user1][spot] '''sum1 = sum(data[user1][spot] for spot in common_spots)sum2 = sum(data[user2][spot] for spot in common_spots)# 3.计算评分平方和sumsq1 = sum(pow(data[user1][spot], 2) for spot in common_spots)sumsq2 = sum(pow(data[user2][spot], 2) for spot in common_spots)# 4.乘积和pSum = sum(data[user1][spot] * data[user2][spot] for spot in common_spots)# 4.计算系数num = pSum - (sum1 * sum2) / nden = ((sumsq1 - pow(sum1, 2) / n) * (sumsq2 - pow(sum2, 2) / n)) ** 0.5if den == 0:return 0r = round(num / den, 2)return ruser1 = 'user1'
user2 = 'user2'
similarity = cal_similarity(user1, user2)
print(f'用户{user1}和用户{user2}的相似度为: {similarity}')

Java实现:

public class PearsonCorrelation {public static void main(String[] args) {Map<String, Map<String, Integer>> ratings = new HashMap<>();ratings.put("user1", new HashMap<>() {{put("spot1", 5);put("spot2", 3);put("spot3", 2);}});ratings.put("user2", new HashMap<>() {{put("spot1", 5);put("spot2", 1);put("spot3", 4);put("spot4", 4);put("spot5", 4);}});double similarity = calculatePearsonSimilarity(ratings, "user1", "user2");System.out.println("用户1和用户2的相似度为: " + similarity);}public static double calculatePearsonSimilarity(Map<String, Map<String, Integer>> ratings, String user1, String user2) {Set<String> commonSpots = ratings.get(user1).keySet();commonSpots.retainAll(ratings.get(user2).keySet());if (commonSpots.isEmpty()) {return 0;}double sum1 = 0;double sum2 = 0;double sumSq1 = 0;double sumSq2 = 0;double pSum = 0;int n = commonSpots.size();for (String spot : commonSpots) {int score1 = ratings.get(user1).get(spot);int score2 = ratings.get(user2).get(spot);sum1 += score1;sum2 += score2;sumSq1 += Math.pow(score1, 2);sumSq2 += Math.pow(score2, 2);pSum += score1 * score2;}double num = pSum - (sum1 * sum2 / n);double den = Math.sqrt((sumSq1 - Math.pow(sum1, 2) / n) * (sumSq2 - Math.pow(sum2, 2) / n));if (den == 0) {return 0;}return Double.parseDouble(String.format("%.2f", num / den));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/7190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

某东抢购某台脚本-低调

某东抢购某台脚本 小白操作-学习使用 注意&#xff1a; 本文部分变量已做脱敏处理&#xff0c;仅用于测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。技术层面需要提…

329. 矩阵中的最长递增路径

329. 矩阵中的最长递增路径 思路 从每个点下去dfs。然后对于每个点都进行dfs&#xff0c;并且memo记录的是当前点到终点的最大步数。 class Solution { public:static constexpr int dirs[4][2] {{0,1},{0,-1},{1, 0},{-1,0}}; int longestIncreasingPath(vector<vecto…

在图像识别中的“long-rang”理解

在图像识别中&#xff0c;“long-range” 通常指的是模型在处理图像时能够捕捉到图像中远距离相关性或模式的能力。这意味着模型能够在图像的不同区域之间建立连接&#xff0c;并利用这些连接来理解图像的整体结构和内容。 在传统的图像识别模型中&#xff0c;如卷积神经网络 …

C语言动态内存管理malloc、calloc、realloc、free函数、内存泄漏、动态内存开辟的位置等的介绍

文章目录 前言一、为什么存在动态内存管理二、动态内存函数的介绍1. malloc函数2. 内存泄漏3. 动态内存开辟位置4. free函数5. calloc 函数6. realloc 函数7. realloc 传空指针 总结 前言 C语言动态内存管理malloc、calloc、realloc、free函数、内存泄漏、动态内存开辟的位置等…

JavaScript this 上下文深度探索:综合指南涵盖隐式与显式call、apply、bind、箭头函数、构造函数等用法于多样场景

JavaScript中的this关键字代表函数执行的上下文环境&#xff0c;核心在于确定函数内部访问的当前对象。它根据函数调用方式动态变化&#xff0c;对事件处理、对象方法调用等至关重要。通过.call(), .apply(), .bind()或箭头函数控制this&#xff0c;可确保代码逻辑正确绑定对象…

ROS 2边学边练(43)-- 利用GTest写一个基本测试(C++)

前言 在ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;gtest&#xff08;Google Test&#xff09;是一个广泛使用的C测试框架&#xff0c;用于编写和执行单元测试。这些测试可以验证ROS节点、服务和消息等的正确性和性能。 如果我们需要在写的包中添加测试&…

[redis] redis为什么快

1. Redis与Memcached的区别 两者都是非关系型内存键值数据库&#xff0c;现在公司一般都是用 Redis 来实现缓存&#xff0c;而且 Redis 自身也越来越强大了&#xff01;Redis 与 Memcached 主要有以下不同&#xff1a; (1) memcached所有的值均是简单的字符串&#xff0c;red…

被安排了一个任务,执行过程中要注意什么?

1 少来“把信带给加西亚”那一套。一朝领命去&#xff0c;几年百折不挠&#xff0c;和组织失去联系也要把事儿办成的故事虽然很励志&#xff0c;但并不是真相。真相是组织的目标和打法都在快速变化&#xff0c;只有和他人保持密切互动&#xff0c;才能在变化中达成目标。 2 不…

Web自动化-PO模式

目标 深入理解方法封装的思想能够使用方法封装的思想对代码进行优化深入理解PO模式的思想熟练掌握PO模式的分层思想 PO模式学习思路 采用版本迭代的方式来学习&#xff0c;便于对不同版本的优缺点进行对比和理解。 V1&#xff1a;不使用任何设计模式和单元测试框架V2&#xf…

保持 Hiti 证卡打印机清洁的重要性和推荐的清洁用品

在证卡印刷业务中&#xff0c;保持印刷设备的清洁至关重要。特别是对于 Hiti 证卡打印机来说&#xff0c;它们是生产高质量证卡的关键工具。保持设备清洁不仅可以保证打印质量和效率&#xff0c;还可以延长其使用寿命。本文将探讨保持 Hiti 证卡打印机清洁卡的重要性&#xff0…

Linux中对文件的操作(一)

linux中对文件进行操作 open函数 *int open(const char pathname, int flags); pathname&#xff1a;指的是文件名 flags&#xff1a;权限 只读打开O_RDONLY 只写打开O_WRONLY 可读可写打开O_RDWR 以上三个参数中应当只指定一个。 #include <sys/types.h> #include &l…

首届云原生编程挑战赛总决赛亚军比赛攻略(ONE PIECE团队)

关联比赛: 首届云原生编程挑战赛【复赛】实现一个 Serverless 计算服务调度系统 比赛攻略—ONE PIECE团队 代码链接&#xff1a; 初赛&#xff1a;GitHub - czy-gm/containerScheduler: 2020天池首届云原生编程挑战赛亚军-初赛赛道二&#xff08;实现规模化容器静态布局和动…

高项-案例分析万能答案(作业分享)

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 一、通用问题原因: 1.项目经理管理经验不足&#xff0c;没有及时发现和解决xx方面的问题。 2.项目管理计划没有得到关键干系人的评审确…

yum常用命令与lrzsz的在线安装

yum命令 yum&#xff08; Yellow dog Updater, Modified&#xff09;是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。 基于 RPM 包管理&#xff0c;能够从指定的服务器自动下载 RPM 包并且安装&#xff0c;可以自动处理依赖性关系&#xff0c;并且一次安装…

php基础知识快速入门

一、PHP基本知识 1、php介绍&#xff1a; php是一种创建动态交互性的强有力的服务器脚本语言&#xff0c;PHP是开源免费的&#xff0c;并且使用广泛。PHP是解释性语言&#xff0c;按顺序从上往下执行&#xff0c;无需编译&#xff0c;直接运行。PHP脚本在服务器上运行。 2、ph…

动态规划(dp)(二)

按摩师 按摩师 1.状态表示 dp【i】表示&#xff1a;到i位置时&#xff0c;此时最长时长 继续细化&#xff1a;在i位置选预约&#xff0c;或不选预约 f【i】&#xff1a;到i位置时&#xff0c;nums【i】必选的&#xff0c;最长时长 g【i】&#xff1a;到i位置时&#xff0c…

仅为娱乐,Python中如何重定义True为False?

在Python中&#xff0c;True 和 False 是内建的布尔常量&#xff0c;分别代表逻辑上的真和假。它们是不可变的&#xff0c;且在Python语言规范中具有特殊地位&#xff0c;不能被用户直接重定义。尝试给 True 或 False 赋予新的值是违反Python语言规则的&#xff0c;这样的操作会…

刷题记录4.17-5.6

文章目录 刷题记录27.移除元素977.有序数组的平方209.长度最小的子数组707.设计链表206.反转链表24.两两交换链表中的节点19.删除链表的倒数第N个节点142.环形链表II242.有效的字母异位词349.两个数组的交集454.四数相加II18.四数之和151.反转字符串中的单词459.重复的子字符串…

Educational Codeforces Round 165 (Rated for Div. 2) E. Unique Array 贪心+线段树

Unique Array 题目描述 给你一个长度为 n n n 的整数数组 a a a 。 a a a 的子数组是其连续的子序列之一&#xff08;即数组 [ a l , a l 1 , … , a r ] [a_l, a_{l1}, \dots, a_r] [al​,al1​,…,ar​] 中的某个整数 l l l 和 r r r 的子数组 1 ≤ l < r ≤ n …

如何检查 MIDI 文件的安全性

检查 MIDI 文件的安全性通常涉及几个步骤&#xff0c;因为 MIDI 文件本身并不包含可执行代码&#xff0c;所以它们不是传统意义上的恶意软件载体。然而&#xff0c;它们仍然可能以间接的方式带来安全风险&#xff0c;例如通过诱导用户下载与 MIDI 文件一起提供的恶意附件或链接…