En yakın komşu sorunu, mekansal analizde sürekli olarak ortaya çıkan şeylerden biridir. Basit ve verimli bir şekilde nasıl çözüleceğini bilmek çok yaygındır. Bu makale, hem SQL hem de Python'daki soruna ve çözümlere bir giriş niteliğindedir.
Problemi tanımlamak kolaydır: uzaydaki iki nesne kümesi, A kümesi ve B kümesi, A'daki (başlangıç kümesi) her nesne için B'deki (hedef kümesi) en yakın nesneyi bulun.
A kümesinin kütüphaneleri ve B kümesinin eğlence merkezlerini temsil ettiğini ve her kütüphaneye en yakın hangi eğlence merkezinin olduğunu bilmek istediğinizi hayal edin.
Bu sorunun çözümü aşağıdaki gibidir (şekil 1):
Algoritma, benzersiz ilişkiler üretmek için değiştirilebilir. Başka bir deyişle, bir varış noktası bir orijin tarafından alınırsa, algoritma size bir sonraki en yakın olanı sağlayabilir.
Bu gönderideki örnekler için iki veri seti kullanıyoruz: biri Trafford'daki kütüphaneler için ve diğeri Trafford veri laboratuvarından (2021) eğlence merkezleri için. Bunları kullanarak indirebilirsiniz:
wget https://www.trafforddatalab.io/council_open_data/assets/leisure_centres/leisure_centres.geojson ; wget https://www.trafforddatalab.io/council_open_data/assets/libraries/libraries.geojson
Bu makaledeki tüm SQL örnekleri, PostGIS (PostGIS Developers, 2020) içeren bir postgreSQL (Postgresql.org, 2019) veritabanı içindir. Tablolar "leisure_centres" ve "libraries" olarak adlandırılır, her ikisi de "trafford" adlı şemada saklanır ve her ikisinin de bir "id" sütunu, bir "name" sütunu ve bir "geom" sütunu vardır.
Her kütüphane için en yakın eğlence merkezini bilmek istediğimizi varsayarsak, algoritma uygulaması aşağıdaki gibidir:
Sorgunun farklı kısımlarını analiz edelim:
Bağlantılar, önceki sorgunun küçük bir modifikasyonu olan QG'de çalıştırılarak üretilebilir:
Bu örnek ortalama 67 msn'de çalışıyor, bunu Python sürümleriyle karşılaştıracağım.
Bazı durumlarda sadece en yakın komşularla değil, aynı zamanda en yakın komşulardan oluşan bir grupla da ilgileniyoruz. Bunu basit bir kod değişikliği ile başarabiliriz. Örneğin, her kütüphane için en yakın 2 eğlence merkeziyle ilgileniyorsak, bunu kullanabilirsiniz:
Tablo 2 çıktıyı gösterir.
Bu örnek ortalama 108 msn'de çalışır.
Amaç, Geopandas kullanarak SQL örneği 1'in çıktısını çoğaltmaktır ( Jordahl ve diğerleri, 2020). Algoritma aynı, hepsini birleştiriyoruz, mesafeyi hesaplıyoruz, değerleri sıralıyoruz ve en yakın olanı seçiyoruz.
Önce kütüphaneleri içe aktaralım ve verileri okuyalım:
Önemli kısım, algoritmanın tüm adımlarını takip ettiğimiz bir sonraki fonksiyondur:
Şimdi iki şey yapmalıyız: ilk önce işlevi uygulayın, böylece en yakın geometriler için tanımlayıcıların bir listesini elde edebiliriz. İkinci olarak, bu tanımlayıcıların değerlerini alırız.
İşlev, her zaman başlangıç ve hedef tanımlayıcılarını döndürmek için yazılmıştır, bu daha güvenlidir çünkü tüm veri çerçevelerinin dizinleri vardır, ancak tüm veri çerçeveleri sütunları için aynı adlara sahip değildir. Kodun ikinci kısmı bu tanımlayıcıları değerlere dönüştürür:
Çıktı, SQL örneği 1'e benzer:
Bu, SQL'e kıyasla şaşırtıcı derecede hızlı olan ortalama 5 msn'de çalışır. Bu yazının sonunda karşılaştırmak için daha büyük bir veri kümesiyle bir alıştırma yapacağım.
Şimdi SQL örneği 2'de yaptığımız gibi Geopandas kullanarak K en yakın komşuyu bulmaya çalışalım. Daha önce olduğu gibi, algoritma değişmez, sadece uygulama değişir. Fonksiyonu değiştiriyoruz, böylece şimdi istenen en yakın komşuların miktarını temsil eden üçüncü bir değişken olan k'yi kabul ediyoruz:
Fonksiyonu çağırır ve çıktıyı alırız (tablo 4):
Bu örnek ortalama 7 msn'de çalışır.
Şimdiye kadar tüm örnekler oldukça küçük bir çift veri seti kullanılarak yapıldı. Biri 13 satır uzunluğunda ve diğeri 17. Alıştırma 1'i OS Open UPRN ve Code-Point® Open'ı UPRN ile orijin olarak kullanarak tekrarlayacağım.
Her iki veri seti de şuradan indirilebilir: https://osdatahub.os.uk/downloads/open (2021).
Tabloları yalnızca Beyaz At Vadisi bölgesindeki geometrilere indirdim. Bu bize 80347 UPRN ve 4074 Kod noktası verir. Bunlar hala küçük veri kümeleri, daha gerçek bir alıştırmanın içinde milyonlarca satır veya en az yüz binlerce satır içeren tabloları içereceğini söyleyebilirim. Ancak performans farklarını göstermek için basit tutacağım.
PostgreSQL'de Geopandas'ın SQL'e karşı performansını etkileyebilecek birçok yön vardır:
Sorguların ve işlevlerin büyük bir görevle boğulmadığından emin olmak için bazı ayarlamalar yapmamız gerekiyor. SQL için yapmamız gerekenler:
İndeksleri oluşturalım ve sorguyu mesafe kısıtlamaları ile değiştirelim:
Çıktıyı çağırmadığıma ama yeni bir tabloya yönlendirdiğime dikkat edin. Çıktı büyük olabilir ve kesinlikle ikinci kez uzun bir sorgu çalıştırmak istemezsiniz. Bu sorgu 3 dakika 28 saniye sürer.
Geopandalar için indekslerden faydalanabilmemiz için kodu yeniden yazmamız gerekiyor. Verileri içe aktarıyoruz, yeni işlevi tanımlıyoruz ve şu şekilde uyguluyoruz:
Bu sorgu 35 dakika ve 42 saniye içinde çalışır.
Gördüğünüz gibi, bu durumda Geopandas SQL'den daha hızlı çalışmıyor.
Başka bir alternatif daha var: her iki tablo da nokta olduğundan, geometrileri koordinatlar olarak gösterebilir ve daha sonra en yakın komşuyu hesaplamak için scikit-learn'i kullanabiliriz (Pedregosa ve diğerleri, 2011). Bu sadece 106 msn'de çalışır. Bu yaklaşımın tek dezavantajı noktalardan farklı geometrilerin kullanılamamasıdır:
Tüm yürütme hızları tablo 5'te gösterilmiştir:
En yakın komşu problemi, basit bir çözümü olabilen ancak yoğun hesaplama gerektiren bir çözüm gerektiren uzamsal analizdeki temel problemlerden biridir.
Hem SQL hem de Python kullanarak seçenekleri gösterdim. Daha kesin olmak gerekirse, PostGIS, Geopandas ve Scikit-learn ile seçenekler gösterdim.
Görev küçük olduğunda Geopandas'ın harika olduğu açıktır. PostGIS, özellikle sunucu iyiyse, görev daha büyük olduğunda daha iyi sonuç verir. Scikit-learn süper hızlıdır ancak puanla sınırlıdır.
Performans sadece kullandığınız dilden değil, aynı zamanda donanım, konfigürasyon, indeksler vb. tüm ortamdan etkilenir.
Umarım bu makaleyi beğenmişsinizdir, ancak algoritmayı veya kodu iyileştirme önerileriniz varsa lütfen yorum yapmayı unutmayın.
Kelsey Jordahl, Joris Van den Bossche, Martin Fleischmann, Jacob Wasserman, James McBride, Jeffrey Gerard, … François Leblanc. (2020, 15 Temmuz). jeopandalar/jeopandalar: v0.8.1 (Sürüm v0.8.1). Zenodo. Şu adresten ulaşılabilir: http://doi.org/10.5281/zenodo.3946761 .
osdatahub.os.uk. (2021). İşletim Sistemi Veri Merkezi . [çevrimiçi] Şurada mevcuttur:https://osdatahub.os.uk/.
Pedregosa, F., Varoquaux, G., Gramfort, A., Michel, V., Thirion, B., Grisel, O., Blondel, M., Prettenhofer, P., Weiss, R., Dubourg, V., Vanderplas, J., Passos, A., Cournapeau, D., Brucher, M., Perrot, M. ve Duchesnay, É. (2011). Scikit-learn: Python'da Makine Öğrenimi. Journal of Machine Learning Research , [çevrimiçi] 12(85), s.2825–2830. Mevcut:https://jmlr.csail.mit.edu/papers/v12/pedregosa11a.html
PostGIS Geliştiricileri (2020). PostGIS — PostgreSQL için Uzamsal ve Coğrafi Nesneler . [çevrimiçi] Postgis.net. Mevcut:https://postgis.net/.
Postgresql.org. (2019). PostgreSQL: Dünyanın en gelişmiş açık kaynak veritabanı . [çevrimiçi] Şurada mevcuttur:https://www.postgresql.org/.
Trafforddatalab.io. 2021. Trafford Veri Laboratuvarı . [çevrimiçi] Şurada mevcuttur:https://www.trafforddatalab.io/ .
Özlü, okunabilir ve verimli kod yazmak ister misiniz? Python dekoratörleri yolculuğunuzda size yardımcı olabilir. Fluent Python'un 7. bölümünde Luciano Ramalho, dekoratörleri ve kapanışları tartışıyor.
Python 3 kullanarak harf konumu olasılıklarından yararlanarak Wordle'ı çözme Herkese merhaba, şimdiye kadar hepiniz Twitter'ın en yeni takıntısı olan Wordle'ı görmüşsünüzdür. Eğer benim gibiyseniz, bu oyunla uğraşırsınız.
Feragatname: 'A Little Life'ı okumak istiyorsanız, çok uzun bir liste olduğu için tetikleyici uyarıları gözden geçirmenizi şiddetle tavsiye ediyorum. Tetikleyici uyarılarda bahsedilen herhangi bir travma veya ruh sağlığı sorunu yaşıyorsanız, bunu okumaya karar verirseniz ekstra önlem almanızı tavsiye ederim.
Her şey bildiğiniz küçük şeylerle ilgili ;-) Cihazlarınızdaki küçük etkileşimlere hiç dikkat ettiniz mi? Telefonunuzu şarja takarken/çıkarırken aldığınız geri bildirimleri beğendiniz mi? Belki sesli asistanınızı her etkinleştirdiğinizde küçük bildirim sesi gelir? Yenile'ye her bastığınızda masaüstü simgelerinin kaybolması ve yeniden görünmesi ne olacak? Mikrodalga bittiğinde 'ding' sesi mi geliyor? Ya da tost makinenizdeki yeşilden kırmızıya dönen ışık? Bu eylemlerin çoğu, Mikro etkileşimleri hesaba katar. Eminim bu terimi çok duymuşsunuzdur ama gerçekten ne kadar büyülü olduğunu biliyor musunuz?
Yemek yemek için ellerimizi kullanmanın uygunsuz olduğuna inanmak için yanlış bir şekilde eğitildik. Bana inanmıyor musun? Peki bu sefer kanıtlayacak bilime sahibiz! Çoğumuz ellerini kullanan birinin yeme davranışları hakkında varsayımlarda bulunmaktan suçluyuz.
Girişimciler sıradan insanlar değil, özel bir türdür. Belirli kişilik özellikleri, ekipleri yönetmelerine, işletmeleri yönetmelerine ve imparatorluklar kurmalarına yardımcı olur.
'Big Brother' yıldızı Claire Rehfuss, hayranlarını spoiler hesaplarına güvenmemeleri konusunda uyarıyor.
Kody Brown, iki karısı Meri Brown ve Christine Brown'ı arkadaş bölgelendirdi. İki eşin reddedilmeyi nasıl ele aldığı tamamen farklıydı.
Kristen Stewart bir keresinde 'Pamuk Prenses' rol arkadaşı Chris Hemsworth'a sert bir yumruk attı ve bu, oyuncunun geleceğini görmediği bir saldırıydı.
GQ Magazine ile yaptığı bir röportajda BTS'den Jin, BTS ve Coldplay'in şarkısı 'My Universe'nin bir bölümünün 'son bölümü yapmadığını' açıkladı.
Her hafta güncellenen mini bulmacamız, en sevdiğimiz HowStuffWorks okumalarımızı zeki ipuçlarıyla birleştiriyor!
Doğru deterjanı seçme konusunda endişelenmenize gerek kalmadan çamaşır yıkamak yeterince kötü. Peki en iyisi hangisi? Yoksa önemli mi?
Kentucky kırsalındaki Fugates ve Combs aileleri, genetik piyangoyu kaybettiler ve her ikisi de, evlenirken tenlerinin mavi görünmesine neden olan nadir bir çekinik özelliği paylaştılar. Bunun nedeni neydi? Ve ailelere ne oldu?
İki babasız erkek civciv, California akbabasını yok olmaktan kurtarmak için bir programda yetiştiriliyor. Böyle 'bakire' doğumlar nasıl mümkün olabilir?
Vanderpump Rules yıldızı Katie Maloney-Schwartz, Perşembe günü Instagram'da yaptığı dürüst ve içten bir gönderiyle kendini sevme yolculuğunda kaydettiği ilerlemeyi anlattı.
Jessica Alba, kendisini ve çocuklarını Dolly ve Lucy adlı iki köpekle sarılıp oynarken gösteren keyifli bir videoyu Instagram hesabından paylaştı.
Geçen hafta sonu bir Porto Riko tatili sırasında nişanlanan Megan Fox ve Makineli Tüfek Kelly'den bir kaynak, "İlk görüşte aşk durumuydu" diyor.
Polise göre Devonne Marsh'ın kimliği belirlenemeyen kız arkadaşını çakmak gazıyla kaplayarak alevleri tutuşturduğu iddia edildi.