Python / Numpy-用于在新数组中进行简单线性回归的返回斜率

问题描述 投票:0回答:1

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

我想创建一个存储所有截距和斜率的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']

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

太好了,有人可以帮助我:)

python arrays numpy linear-regression
1个回答
0
投票

您可以简单地计算列表中的坡度和截距并将其添加。

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轴。当然,对于相应行中的任何(x,y)对,slope, m = (y2-y1)/(x2-x1)和截距将为c = y - m*x。通过每个唯一的组对时,将斜率和截距存储在两个列表中。

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
© www.soinside.com 2019 - 2024. All rights reserved.