2013-07-11 42 views
6

我有一個算法問題。我不知道是否stackoverflow是正確的地方發佈它,但因爲我使用matlab,並希望與它做到這一點,我張貼在那裏。 我的問題如下:我有一組數據,除了事實上,在這組結束時,點必須非常線性。我想對線性分佈的這些點進行線性擬合,而不使用不是的部分。算法使數據集的一部分進行多項式擬合

(圖像始終是更好地理解):enter image description here

正如你看到的,我有藍色的數據,不是線性的,而是有末(紅色部分)的線性部分。我想要的是找到一種算法,讓我知道數據曲線的行爲何時結束其線性。

我不知道我是否清楚?

我已經嘗試了在右邊的幾個點,並使這幾點的線性擬合。然後給少數幾個點添加一些點,並檢查這些線性擬合是否「足夠接近」。然後再次與附加點等進行線性擬合,但我認爲這不是最好的解決方案,因爲「第一」點有很多噪音(這裏沒有在圖像上顯示)...

做你有任何想法或主張或鏈接?

謝謝!

+0

它會在最後變成幾乎線性嗎?或者您對任何細分市場中最長的直線感興趣? – Fallen

+0

@Fallen我不確定它會一直這樣做,但我認爲在大多數情況下,它會是非常線性的。 「任何細分市場中最長的直線」是什麼意思? – mwoua

+0

我的意思是你對僅在最後輸入數據時結束的唯一直線段感興趣嗎? – Fallen

回答

4

我想要的是找到一種算法,讓我知道數據曲線的行爲何時結束其線性。

線性數據具有特別好的屬性,它具有恆定的斜率。線性部分的二階導數應近似爲零。

使用樣條擬合(以某種平滑的數據是否有噪聲),讓您的數據的連續版本,稱之爲g(x)。當g''(x) ~ 0時,即當二階導數較小時,這是一個線性部分。

+0

這是個好主意! – mwoua

+2

事實上,它是;它可以非常有效地完成。你甚至不需要將數據轉換爲連續的。 [您可以計算離散數據的二階導數](http://en.wikipedia.org/wiki/Finite_difference),然後搜索二階導數位於小閾值內的區域。這是另一個SO問題,在Python中實現這個確切的算法http://stackoverflow.com/questions/13691775/python-pinpointing-the-linear-part-of-a-slope – darksky

+0

@darksky非常感謝你。 這裏是我的結果http://stackoverflow.com/q/17652128/2320757 。正如你所看到的,我面臨着另一個問題。如果你有時間,你可以檢查一下嗎? :) 謝謝! – mwoua

1

將您的數據片段設爲x位置,然後爲線性設置一些截止值。

  • 開始在一端
  • 檢查圖表
  • 的下一個預定義部分的Pearson相關係數如果超過某一閾值添加x到您的範圍所包括的部分,否則停在那裏

或者,您可以檢查線性是多個多項式配件的最佳擬合。爲此,我將:

  • 定義的順序一些通用功能1,n,其中n是非常小的(也許3)
  • 添加的數據點的線性測試集
  • 比較你的n最小二乘價值函數
  • 如果線性具有最小的最小二乘值,或者在n函數的最小值的某個距離內,則繼續添加點。否則停止並說最後一次加法之前函數是線性的。

這些都是至少相當簡單的做這件事的方式,在我的奧卡姆剃刀的頭腦,他們也有最低的複雜度(N *曲線擬合在這兩種情況下的複雜性,但第二個有一個更大的常量。)儘管很可能有更低複雜度的算法。

+0

我會試試這個,但它和我以前做的完全一樣。無論如何感謝 – mwoua

+0

@mwoua你也可以在非線性部分遞歸併獲得所有線性部分,但我不確定這對你是否有價值。 –

0

如果你有一個突然的過渡分段線性的行爲,你可以嘗試一個合適的形式

E[Y] = b0 + b1 * x + b2 * I + b3 * x * I 

的,我是一個indicator function這是1時,一些條件得到滿足,否則爲0。對於您的示例,條件可能是x > 0。如果兩段平行,b2係數將捕獲垂直位移,而b3項是一個「交互作用」,可捕獲指標斷點兩側的斜率變化。

如果過渡更漸進的,因爲你已經被畫出,然後我@同意A.Webb的有關與趨勢物流評論。

1

一種方法是用2多項式對它進行近似,從右到左有越來越多的點並觀察第三個係數。由於它保持足夠小,分佈也足夠線性。

事情是難以確定「足夠小」的數量以外的其他經驗。

另一種方式可能是對實際數據進行線性逼近的比較。以相同的方式添加從右到左測量近似標準偏差的點。只要滿意,近似值就好,數據可能是線性的。

而且稍微好一點,因爲偏差是一個相當透明的概念。