【问题标题】:Python/Numpy - return slope for simple linear regression in a new arrayPython/Numpy - 新数组中简单线性回归的返回斜率
【发布时间】:2020-05-26 13:18:24
【问题描述】:

我正在寻找以下问题的答案:

我想创建一个存储所有截距和斜率的 numpy 数组。斜率是means 相对于years 的增加。我找到了多种计算截距/斜率的方法,但我真的错过了将它们放入新数组的链接(我是 Numpy 的新手,所以逻辑正在慢慢到达那里,但我现在被困了一天。 .)

所以.. 我有一个结构如下的数组:

x = np.array([(2000, 'A', '1',5), (2001, 'A', '1', 10),
              (2003, 'A', '1',15), (2004, 'A', '1', 20),
              (2000, 'A', '2',1), (2001, 'A', '2', 2),
              (2002, 'A', '2', 3), (2003, 'A', '2', 4)],
             dtype=[('year', 'i4'), ('group1', 'U2'), ('group2', 'U2'), ('means', 'i2')])

我想最终得到一个这样的数组:

>desired_array
array([('A', '1', 5, 5), 
       ('A', '2', 1, 1)],
       dtype=[('group1', '<U2'), ('group2', '<U2'), ('intercept', '<i2'), ('slope', '<i2')])

我已经到了这一点:

ans, indices = np.unique(x[['group1', 'group2']], return_inverse=True)
desired_array = np.empty(2, dtype=[('group1', 'U2'), ('group2', 'U2'), ('intercept', '<f8'),
                                   ('slope', '<f8')])
desired_array['group1'] = ans['group1']
desired_array['group2'] = ans['group2']
x = x[x['year'] == 2000]
desired_array['intercept'] = x['means']

这有点粗糙,我仍然可以改进,但我遇到的主要问题是如何将每条回归线的斜率添加到数组中。

如果有人可以帮助我,那就太好了:)

【问题讨论】:

  • 最后是什么desired_array['a']?正如我所见,它没有任何“a”字段
  • 啊,是的,我的错,我编辑成了“拦截”。另请注意:我现在需要调整截距计算,这只是一个简单的示例,主要问题是添加斜率

标签: python arrays numpy linear-regression


【解决方案1】:

您可以简单地计算列表中的斜率和截距并将它们添加进去。

x = np.array([(2000, 'A', '1',5), (2001, 'A', '1', 10),
              (2002, 'A', '1',15), (2003, 'A', '1', 20),
              (2000, 'A', '2',1), (2001, 'A', '2', 2),
              (2002, 'A', '2', 3), (2003, 'A', '2', 4)],
             dtype=[('year', 'i4'), ('group1', 'U2'), ('group2', 'U2'), ('means', 'i2')])

请注意,我已将第 3 行和第 4 行的年份值更改为 2002 和 2003 年,而不是 2003 年和 2004 年,因为那时它不是一条直线。在本例中,我将年份视为 x 轴,并将其视为 y 轴。当然,slope, m = (y2-y1)/(x2-x1) 和截距将是 c = y - m*x 对于相应行中的任何 (x,y) 对。在遍历每个唯一组对时,将斜率和截距存储在两个列表中。

unique_groups = np.unique(x[['group1', 'group2']])

slopes, intercepts = [],[]
for group in unique_groups:
    current_group = x[x[['group1', 'group2']]==group]
    x_g = current_group['year']
    y_g = current_group['means']
    slope = (y_g.max()-y_g.min())/(x_g.max()-x_g.min())
    intercept = y_g[0]-slope*x_g[0]
    slopes.append(slope)
    intercepts.append(intercept)

只需将计算值插入所需的数组。

desired_array = np.empty(len(unique_groups), dtype=[('group1', 'U2'), ('group2', 'U2'), ('intercept', '<f8'),
                                   ('slope', '<f8')])
desired_array['group1'] = unique_groups['group1']
desired_array['group2'] = unique_groups['group2']
desired_array['intercept'] = intercepts
desired_array['slope'] = slopes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 2021-02-25
    相关资源
    最近更新 更多