python - 为线性回归计算 R^2:SSreg/SStot 与 1-(SSSres/SStot) 导致不同的结果
问题描述
我正在尝试计算回归的 R^2。查看这篇文章,它可以通过 SSreg/SStot 或 1-(SSSres/SStot) 来计算。我的印象是我最终会得到相同的值,但是,我似乎有前一个公式给我 5%,而后一个公式我最终得到 -1% 的情况。这是否可能,如果可能,在什么情况下?
实现如下:
r2 = np.sum(df['fi']-df['yi'].mean()) ** 2) / np.sum(df['yi']-df['yi'].mean()) ** 2)
r2 = 1 - (np.sum((df['yi']-df['fi']) ** 2) / np.sum(df['yi']-df['yi'].mean()) ** 2))
有什么问题吗?如果不是,什么可以解释差异甚至负值?
编辑:
修正括号问题,问题依旧。以下计算不会导致相同的结果
r2 = np.sum( (df['fi']-df['yi'].mean())**2 ) / \
np.sum( (df['yi']-df['yi'].mean())**2 )
r2 = 1 - np.sum( (df['yi']-df['fi'])**2 ) / \
np.sum( (df['yi']-df['yi'].mean())**2 )
解决方案
我认为你有括号问题。您正在对应该对平方求和的总和进行平方。平方应该在sum
函数内部,而不是外部:
r2 = np.sum( (df['fi']-df['yi'].mean())**2 ) / \
np.sum( (df['yi']-df['yi'].mean())**2 )
r2 = 1 - np.sum( (df['yi']-df['fi'])**2 ) / \
np.sum( (df['yi']-df['yi'].mean())**2 )
推荐阅读
- javascript - Javascript - 从函数调用变量
- java - 尝试在 Go 中实现 Java Guava sets.difference
- excel - 按日期锁定 Excel 列
- python - 在 Python 中从我的字符串中去除无效和非 ascci 字符
- java - IntelliJ IDEa 2018.2 使用 JDK 11 将 var lambda 参数突出显示为错误
- yii2 - 与 lib 供应商/markbaker 不一致
- java - JVM 线程创建速度非常慢(java.lang.Thread.setPriority0() 中的停顿时间很长)
- python - Dask Distributed中的Python包研发
- python - 在使用 Python 的 Pyspark 中 - 逐行检查一个特定列是否包含关键字列表。如果是,将匹配的关键字复制到另一列
- mysql - 如何在 mysql 中创建字母数字自动增量序列?