使用scipy.optimize.curve_fit幂律拟合得到负R平方值的问题排查
负R²问题的原因说明
你得到负R²的核心逻辑是当前幂律拟合的残差平方和ss_res大于Y的总平方和ss_tot,说明你的拟合模型效果比直接用Y的平均值作为预测值还要差,1减去一个大于1的ss_res/ss_tot自然会得到负数,常见的诱因有以下几类:
- 幂律函数适配性问题:
scipy.optimize.curve_fit默认给参数的初始guess值全为1,如果你的X、Y取值存在特殊情况,比如X包含接近0的取值、Y包含负数,幂律函数a*x^b的输出范围根本无法匹配你的Y分布,会直接导致拟合完全偏离真实趋势。你可以先打印输出拟合得到的popt参数,看a、b的取值是不是和你对数据的预期明显不符,比如参数量级异常、b的正负和X-Y的趋势完全相反。 - 数据本身不符合幂律分布:你做了
[4:]的截断操作,如果截断后剩下的数据本身不存在幂律分布的趋势,拟合自然会失败。建议先绘制X-Y的原始散点图,确认分布是否符合幂律的单调凸/凹特征。 - 计算逻辑的潜在错误:你用Pandas Series做计算,要确认X和Y的索引是对齐的,没有出现数据错位导致残差计算完全错误;另外可以单独打印
ss_res和ss_tot的数值,确认是否真的存在ss_res > ss_tot的情况,如果Y的方差极小导致ss_tot趋近于0,也会导致分式计算异常。 - 补充说明:非线性拟合的R²本身没有线性回归中“解释方差比例”的明确物理意义,就算得到正值也不能直接和线性模型的R²做横向对比。如果需要评估拟合效果,更建议使用残差均方根误差(RMSE),或者直接叠加绘制拟合曲线和原始散点图做直观判断。
内容的提问来源于stack exchange,提问作者Kevin Trinh
相关产品推荐
相关产品推荐

