2013-12-08 16 views
6

Biraz kafa karıştırıcı başlık için özür dilerim, ama bunu nasıl daha net bir şekilde özetleyeceğimi bilemedim.İki düzensiz veri kümesi arasındaki noktaları nasıl arayabiliriz?

Her biri genel bir genel değere karşılık gelen iki takım X, Y verisi var. Ham verilerden oldukça yoğun bir şekilde örneklenmiştir. Aradığım şey, sahip olduğum kümeler arasında bir değer için verilen herhangi bir Y için enterpolasyonlu bir X bulmanın bir yoludur.

grafiği, bu daha açık hale getirir: Bu durumda,

A graph of points

, kırmızı çizgi 100 tekabül eden bir dizi olan, sarı hat 50

tekabül eden bir dizi olduğu Bu kümelerin, bir de gragis de togerlerine karsılık oldu assumgunu varsaymak istiyorum (bunlar, ayr ›ayr› X, Y ölçümlerinden olu evenmaktad ›rlar), X'in Y 500 olsayd X howr olmas hown how nasıl bulurum? 75 değerine karşılık gelen bir set için? Örnekte

burada benim istenen nokta buralarda olmasını beklediğiniz:

A graph of points with an interpolated point

Ben aşırı süslü olmak için bu işlevi gerekmez - bu veri noktalarının basit doğrusal interpolasyon olabilir. Sadece düşünüyorum diye düşünüyorum.

İki kümenin X'leri ve Y'lerinin mükemmel şekilde üst üste gelmediğini unutmayın. Bununla birlikte, "bu setlerin en yakın X noktası nerede," veya "bu setlerin paylaştığı en yakın Y noktası nerede" demek oldukça önemsizdir.

Bilinen değerler arasında basit enterpolasyon kullandım (örneğin "50" ve "100" için karşılık gelen Y'leri bulmak için X'i bulun, sonra "75" değerini almak için ortalamaları kullanın) ve sonuçta böyle bir şeye benziyorum. :

Not very good interpolation

Yani açıkça burada yanlış bir şey yapıyorum. Açıkçası bu durumda X, Y'nin "en düşük" kümenin maksimum Y'sinden daha yüksek olduğu tüm durumlar için 0'dır (doğru). İşler harika başlar ancak en düşük set için maksimum Y yaklaşmaya başladığında etrafta bir yer kalır.

Neden benimkilerin yanlış gittiğini görmek kolay. İşte sorun aramak için başka bir yol: "Doğru" versiyonda

Illustration

X civarından 250 yerine olmalı, ne esasen 400 ve 0 ortalaması var yapıyorum bu yüzden X 200'dür. Böyle bir durumda X için nasıl çözerim? Bilinçli enterpolasyonun cevabı tutabileceğini düşünüyordum ama bu konuda bir şeyleri bulamadığım şeyi açıklığa kavuşturabildim, çünkü bunların hepsi biraz farklı problemler için yapılandırılmış gibi görünüyor.

Yardımlarınız için teşekkür ederiz. Açıkçası, neyden bahsettiğimi görmeyi kolaylaştırmak için yukarıdaki verileri R'de grafiksel olarak çizerken, bunun son çalışmasının Javascript ve PHP'de olduğunu unutmayın. Ağır bir şey aramıyorum; basit daha iyidir.

+0

Bu, bir programlama probleminden daha fazla matematik problemine benzediğinden, muhtemelen http://math.stackexchange.com veya http://stats.stackexchange.com için daha uygundur. –

+1

Teorik olanın aksine pratik bir çözüm arıyorum. Bu tür forumlarla ilgili deneyimlerim, kod olarak nasıl uygulanacağımı bilmediğim zarif bir denklemle cevaplamaktan hoşlanıyorlar. (Ayrıca, şu anda matematik ya da istatistik ön sayfalarında soruların hiçbirini anlamıyorum, bu teşvik edici değildir ...) (Ne demek istediğimin bir örneği: http://math.stackexchange.com/questions/177491/ Nasıl yapılır-gerçekleştirmek-basit-doğrusal-enterpolasyon-bir-veri-set) – nucleon

+0

Kırmızı ve/veya sarı çizgi üzerinde bir noktaya sahip olmayabilir sorun mu? Eğer öyleyse, kırmızı ve sarı çizginin değerini ayrı ayrı enterpolasyonu yapabilir ve daha sonra ortalamaları alabilirsin ..? – thebjorn

cevap

9

İyi efendim, sonunda anladım.

The final product

Güzel: İşte sonuç bu! Ama ne kadar çok iş vardı.

Kodum herkesten çok kullanım olamayacak kadar parke taşlı ve projeme çok özeldir. Ama burada temel mantık var.

Sen den arasına sokmak için iki veri kümesi olması gerekir. Bunlara "dış" eğrisi ve "iç" eğrisi diyoruz. "Dış" eğrinin "iç" eğri ile tamamen örtüşmediği ve kesişmediği varsayılmaktadır. Eğriler gerçekten sadece X, Y veri kümeleridir ve Z olarak tanımlanan bir değerler kümesine karşılık gelir. Burada kullanılan örnekte, "dış" eğri, Z = 50'ye karşılık gelir ve "iç" eğri, Z = 100'e karşılık gelir. .

hedefi sadece tekrar etmek gerekirse, Z verileri üzerinde yaptığımız bilinen noktaları arasında bazı sayıdır herhangi bir Y X bulmaktır.

  1. Bilinmeyen Z'nin temsil ettiği iki eğri kümesi arasındaki yüzdeyi belirleyerek işe başlayın. Yani bizim örneğimizde Z = 75 ise, o zaman bu 0,5 olur. Z = 60 ise 0.2 olur. Z = 90 ise bu 0,8 olur. Y = istenen Y. bu noktada ve 0,0 arasında bir hat segmenti düşünün "dış" eğrisi veri noktasını seçmek bu oran S.

  2. arayın. AB olarak tanımlayın.

  3. Biz AB "iç" eğrisi ile kesiştiği bulmak istiyoruz. Bunu yapmak için, iç eğrinin her noktasında yineliyoruz. Seçilen nokta ile CD + + 1 arasındaki çizgi segmentini tanımlayın. AB ve CD'nin kesişip çarpmadığını kontrol edin. Değilse, yapana kadar yinelemeye devam edin.

  4. Bir AB-CD kavşağı bulduğumuzda, şimdi kavşak tarafından oluşturulan çizgiye ve 2. adımdan itibaren "dış" eğri üzerindeki orijinal noktamıza bakacağız. Bu çizgi parçası, daha sonra, iç kısım arasında bir çizgidir. ve çizginin eğiminin, grafiğin "aşağıya" doğru devam ettirileceği dış eğri, 0,0 ile kesişecektir. Bu yeni satır segmentini EF olarak tanımlayın.

  5. EF uzunluğunun (Adım 1) p yüzde yerini bulur. Y değerini kontrol edin. İstenilen Y değeri mi? Eğer (olası) ise, o noktanın X değerini döndürün. Değilse, Y'nin hedef A'dan daha az olup olmadığına bakın. Eğer öyleyse, o noktanın pozisyonunu düşük olarak dublaj yapacağım bir değişkende saklayın. Ardından, dış eğri üzerindeki bir sonraki nokta için tekrar 2. adıma geçin. , Y hedefinden daha büyükse ise, lowY'nin içinde bir değerin olup olmadığını görün. o, iki değerin ortalamasını hesaplar ve aralara X dönmek yoksa (Biz "kutulu" var bizim arzu başka bir deyişle, koordinat.)

Yukarıdaki prosedür oldukça iyi çalışıyor. Y = 0 durumunda başarısız olur, ancak bu iki özel nokta üzerinde sadece enterpolasyon yapabileceğiniz için bunu yapmak kolaydır. Numune sayısının çok az olduğu yerlerde, bu tür bir tür ürkütücü sonuçlar üretir, fakat sanırım bu beklenen bir şeydir (bunlar sadece 5000 ve 10000'ün bilinen nokta olduğu Z = 5000,6000,7000,8000,9000,10000). ve sadece 20 datapoints her biri - interpolated olan dinlenme):

Jaggy results

Ben, ancak puan gobs için çözme bilgisayarımda neredeyse ani optimize edilmiş bir çözümdür bu hiçbir iddialara yüzden varsayalım altındayım Modern bir makine için, en azından sahip olduğum toplam puan sayısıyla (eğri başına 30-50) çok fazla vergi alınmıyor.

Herkesin yardımları için teşekkürler; Bu konuda biraz konuşmamıza yardımcı oldu ve burada gerçekten gideceğim şeyin basit bir doğrusal enterpolasyon değil, eğri boyunca bir tür "radyal" enterpolasyon olduğunu fark ettim.

+2

Gerçekten güzel iş adamı. Aynı sorum vardı ama matlab kullanıyordum. İşte cevabınız buysa =) http://stackoverflow.com/questions/23494254/interpolation-between-two-curves-matlab – Nikko

İlgili konular