Problem

当你使用 polyfit 函数进行多项式拟合之后,你希望计算决定系数或者相关系数看看拟合效果如何。聪明的你肯定觉得聪明的 Matlab 的 polyfit 函数的返回值中会有 \(R^2\) 或者 \(r\) 吧。你尝试 disp 了一下,发现有一个结构体 \(S\)。再查一查帮助文档,发现误差估计结构体 \(S\) 中只有一个范德蒙德矩阵 \(R\)、自由度 \(df\) 和残差的范数 \(normr\),并没有你想要的 \(R^2\) 或者 \(r\)。

Solution

很遗憾,我们还是需要手动计算这两个系数。

假设X是原始数据自变量,Y是原始数据因变量,我们先进行多项式拟合:

p = polyfit(X, Y, n); % n是多项式次数
Y_pre = polyval(p,X);

得到了Y_pre为多项式拟合后的预测值。

决定系数R-squared的计算

我们使用如下公式计算\(R^2\)​:

\[\begin{align}
RSS&=\sum (y_{pre}-y)^2\\
ESS&=\sum (y-\overline y)^2\\
R^2&=1-\frac{ESS}{TSS}
\end{align}
\]

代码如下:

SSerr = sum((Y_pre - Y).^2); % 残差平方和
SStot = sum((Y - mean(Y)).^2); % 总平方和
R_squared = 1 - (SSerr / SStot); % R-squared

相关系数r的计算

计算相关系数\(r\),可以使用corrcoef函数先计算相关系数矩阵,取其非对角线元素的值。

代码如下:

r = corrcoef(Y_pre, Y);
disp(r(1,2))

Others

\(r\)(相关系数)和 \(R^2\)​​(决定系数,也称为R-squared)是可以用于衡量数据的不同的方面的两个不同的统计量。

Calculation

\[\begin{gather}
R^2=1-\frac{RSS}{TSS}=1-\frac{\sum (y_{pre}-y)^2}{\sum (y-\overline y)^2}\\
r=\frac{n(\sum x y)-(\sum x)(\sum y)}{\sqrt{[n \sum x^2-(\sum x)^2][n \sum y^2-(\sum y)^2]}}\\
R^2=r^2
\end{gather}
\]

Comparison

  1. 相关系数 \(r\in[-1,1]\):衡量两个变量之间线性关系的强度和方向。

    • \(r = 1\) 表示完全正相关。
    • \(r = -1\) 表示完全负相关。
    • \(r = 0\) 表示没有线性相关。
  2. 决定系数 \(R^2\in[0,1]\):衡量模型对因变量变异的解释程度。
    • R² = 1 表示模型完美地解释了数据的变异。
    • R² = 0 表示模型没有解释数据的任何变异。

R² 衡量模型拟合优度的指标,告诉我们模型对数据变异的解释程度有多好。而相关系数 r 仅仅告诉我们两个变量之间线性关系的强度,它并不对模型拟合优度全面评估。

如果想要更全面的评估,通常会看 \(R^2\) 。

如果只关心两个变量之间是否有线性关系,看相关系数 \(r\)。

后续

补充于2024-7-31

但是有时候会出现 \(R^2<0\) 的情况。等等,为什么 \(R^2\) 会小于零?它不是 \(r\) 的平方吗?

当出现拟合效果特别差的时候,就有可能会出现(?)

今天我们在研读一篇论文的时候,遇到了“多元线性回归”。而由于题目背景,有些小组疑惑是否要规定常数项为 0。假如使用 Matlab 中的多元线性回归函数 regress 的话,当 X 不存在全为 1 的一列时,会出现报错:

警告: R 方和 F 统计量的定义不良,除非 X 有一列全部为 1。

键入 "help regress" 了解详细信息。

同时,如果硬要输出 regress 返回值中的 stat(1) 的话,会发现 \(R^2\) 可能是一个负数。(演示代码见附录)

实际上这是因为 \(R^2\) 的定义不同导致的。

  1. 范德蒙德矩阵

    [b,bint,r,rint,stats]=regress(Y,X,0.05);
    fprintf("R^2=stats(1)=%f\n",stats(1));

​ 输出 R^2=stats(1)=-0.381201,为负数。

  1. \(1-\frac{ESS}{TSS}\)

    Y_pre=X*b;
    ESS=sum((Y_pre-Y).^2);
    TSS=sum((Y-mean(Y)).^2);
    fprintf("R^2=1-ESS/TSS=%f\n",1-ESS/TSS);

    输出 R^2=1-ESS/TSS=-0.381201,结果与范德蒙德矩阵结果一致。

  2. \(\frac{RSS}{TSS}\)

    RSS=sum((Y_pre-mean(Y)).^2);
    fprintf("R^2=RSS/TSS=%f\n",RSS/TSS);

    输出 R^2=RSS/TSS=3.746787,为正数。

  3. \(r^2\)

    r = corrcoef(Y_pre, Y);
    fprintf("r=corrcoef()(1,2)=%f=>r^2=%f\n",r(1,2),(r(1,2)).^2);

    输出 r=corrcoef()(1,2)=0.869397=>r^2=0.755851,为正数。

以上。

References

polyfit and R^2 value - MATLAB Answers - MATLAB Central (mathworks.cn)

相关系数 - MATLAB corrcoef - MathWorks 中国

Code

X_data=[120	73	180	80	125	125	81.1000000000000	90
133.020000000000 73 180 80 125 125 81.1000000000000 90
129.630000000000 73 180 80 125 125 81.1000000000000 90
158.770000000000 73 180 80 125 125 81.1000000000000 90
145.320000000000 73 180 80 125 125 81.1000000000000 90
120 78.5960000000000 180 80 125 125 81.1000000000000 90
120 75.4500000000000 180 80 125 125 81.1000000000000 90
120 90.4870000000000 180 80 125 125 81.1000000000000 90
120 83.8480000000000 180 80 125 125 81.1000000000000 90
120 73 231.390000000000 80 125 125 81.1000000000000 90
120 73 198.480000000000 80 125 125 81.1000000000000 90
120 73 212.640000000000 80 125 125 81.1000000000000 90
120 73 190.550000000000 80 125 125 81.1000000000000 90
120 73 180 75.8570000000000 125 125 81.1000000000000 90
120 73 180 65.9580000000000 125 125 81.1000000000000 90
120 73 180 87.2580000000000 125 125 81.1000000000000 90
120 73 180 97.8240000000000 125 125 81.1000000000000 90
120 73 180 80 150.710000000000 125 81.1000000000000 90
120 73 180 80 141.580000000000 125 81.1000000000000 90
120 73 180 80 132.370000000000 125 81.1000000000000 90
120 73 180 80 156.930000000000 125 81.1000000000000 90
120 73 180 80 125 138.880000000000 81.1000000000000 90
120 73 180 80 125 131.210000000000 81.1000000000000 90
120 73 180 80 125 141.710000000000 81.1000000000000 90
120 73 180 80 125 149.290000000000 81.1000000000000 90
120 73 180 80 125 125 60.5820000000000 90
120 73 180 80 125 125 70.9620000000000 90
120 73 180 80 125 125 64.8540000000000 90
120 73 180 80 125 125 75.5290000000000 90
120 73 180 80 125 125 81.1000000000000 104.840000000000
120 73 180 80 125 125 81.1000000000000 111.220000000000
120 73 180 80 125 125 81.1000000000000 98.0920000000000
120 73 180 80 125 125 81.1000000000000 120.440000000000];
X=X_data;
Y=Y_data(:,1);
[b,bint,r,rint,stats]=regress(Y,X,0.05); fprintf("R^2=stats(1)=%f\n",stats(1)); Y_pre=X*b;
ESS=sum((Y_pre-Y).^2);
TSS=sum((Y-mean(Y)).^2);
fprintf("R^2=1-ESS/TSS=%f\n",1-ESS/TSS); RSS=sum((Y_pre-mean(Y)).^2);
fprintf("R^2=RSS/TSS=%f\n",RSS/TSS); r = corrcoef(Y_pre, Y);
fprintf("r=corrcoef()(1,2)=%f=>r^2=%f\n",r(1,2),(r(1,2)).^2);

在Matlab中如何计算决定系数R^2和相关系数r的更多相关文章

  1. Matlab中的一些小技巧

    (转于它处,仅供参考) 1.. Ctrl+C 中断正在执行的操作 如果程序不小心进入死循环,或者计算时间太长,可以在命令窗口中使用Ctrl+c来中断.MATLAB这时可能正疲于应付,响应会有些滞后. ...

  2. Matlab中给figure添加图例(legend),标题(title)和颜色(color)

    在Matlab绘图过程中,尤其是需要将多个图绘制在相同的坐标轴中时,通常需要将不同的曲线设置成为不同的颜色.此外,为了直观,还需要给这张图标增添标题和图例.这篇文章展示了在Matlab的绘图窗口(fi ...

  3. Matlab中函数定义方法

    Matlab自定义函数的六种方法 n1.函数文件+调用函数(命令)文件:需单独定义一个自定义函数的M文件: n2.函数文件+子函数:定义一个具有多个自定义函数的M文件: n3.Inline:无需M文件 ...

  4. MATLAB中白噪声的WGN和AWGN函数的使用

    MATLAB中白噪声的WGN和AWGN函数的使用如下: MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN.WGN用于产生高斯白噪声,AWGN则用于在某一 信号 ...

  5. matlab中的xcorr 自相关函数

    转载自 http://blog.163.com/to_be_myself/blog/static/176060227201101762159227/ Matlab中用于计算自相关函数的指令是xcorr ...

  6. MATLAB中plot()画图的颜色线型和希腊字母参数设置

    y         黄色           ·             点线      m         粉红           ○             圈线      c          ...

  7. matlab 中txt文件(含字符及数值)处理

    matlab 中txt文件(含字符及数值)处理 (2008-08-02 09:45:12) 转载▼ 标签: 杂谈 分类: matlab及C学习 Matlab文件操作及读txt文件ZZ 2008-07- ...

  8. matlab中各种高斯相关函数

    matlab中各种高斯相关函数 matlab, 高斯函数, 高斯分布 最常见的是产生服从一维标准正态分布的随机数 n=100;  x=randn(1,n)  实现服从任意一维高斯分布的随机数 u=10 ...

  9. MATLAB中提供的线型属性

    MATLAB中提供的线型属性有: 线型 说明 标记符 说明 颜色 说明 - 实线(默认) + 加号符 r 红色 -- 双划线 o 空心圆 g 绿色 : 虚线 * 星号 b 蓝色 :. 点划线 . 实心 ...

  10. 【matlab】将matlab中数据输出保存为txt或dat格式

    将matlab中数据输出保存为txt或dat格式 总结网上各大论坛,主要有三种方法. 第一种方法:save(最简单基本的) 具体的命令是:用save *.txt -ascii x x为变量 *.txt ...

随机推荐

  1. vuepress-reco搭建与部署指南

    个人博客:槿苏的知识铺 一.前言   在技术飞速发展的今天,高效地编写.维护和呈现文档已成为开发者不可或缺的能力.无论是开源项目.团队协作还是个人知识沉淀,一套结构清晰.体验优雅的文档系统都能显著提升 ...

  2. 基于SLAM系统建图仿真,完成定位仿真

    博客地址:https://www.cnblogs.com/zylyehuo/ 基于SLAM系统完成建图仿真,详见之前的博客 基于Gazebo搭建移动机器人,并结合SLAM系统完成建图仿真 - zyly ...

  3. SeaBIOS实现简单分析

    SeaBIOS是一个16bit的x86 BIOS的开源实现,常用于QEMU等仿真器中使用.本文将结合SeaBIOS Execution and code flow和SeaBIOS的源码对SeaBIOS ...

  4. docker网络冲突解决(修改docker_gwbridge网段)

    1·问题 一次生产搭建服务的时候,出现客户端服务器到docker服务断开不通的情况,在docker服务器上抓包可以抓到客户端服务器的包,但是docker服务器不做任何响应 于是ip route 查看本 ...

  5. 查看SELinux状态:

    1./usr/sbin/sestatus -v      ##如果SELinux status参数为enabled即为开启状态SELinux status:                 enabl ...

  6. Vite CVE-2025-30208 安全漏洞

    Vite CVE-2025-30208 安全漏洞 一.漏洞概述 CVE-2025-30208 是 Vite(一个前端开发工具提供商)在特定版本中存在的安全漏洞.此漏洞允许攻击者通过特殊的 URL 参数 ...

  7. [每日算法 - 华为机试] leetcode345 :反转字符串中的元音字母「双指针」

    入口 力扣https://leetcode.cn/problems/reverse-vowels-of-a-string/submissions/ 题目描述 给你一个字符串 s ,仅反转字符串中的所有 ...

  8. this和super--java进阶day01

    1.this和super的代表 super是父类的标识符,如堆内存中的标志 2.this和super的访问 重点说访问构造方法,super()访问父类构造方法我们已经清楚,但是this()访问本类构造 ...

  9. 【QT】使用Qxlsx读取Excel单元格中函数表达式的结果值

    [QT]使用Qxlsx读取Excel单元格中函数表达式的结果值 零.起因 是这样的,目前朋友托我写一款模板生成软件,任务是先把他写的程序文件复制一份出来,然后再根据Excel中对应位置的单元格的值,修 ...

  10. Grafana将弃用AngularJS-我们该如何迁移

    AngularJS 弃用时间线 AngularJS 支持已在 Grafana 9 中正式弃用.在 2024 年 5 月发布的 Grafana 11 中,所有 Grafana Cloud 和自托管安装默 ...