【问题标题】:Linear regression of 2 lists in pythonpython中2个列表的线性回归
【发布时间】:2019-09-06 21:20:44
【问题描述】:

您好,我有 2 个数字列表,我想从常规线性回归中获得 R^2。我认为这个问题已经发布了很多,但我无法在某个地方找到它。

我的清单:

my_y = [2,5,6,10]
my_x = [19,23,22,30]

我曾尝试将其更改为 numpy 数组,然后使用 sklearn 进行回归并获得我需要的东西,但我没有成功。我使用了以下代码:

from sklearn.linear_model import LinearRegression
import numpy as np

my_y = np.array([2,5,6,10]).reshape(1, -1)
my_x = np.array([19,23,22,30]).reshape(1,-1)

lm = LinearRegression()
result = lm.score(my_x, my_y)
print(result)

有没有人有一种快速的方法可以通过在这两个变量之间进行线性回归来获得 R^2?

此回归的预期输出为:R^2=0.930241

【问题讨论】:

标签: python python-3.x list numpy linear-regression


【解决方案1】:

通过快速浏览文档,我发现linear_model 需要您提供顾名思义的线性模型。得到一个简单的 R:

import scipy
my_y = np.array([2,5,6,10])
my_x = np.array([19,23,22,30])
R=scipy.stats.linregress(my_x, my_y)[2]
print(R)

0.9644898919194527

R**2 产生期望的结果 0.930。

【讨论】:

  • 嗨。嗯不?我期望结果等于 0.930241。为了得到这个结果,我使用了 Excel 的回归工具,我也应该能够用 python 得到相同的结果......
  • 好的,让我检查一下。
  • 是的。这很奇怪。老实说,我不知道为什么会这样。我对 scipy 的工作不多,但如果我从句子中实现其他解决方案,它似乎可以工作。我会查看文档,但我必须在几个小时内展示一些结果,而且我没有时间。我会在其他时间回到这个并深入研究它!
  • @George OP 要求 R-squared,而不是 R.
  • @Adrian 我浏览了文档,正如名称sklearn.linear_model 所暗示的那样,需要提供一个线性模型,以便程序“学习”然后输出结果。这就是它无法正常工作的原因。
【解决方案2】:

试试:

import scipy

my_y = [2,5,6,10]
my_x = [19,23,22,30]

slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(my_x, my_y)
    
print(r_value**2)

你会得到:

0.9302407516147975

来自 scipy 版本 '1.4.1'(感谢 @FlamePrinz 注意到新版本 scipy 的问题):

from scipy import stats

my_y = [2,5,6,10]
my_x = [19,23,22,30]

slope, intercept, r_value, p_value, std_err = stats.linregress(my_x, my_y)

print(r_value**2)

【讨论】:

  • 这可能会导致错误:AttributeError: module 'scipy' has no attribute 'stats'。你会想改为:from scipy import stats,然后调用它:slope, intercept, r_value, p_value, std_err = stats.linregress(my_x, my_y)
猜你喜欢
  • 2012-07-17
  • 2020-09-30
  • 2017-11-16
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 2012-04-26
  • 2021-10-28
相关资源
最近更新 更多