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\):
\[RSS=\sum (y_{pre}-y)^2\\ TSS=\sum (y-\overline y)^2\\ R^2=1-\frac{RSS}{TSS} \]代码如下:
SSres = sum((Y_pre - Y).^2); % 残差平方和
SStot = sum((Y - mean(Y)).^2); % 总平方和
R_squared = 1 - (SSres / SStot); % R-squared
相关系数r的计算
计算相关系数\(r\),可以使用corrcoef
函数先计算相关系数矩阵,取其非对角线元素的值。
代码如下:
r = corrcoef(Y_pre, Y);
disp(r(1,2))
Others
\(r\)(相关系数)和 \(R^2\)(决定系数,也称为R-squared)是可以用于衡量数据的不同的方面的两个不同的统计量。
Calculation
\[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 \]Comparison
- 相关系数 \(r\in[-1,1]\):衡量两个变量之间线性关系的强度和方向。
- \(r = 1\) 表示完全正相关。
- \(r = -1\) 表示完全负相关。
- \(r = 0\) 表示没有线性相关。
- 决定系数 \(R^2\in[0,1]\):衡量模型对因变量变异的解释程度。
- R² = 1 表示模型完美地解释了数据的变异。
- R² = 0 表示模型没有解释数据的任何变异。
R² 衡量模型拟合优度的指标,告诉我们模型对数据变异的解释程度有多好。而相关系数 r 仅仅告诉我们两个变量之间线性关系的强度,它并不对模型拟合优度全面评估。
如果想要更全面的评估,通常会看 \(R^2\) 。
如果只关心两个变量之间是否有线性关系,看相关系数 \(r\)。
References
polyfit and R^2 value - MATLAB Answers - MATLAB Central (mathworks.cn)
相关系数 - MATLAB corrcoef - MathWorks 中国
标签:pre,决定系数,相关系数,Matlab,计算,拟合,sum From: https://www.cnblogs.com/Vanilla-chan/p/18241194