【问题标题】:Efficiently calculating a segmented regression on a large dataset在大型数据集上有效地计算分段回归
【发布时间】:2015-05-27 17:23:19
【问题描述】:

我目前有一个大型数据集,我需要为此计算分段回归(或以某种类似的方式拟合分段线性函数)。但是,我既有庞大的数据集,也有非常多的片段。

目前我有以下方法:

  • 设 si 为段 i 的结尾
  • 令 (xi,yi) 表示第 i 个数据点

假设数据点 xk 位于段 j 内,那么我可以从 xk 创建一个向量作为

(s1,s2-s1,s3-s2,...,xk-sj-1,0,0,...)

要对数据点进行分段回归,我可以对这些向量中的每一个进行正常的线性回归。

但是,我目前的估计表明,如果我以这种方式定义问题,我将获得大约 600.000 个向量,每个向量包含大约 2.000 个组件。我还没有进行基准测试,但我认为我的计算机无法在任何可接受的时间内计算出如此大的回归问题。

有没有更好的方法来计算这种回归问题?一个想法是可能使用某种分层方法,即通过组合多个段来计算一个回归问题,以便我可以确定该集合的起点和终点。然后为这组分段计算一个单独的分段回归。但是,我不知道如何计算这组段的回归,以便端点匹配(我只能通过固定截距来匹配起点或终点,但不能同时匹配两者)。

我的另一个想法是计算每个段的单独回归,然后只使用该段的斜率。但是使用这种方法,错误可能会开始累积,我无法控制这种错误累积。

还有一个想法是我可以对每个段进行单独的回归,但将截距固定到前一个段的端点。但是,我仍然不确定,如果我可以通过这种方式获得某种错误累积。

澄清

不确定问题的其余部分是否清楚这一点。我知道这些片段的开始和结束位置。最重要的部分是,我必须让每条线段在线段边界与下一条线段相交。

编辑

也许另一个事实可以提供帮助。所有点都有不同的 x 值。

【问题讨论】:

  • 每段平均和最少有多少分?
  • 每个段应该有300分左右。再想一想这个问题,实际上可能有一些段没有任何点。在我考虑设置分段以便始终在其中包含一些点之前,但我刚刚注意到,我可能会加入一些可能具有不同斜率的部分。

标签: algorithm bigdata regression modeling


【解决方案1】:

我会将点分组到矩形网格区域

基于他们的位置。因此,您在更小的数据集上处理此任务,然后在所有完成后将结果合并在一起。

我会这样处理每个组:

  1. 计算角度直方图

  2. 只取出现次数最多的角度

    它们的计数决定了组中存在的线段数

  3. 对这些角度进行回归/直线拟合

    看到这个Answer 它做了一些非常相似(只是单行)

  4. 计算交点

    在线段之间获取分段折线的端点以及连接信息(加入最近的端点)

[edit1] OP 编辑​​后

您知道所有线段(x0,x1,...) 的边缘x 坐标,因此只需计算线段边缘附近点的平均y 坐标(灰色区域,绿点),然后您就得到了线段线端点(蓝点)。粗略地说,这是不适合或回归的,因为丢弃了所有其他点,所以它会导致更大的错误(除非段 x 协调对应于回归线......)但是在解决方案的约束下没有办法解决你有(至少我没有看到)。

因为如果您对分段数据使用回归,那么您无法将其连接到其他分段,如果您尝试合并它们,那么您得到的结果几乎与此相同:

灰色区域的大小决定了输出...所以玩一下...

【讨论】:

  • 我不确定我是否理解正确。据我了解,这种方法试图找到一条最适合一组点的折线,但没有一个顶点坐标是已知的。这种理解正确吗?但是,对于我的数据,我需要顶点位于固定的 x 坐标处。因此,分段回归方法可确保分段在顶点的 x 坐标处相遇。如果我单独计算每个段的斜率,它们可能会在不同的 x 坐标处相遇。
  • @LiKao 这个查找线/轴对应于点云,然后您需要根据端点距离将所有找到的线连接在一起...顺便说一句,您的数据是否是函数(因此还有更多 @987654327 @ 单个 x 可能的值?)数据输入的一个例子就可以了(二维图)
  • @LiKao 阅读您的编辑后我更新了我的答案(希望我做对了)
  • 我之前也在考虑类似的解决方案......但是,我还没有遵循它,因为这种方法会放大段边界附近点的误差。我想我将不得不在一个小数据集上尝试不同的方法,看看它们是如何比较的。
  • 也为您的评论“如果您对细分数据使用回归,那么您无法将其连接到其他细分”。这实际上并不是什么大问题。我在我的问题中解释的回归方法很容易连接各个部分,但是使用它的复杂性很高。我还可以轻松地迭代计算段,然后连接到前一个或下一个段的端点(通过固定截距),但不能同时连接到前一个和下一个端点。另外,如果我这样做,我会担心稳定性。错误可能会累积,我无法证明它们不会。
猜你喜欢
  • 1970-01-01
  • 2011-08-17
  • 2014-03-10
  • 2020-05-28
  • 2012-04-27
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
相关资源
最近更新 更多