决定系数R2;残差平方和SSE;回归平方和SSR总平方和SST;

https://theonegis.blog.csdn.net/article/details/85991138

循着这篇博客翻墙找了很多博客看;受益匪浅,说一下自己的理解。

首先,决定系数R2是对于线性模型来说的。

由于我是在预测数据集上进行计算,所以产生了R2是用在训练数据集还是预测数据集上的困惑。

首先,在训练数据集上,R2应该是(我的理解,可能不太对,望指正)用来衡量线性模型在训练数据集上的拟合程度,这时候SST=SSE+SSR(具体可到可知乎或者其他博客查看),所以0<R2<1(\bar{y}其实也只有这时候才有意义,不然单独拿出来为什么使用\bar{y},没有任何意义)。只有平均值有意义,这个公式也才有意义。但是如果是针对非线性模型,那SST=SSR+SSE便不成立了,所以0<R2<1的范围也就不成立的。而且在训练数据集上,非线性模型的拟合程度往往是高于线性模型的,因此SST一定的情况下,SSR肯定是高于线性模型的,那么此时如果你的R2(训练集上的)没有个0.99,那你这非线性不咋地,这个时候用R2衡量非线性模型也就没有意义了。

其次,在预测数据集上,R2在线性模型上还是遵从0<R2<1,但是对于非线性模型就不是了,你可能是负数,也可能接近1,但是这些都不能作为你的模型究竟是好是坏的证据。同上,SST=SSR+SSE不成立,SSR/SST好像应该是正的,但是SSE/SST可能大于1,此时那么R2是负数。这种矛盾现象产生的原因就是SST=SSE+SSR不成立。

所以在非线性模型上,同时在预测数据集上,

1、SSR/SST>0,但是由于SST=SSR+SSE不成立,范围无法确定,且SST中y-\bar{y}也没有意义了。此时预测集确定,SST确定,实际上起作用的只有SSR,而SSR表示的预测值与平均值的差距,这个在非线性模型中好像没有任任何意义吧,在线性模型中确实平均值可以作为衡量线性模型的拟合程度

2、1-SSE/SST,同样,SST=SSR+SSE不成立,那么R2可能小于0.同样的,这里面有含义且起作用的只有SSE,这不就是MSE*n吗,既然此时SST没有含义了,R2范围也不再是0<R2<1,那么直接用SSE/MSE不就可以了吗?多此一举干嘛?

所以,不论是R2,还是SST,SSR,他们有一点,公式中含有平均值这一个选项,而只有在线性模型下,SST=SSE+SSR,这个选项才有意义,对于非线性模型,意义不大。

那么还有可能发现,我是用R2和非线性模型,在测试集上,确实预测的越好R2越大,因为1-SSE/SST中,SST不变,起作用的就只有SSE,当模型还可以的时候,R2接近0.9,这样模型越好,SSE/MSE越小,当然R2越好(越接近1),但是那又怎么样,没有任何意义,既然R2范围都不固定了,那也就没有任何意义了,那只选择里面起作用的一项SSE/MSE不就可以了吗?

同时在不同领域,R2取多少合适也是不确定的,有的领域可能0.4就好,再大说明你错了。

如有不当之处,欢迎指正!

放两个链接

https://statisticsbyjim.com/regression/difference-between-linear-nonlinear-regression-models/

https://blog.minitab.com/blog/adventures-in-statistics-2/regression-analysis-how-do-i-interpret-r-squared-and-assess-the-goodness-of-fit

可以去这两个博文下面,里面还有很多讨论,多翻几个,对你会很有帮助

 

 

 

 

 

  • 13
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是一个多元最小二乘回归的C++类实现及其使用案例。 ``` #include <iostream> #include <vector> #include <cmath> class MultipleLinearRegression { private: int n; // 自变量个数 int m; // 样本个数 std::vector<double> y; // 因变量 std::vector<std::vector<double>> x; // 自变量矩阵 std::vector<double> beta; // 模型系数 double SSR; // 回归平方和 double SSE; // 残差平方和 double SST; // 平方和 double R2; // 决定系数 public: MultipleLinearRegression(int _n, int _m) : n(_n), m(_m), beta(_n + 1) { x.resize(m, std::vector<double>(n + 1)); } void setY(const std::vector<double>& _y) { y = _y; } void setX(const std::vector<std::vector<double>>& _x) { for (int i = 0; i < m; i++) { x[i][0] = 1.0; for (int j = 0; j < n; j++) { x[i][j + 1] = _x[i][j]; } } } void fit() { // 计算模型系数 std::vector<std::vector<double>> xtx(n + 1, std::vector<double>(n + 1)); std::vector<double> xty(n + 1); for (int i = 0; i < m; i++) { for (int j = 0; j <= n; j++) { for (int k = 0; k <= n; k++) { xtx[j][k] += x[i][j] * x[i][k]; } xty[j] += x[i][j] * y[i]; } } for (int i = 0; i <= n; i++) { for (int j = i + 1; j <= n; j++) { double r = xtx[j][i] / xtx[i][i]; for (int k = i + 1; k <= n; k++) { xtx[j][k] -= r * xtx[i][k]; } xty[j] -= r * xty[i]; } } for (int i = n; i >= 0; i--) { for (int j = i - 1; j >= 0; j--) { double r = xtx[j][i] / xtx[i][i]; for (int k = i; k >= j; k--) { xtx[j][k] -= r * xtx[i][k]; } xty[j] -= r * xty[i]; } beta[i] = xty[i] / xtx[i][i]; } // 计算回归平方和残差平方和平方和决定系数 double ymean = 0.0; for (int i = 0; i < m; i++) { ymean += y[i]; } ymean /= m; SSR = SSE = SST = 0.0; for (int i = 0; i < m; i++) { double yhat = predict(x[i]); SSR += (yhat - ymean) * (yhat - ymean); SSE += (yhat - y[i]) * (yhat - y[i]); SST += (y[i] - ymean) * (y[i] - ymean); } R2 = SSR / SST; } double predict(const std::vector<double>& _x) { double yhat = beta[0]; for (int i = 0; i < n; i++) { yhat += beta[i + 1] * _x[i]; } return yhat; } double getSSR() { return SSR; } double getSSE() { return SSE; } double getSST() { return SST; } double getR2() { return R2; } }; int main() { // 构造样本数据 std::vector<std::vector<double>> x = {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}}; std::vector<double> y = {6, 7, 8}; // 构造回归模型并拟合数据 MultipleLinearRegression model(3, 3); model.setX(x); model.setY(y); model.fit(); // 输出模型系数、回归平方和残差平方和平方和决定系数 std::cout << "beta: "; for (int i = 0; i < 4; i++) { std::cout << model.predict({i, i + 1, i + 2}) << " "; } std::cout << std::endl; std::cout << "SSR: " << model.getSSR() << std::endl; std::cout << "SSE: " << model.getSSE() << std::endl; std::cout << "SST: " << model.getSST() << std::endl; std::cout << "R2: " << model.getR2() << std::endl; return 0; } ``` 在上面的代码中,我们定义了一个`MultipleLinearRegression`类来实现多元最小二乘回归,其中包含了以下几个成员变量: - `n`:自变量个数 - `m`:样本个数 - `y`:因变量 - `x`:自变量矩阵 - `beta`:模型系数 - `SSR`:回归平方和 - `SSE`:残差平方和 - `SST`:平方和 - `R2`:决定系数 我们还定义了以下几个成员函数: - `setY`:设置因变量 - `setX`:设置自变量矩阵 - `fit`:拟合数据并计算模型系数、回归平方和残差平方和平方和决定系数 - `predict`:预测因变量值 - `getSSR`:获取回归平方和 - `getSSE`:获取残差平方和 - `getSST`:获取平方和 - `getR2`:获取决定系数 在使用示例中,我们构造了一个包含3个自变量和3个样本的样本数据,然后构造回归模型并拟合数据,最后输出模型系数、回归平方和残差平方和平方和决定系数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值