2013-12-08 62 views
6

我很抱歉有些令人困惑的標題,但我不確定如何總結這個更清晰。如何內插兩個不規則數據集之間的點?

我有兩組X,Y數據,每組對應一個總的總體值。他們從原始數據中進行相當密集的抽樣。我正在尋找的是一種爲任何給定的Y找到插值X的方法,以獲得我已擁有的集合之間的值。

圖表使這更清楚:

A graph of points

在這種情況下,紅色線是從對應於100的一組,黃線是從對應於50

一組我想能夠說,假設這些集合對應於值的梯度(儘管它們明顯由離散的X,Y測量值組成),那麼我如何找到,比如說,如果Y爲500對於一個相當於75的值的集合?

在這裏的例子我希望我所希望的點是什麼地方在這裏:

A graph of points with an interpolated point

我不需要這個功能過於花哨 - 它可以是數據點的簡單線性插值。我只是無法思考。

請注意,兩組的X和Y都沒有完全重疊。然而,「這些集合最接近的X點在哪裏」或「這些集合共享的最接近的Y點在哪裏」的說法相當簡單。我已經在已知值之間使用了簡單的插值(例如找到設置爲「50」和「100」的相應Ys的X值,然後平均值得到「75」),最後我看到類似這樣的東西:

Not very good interpolation

所以很明顯,我在這裏做了什麼。很明顯,在這種情況下,對於Y高於「最低」集合的最大值Y的所有情況,X(正確)返回0。事情從一開始就很好,但是當某個人開始接近最低值Y時,它開始出現故障。

很容易明白爲什麼我的錯誤。這裏是另一種方式來看待這個問題:

Illustration

在「正確」的版本,X應該是約250相反,我在做什麼基本上是平均400和0,X是200。在這種情況下我如何解決X?我認爲雙線性插值可能會有答案,但是我一直沒能找到答案,這就清楚地說明了我將如何去做這類事情,因爲它們似乎都是針對不同的問題構建的。

謝謝您的幫助。請注意,儘管我已經明確地繪製了R中的上述數據,以便輕鬆查看我在說什麼,但最終的工作是使用Javascript和PHP。我不是在尋找一些重任;簡單就好。

+0

這聽起來更像是一個數學問題,而不是編程問題,所以可能更適合http://math.stackexchange.com或http://stats.stackexchange.com。 –

+1

我正在尋找一種實用的解決方案,而不是理論上的解決方案。我對這類論壇的經驗是他們想回答一個優雅的等式,我不知道如何實現代碼。 (另外,我從字面上理解目前在數學或統計數據首頁上沒有任何問題,這不是令人鼓舞的......)(我的意思是一個例子:http://math.stackexchange.com/questions/177491/如何執行簡單線性插值的數據集) – nucleon

+0

問題是您可能在紅線和/或黃線上沒有重點?如果是這樣,你可以分別插入紅線和黃線的值,然後取平均值..? – thebjorn

回答

9

好主人,我終於明白了。下面是最終的結果:

The final product

美麗!但是,它是多麼多的工作。

我的代碼太拙劣,對我的項目來說太具體以至於沒有太多用處。但這是底層的邏輯。

您必須有兩組數據才能從中插入。我稱這些爲「外部」曲線和「內部」曲線。假定「外」曲線完全包含並且不與「內」曲線相交。曲線實際上只是X,Y數據的集合,並對應於一組定義爲Z的值。在此處使用的示例中,「外部」曲線對應於Z = 50,「內部」曲線對應於Z = 100

重申的目標是爲任何給定的Y找到X,其中Z是我們已知的數據點之間的某個數。

  1. 首先計算未知Z表示的兩組曲線之間的百分比。所以如果在我們的例子中Z = 75,那麼結果爲0.5。如果Z = 60,那將是0.2。如果Z = 90那麼那將是0.8。稱此比例P.

  2. 在「外」曲線上選擇數據點,其中Y =您想要的Y.想象一下該點與0,0之間的線段。將其定義爲AB。

  3. 我們想找到AB與「內」曲線相交的地方。爲此,我們遍歷內部曲線上的每個點。將所選點與點+1之間的線段定義爲CD。檢查AB和CD是否相交。如果沒有,繼續迭代直到他們做。

  4. 當我們找到一個AB-CD交點時,我們現在看看交點和我們原點在步驟2的「外」曲線上創建的線。然後,該線段是內部和外部曲線,其中該線的斜率將在圖表中「向下」延續,將與0,0相交。將此新線段定義爲EF。

  5. 找到EF長度的百分比(來自步驟1)的位置。檢查Y值。這是我們期望的Y值嗎?如果是(不太可能),則返回該點的X.如果不是,請查看Y是否小於目標Y.如果是,則將該點的位置存儲在一個變量中,我將該變量設置爲lowY。然後再次返回步驟2查找外曲線上的下一個點。如果它大於目標Y,請查看lowY是否有值。如果是的話,這兩個值之間的插值,並返回插值X.(我們已經「在盒子裏」我們所期望的座標,換句話說。)

上述程序工作得很好。它在Y = 0的情況下失敗,但很容易做到這一點,因爲你可以對這兩個特定點進行插值。在樣本數量少得多的地方,它會產生一些棘手的結果,但我想這是可以預期的(這些是Z = 5000,6000,7000,8000,9000,10000,其中只有5000和10000是已知點他們有各自只有20個數據點 - 插值的其餘部分):

Jaggy results

我下毫不做作,這是一個優化的解決方案,但求解點的採空區實際上是瞬時的我的電腦上,所以我承擔對於現代化的機器來說,這不是太重要,至少是我擁有的總點數(每條曲線30-50)。

感謝大家的幫忙;它通過一點點說明了這一點,並且意識到我在這裏所做的並不是簡單的線性插值,而是沿曲線的一種「徑向」插值。

+2

真的很好的工作人。我有同樣的問題,但使用matlab。這裏是答案,如果你想它=) http://stackoverflow.com/questions/23494254/interpolation-between-two-curves-matlab – Nikko

相關問題