“Granola Bar” - Benzer Yapıların Toplam Kütlesini Bulmak için Algoritma?


19

Ben bir gezegensel bilim araştırmacısıyım ve üzerinde çalıştığım bir proje , Satürn'ün halkalarının N -body simülasyonları. Bu özel çalışmanın amacı, parçacıkların kendi yerçekimleri altında toplandıklarını izlemek ve kümelerdeki toplam kütlenin hücre içindeki tüm parçacıkların ortalama hızına karşı ölçülmesidir. Bunun , Satürn yaz gündönümü sırasında Cassini uzay aracı tarafından, büyük yapıların neredeyse kenar halkalarına gölge düşürdüğü gözlemlendiğinde yapılan bazı gözlemleri açıklayıp anlayamayacağını anlamaya çalışıyoruz . Aşağıda, verilen herhangi bir zaman testinin neye benzediğinin bir ekran görüntüsü bulunmaktadır. (Her parçacık 2 m çapındadır ve simülasyon hücresinin kendisi yaklaşık 700 m çapındadır.)

Siyah bir arka plana karşı küçük gölgeli küreler olarak gösterilen parçacıklar ile Satürn'ün halkalarının simülasyonunun _N_ gövdesi hücresi.

Kullandığım kod zaten her hızda ortalama hızı tükürüyor. Yapmam gereken, kümelerdeki parçacıkların kütlesini belirlemek için bir yol bulmak ve aralarındaki sokak parçacıklarını DEĞİL. Her parçacığın pozisyonunu, kütlesini, büyüklüğünü vb. Biliyorum, ama diyorum ki, 30.000-40.000 parçacıklarının 102.000-105.000 ile birlikte insan gözünün açık olduğu bir ipi oluşturduğunu bilmiyorum.

Bu nedenle, yazmam gereken algoritmanın, tüm parçacık konumlarından geçecek, hangi parçacıkların kümelere ait olduğunu anlayacak ve daha sonra kitle. Hücrenin üzerindeki her şeye karşı "her" yığın / iplikçik için yapabilseydim harika olurdu, ama aslında onları ayırmak için buna ihtiyacım olduğunu düşünmüyorum .

Ben düşünüyordum tek şey bir çeşit yapıyordu N 2 Ben en yakın 100 parçacıklar, belirli bir mesafe içinde idi sonra partikül a bir parçası olarak kabul edileceğini, her parçacığın arasında diyelim ki, eğer mesafe hesaplamak istiyorum mesafe hesaplama küme. Ama bu oldukça özensiz görünüyor ve ben CS millet ve programcılar daha zarif bir çözüm biliyor olabilir umuyordum?


Benim Çözeltisi ile Düzenlendi: Benim yaptığım en yakın komşu / kümelenme yaklaşımının bir tür almak ve kirli hızlı-n-yapmak oldu N 2 ilk uygulaması. Bu nedenle, her parçacığı alın, diğer tüm parçacıklara olan mesafeyi hesaplayın ve bir kümedeki eşik değeri d mesafede N parçacıkları olup olmadığıydı ( maalesef priori olarak ayarlanması gereken iki parametre , ancak bazılarının söylediği gibi) yanıtlar / yorumlar, bunlardan bazılarına sahip olmaktan kurtulmayacaktım).

Daha sonra mesafeleri sıralayarak değil, sadece bir sipariş N araması yaparak hızlandırdım ve d içindeki parçacıklar için bir sayaç arttırdım ve bu 6 faktörü kadar hızlandırdı. Sonra bir aptal programcı ağacı ekledim (çünkü biliyorum ağaç kodlarıyla ilgili hiçbir şeyin yanında). Simülasyon hücresini , ana ızgara hücreyle aynı hizaya geldiğinde , bir ızgara x ve y ile yarım kaydırılır ve diğer ikisi de kaydırılır, belirli sayıda ızgaraya (ızgara boyutu ≈7 d olduğunda en iyi sonuçlar ) bölerim 1/4 inç ± x ve ± y . Kod daha sonra parçacıkları ızgaralara böler, daha sonra her bir parçacık N'nin sadece o hücredeki diğer parçacıklara göre hesaplanmış mesafeleri olması gerekir.

Teorik olarak, bu gerçek bir ağaç olsaydı, N 2 hızlarının aksine N * log ( N ) siparişini almalıyım . İkisi arasında bir yere girdim, burada 50.000 parçacık alt kümesi için hızda 17 kat artış sağladım ve 150.000 parçacık hücresi için hızda 38 kat artış sağladım. Birincisi için 12 saniye, ikincisi için 53 saniye, 500.000 parçacık hücresi için 460 saniye. Bunlar, kodun simülasyon 1 zaman aşımını çalıştırmanın ne kadar sürdüğü ile karşılaştırılabilir hızlardır, bu nedenle bu noktada mantıklıdır. Oh - ve tamamen yivli, bu yüzden atabildiğim kadar çok işlemci alacak.


3
Bu konuda özellikle bilgili değilim, bu yüzden kendime yardımcı olmak için çok az şey sağlayabilirim, ancak Küme analizi hakkındaki Wikipedia makalesini okudunuz mu? Çok aktif bir çalışma alanı gibi görünüyor.
Cole Campbell

Ben bir küme kodu, en azından DBSCAN gibi bir şey hakkında ihtiyatlıyım, çünkü görsel olarak kümelerin bir parçası olmadığını ancak algoritmik olarak olabileceğini bildiğim bazı ince telleri takip edeceğini düşünüyorum. Kraterleri inceleyerek diğer işlerim için kullandığım için DBSCAN tipi kodlarla deneyimim var.
Stuart Robbins

1
Bu gibi telleri tanımlayan herhangi bir kod neredeyse kesinlikle bir çeşit "duyarlılık" ayarı ile gelir.
Robert Harvey

2
Kabul. Buradaki gerçek zorluk, "yığın" ın iyi tanımlanmış bir terim olmamasıdır. Günün sonunda , belki de bir çeşit gürültü azaltma geçişi ile birleştirilmiş bir tür küme analiz algoritması (gerçekten, önerilen çözümünüz zaten) ile gitmek zorunda kalacaksınız .
Cole Campbell

2
resminize geçerli bir küme (ve muhtemelen geçersiz bir
küme

Yanıtlar:


3

İlk önerim, sorununuzu iki soruna ayırmaktır: ilk olarak, ne istediğinizi ve ardından ne istediğinizi verimli bir şekilde nasıl elde edeceğinizi anlayın. Henüz tanımlamadığınız bir şeyi etkili bir şekilde elde edemezsiniz. Bu cevaba, bu tanımı bulmanıza yardımcı olabilecek bazı fikirler koyacağım. Önce sevdiğiniz fikirlerin verimsiz bir şekilde uygulanmasını, çok büyük olmayan birkaç veri kümesine uygulamanızı, sonuçları elle değerlendirmenizi, tanımınızı uyarlamanızı ve tekrarlanmanızı (muhtemelen burada başka bir soru sormayı), tanımınız. Bundan sonra, tanımınızın sonucunu nasıl etkili bir şekilde hesaplayacağınızla ilgili başka bir soru sormanızı öneririz (yine de yardıma ihtiyacınız varsa).

Öyleyse sezgisel bir 'iplikçik' fikrimize neyin karşılık geleceğini görelim. İplikleriniz kabaca eşit olarak dağıtılmış noktalardan oluşuyor gibi görünüyor, ancak yakınlaştırılmış bir resim (orijinal veri kümesinin) yaparak kontrol etmelisiniz - resminizin çözünürlüğü, noktaların kabaca eşit olarak dağıtıldığını kesin olarak söylemek için çok düşük . Bu cevap için olduklarını varsayacağım.

İlk fikir, her noktanın en yakın komşusuna bakmak olabilir. X noktasını seçelim, en yakın komşusu Y'yi seçip D'yi X ve Y arasındaki mesafe olarak ayarlayalım. Ardından X'in çevresindeki C * dairesine D * A yarıçapına bakalım, burada A bir ayar parametresidir, örneğin A = 3. X bir ipin parçasıysa, C'deki her Z noktası için Z'den en yakın komşusu W'ye olan mesafenin D ile aynı olmasını bekliyoruz. Eğer önemli ölçüde daha kısaysa, A'dan daha fazlasını söyleyin (veya belki başka bir parametre) B) o zaman X, görünüşe göre X'ten çok daha yakın noktalara yakındır, bu nedenle X muhtemelen bir ipin parçası değildir.

Ancak bu kriter tam değildir. Noktalarla yoğun alanlar ile noktalarla daha az yoğun alanlar arasında bir 'sınır' tespit etmek için bir kriter verir. Hâlâ noktaları bir araya getirmeliyiz.

Resminizde bunun basit olmadığını gösteren bir özellik var. Resminizin sağ alt köşesinde, çok fazla başıboş nokta bulunan nispeten geniş bir alan var. Bu başıboş noktaların kendileri kabaca eşit olarak dağıtılır, bu yüzden etrafındaki iplikçikteki tüm noktaları (ve diğer tüm noktaları) kaldıracak olursak, herhangi bir iplik saptama algoritmasının bu başıboş nokta kümesini bir iplik olarak işaretlemesini bekleriz! Bu nedenle, kümelerimizi oluştururken dikkatli olmalıyız.

Bir fikir aşağıdakileri yapmak olabilir. Köşelerin noktalar ve kenarlar olduğu bu noktalarda bir grafik yapacağız, iki noktanın benzer yoğunluğa sahip olduğunu gösterir. Her nokta için yukarıdaki kriteri kontrol ediyoruz. Kontrol edilirse, X'i bir kenarla C'deki tüm noktalara bağlarız. Kontrol etmezse, herhangi bir kenar eklemeyiz ve X'i 'başıboş' olarak işaretleriz. Bunu her nokta için yaptıktan sonra, bağlı bileşenler setini düşünüyoruz. Bunlar, tek tek (resminiz söz konusu olduğunda, ancak diğer veri kümelerinde birden çok) birden çok şerit içeren tüm bileşenlerden ve ayrıca tek başıboş noktalardan ve bu 'kaçak şeritlerden' oluşan daha fazla bileşenden oluşmalıdır. Bununla birlikte, bu başıboş ipliklerin içinde 'başıboş' olarak işaretlenmiş noktalar vardır, bu nedenle 'başıboş' olarak işaretlenmiş bir nokta içeren herhangi bir bileşeni göz ardı edebilirsiniz.

Bu fikrin bir tehlikesi, iplikçik boyunca hareket ettikçe, bir iplikçik yoğunluğunun sadece bir dizi başıboş nokta olacak kadar yavaşça azaldığı bir özelliğe sahip olabilmenizdir. Bizim ölçütümüz 'yerel' olduğundan, bunu algılamayabilir ve bu başıboş noktaları ipin bir parçası olarak işaretleyebilir. Bunun bir sorun olup olmayacağından emin değilim: Sanırım yoğunluğun değişmesi resminizde oldukça ani gözüktüğü için başıboş noktaların çoğu kriter tarafından yakalanmalıdır.

Bu sorun ortaya çıkarsa, yalnızca bağlı bileşenleri almaya bir alternatif deneyebilirsiniz. Her X noktası için, en yakın komşusu D (X) ile olan mesafeyi hesaplıyoruz. Noktadan minimum D (X) ile başlıyoruz ve bir BFS (veya DFS gerçekleştiriyoruz , sipariş önemli değil). D (Y) ile başladığımız D (X) 'den (ayarlanabilir bir faktörle) daha büyük olmayan herhangi bir Y noktasını ekliyoruz. Çok büyük D (Y) olan bir Y noktasıyla karşılaşırsak, kenarı (X, Y) kaldırır, Y'yi 'başıboş' olarak işaretler ve BFS'de Y'yi hiç ziyaret etmemiş gibi davranırız. Doğru ayarlandıysa, bu yukarıda tarif ettiğim sorunu önlemelidir.

Bu sorunu çözmek için alternatif bir fikir biraz daha yerel davranır: bir BFS yapabilir ve en düşük D (X) 'i takip edebilirsiniz (bir nokta etrafındaki yoğunluğun bir ölçüsü olarak D (X) kullanıyorum) en fazla 10 BFS adımlarından önce gelir ve bu D (X) 'den çok daha büyük bir D (Y) değerine sahip bir Y ile karşılaşırsak, sunduğum diğer (potansiyel) çözümle aynı şeyi yaparız.

Bir feragatname olarak: yukarıdaki tüm fikirler hemen şimdi düşündüm, bu özel sorunun daha önce çalışılıp çalışılmadığını gerçekten bilmiyorum, bu yüzden saçmalık çimleniyor olabilirim. Size mantıklı gelen fikirleri (fikirlerim ya da kendi fikirlerim) deneyin ve gerçekten işe yarayıp yaramadıklarını öğrenin ve ancak o zaman bunları verimli bir şekilde uygulamaya odaklanın.


2

Modüler ayrışma kullanarak tüm parçacıkları yaprak olarak içerecek ve üst düğümler bunları kümeleyecek bir ağaç oluşturabilirsiniz. Bu ağaca dayanarak, kökten yapraklara doğru her düğümüne uygulanan önlemleri tanımlayabilirsiniz. Ölçümler kullanıcı tanımlı eşiklere ulaştığında bunu aşağı doğru hareket ettirmeyi durdurursunuz. Böyle bir ölçüm, bir kümedeki tüm parçacıkların dışbükey gövdesinin yoğunluğu olabilir.


1

Bence bir makine öğrenme kümeleme algoritmasının peşindesiniz.

Python SciKit Learn araç setindeki bu sayfada , DBSCAN algoritmasının (Wikipedia) aradığınız şey olabileceğini gösteren resimler bulunmaktadır. Giriş parametresi mahalle boyutu olduğu için ideal görünüyor, diğer kümeleme algoritmalarının çoğu da önceden bilmediğiniz kümelerin sayısını istiyor.

Portland, OR 2. Uluslararası Bilgi Keşfi ve Veri Madenciliği Konferansı Bildirilerinde "Gürültülü Büyük Uzamsal Veritabanlarında Kümeleri Keşfetmek için Yoğunluk Bazlı Bir Algoritma" Ester, M., HP Kriegel, J. Sander ve X. Xu. , AAAI Press, s. 226-231. 1996


0

Bu sorunu düşünüyorum. Ben bir fizik uzmanı değilim, bu yüzden bana katlan.

Görünüşe göre kümeleri belirlemek için önemli olan parçacıklar arasındaki mesafe değildir. Yerçekimi alanlarının çakışıp çakışmadığıdır.

Bir parçacık P alın ve diğer parçacıkların örtüşen ağırlık alanlarına sahip olduğunu belirleyin.

Sonra bunlardan birini alın ve aynı şeyi yapın. Amacınız kümedeki tüm parçacıkları bulmak değil, sınırlarını bulmaktır.

Tüm kümeler bulunana kadar bunu tekrarlayın.

Şimdi geri dönün ve kümelerin kütlesini belirleyin. Kaçak parçacıkları ortadan kaldırmış olacaksınız ve kütleyi bulmak için yığın sınırlarını kullanabilirsiniz.

Bunun yardımcı olup olmadığından emin değilim, ama aklıma gelen tek şey bu.


Bir nedir yerçekimi alanı ?
David Cowden

0

Her zaman adımının sonunda, verileri bir grafiğe dönüştürebilir, minimum yayılan ağacı hesaplayabilir ve ardından belirli bir eşiği aşan kenarları kaldırmaya başlayabilirsiniz. Bu size kümeler ve her kümedeki parçacıklar arasında numaralandırmanın kolay bir yolunu vermelidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.