การรวมกลุ่มพิกัดตำแหน่งทางภูมิศาสตร์ (lat, long long)


51

วิธีการที่เหมาะสมและอัลกอริทึมการจัดกลุ่มสำหรับการจัดกลุ่มตำแหน่งทางภูมิศาสตร์คืออะไร?

ฉันใช้รหัสต่อไปนี้เพื่อประสานพิกัดตำแหน่งทางภูมิศาสตร์:

import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.vq import kmeans2, whiten

coordinates= np.array([
           [lat, long],
           [lat, long],
            ...
           [lat, long]
           ])
x, y = kmeans2(whiten(coordinates), 3, iter = 20)  
plt.scatter(coordinates[:,0], coordinates[:,1], c=y);
plt.show()

ถูกต้องหรือไม่ที่จะใช้ K- meanสำหรับการจัดกลุ่มตำแหน่งทางภูมิศาสตร์เนื่องจากใช้ระยะทางแบบยุคลิดไม่ใช่สูตรฮาร์ไซน์เป็นฟังก์ชันระยะทาง


คุณยังสามารถดูคำถามที่คล้ายกันนี้ได้ที่: datascience.stackexchange.com/questions/10063/ …
VividD

ฉันคิดว่าความเป็นไปได้ของค่าเฉลี่ย k นั้นขึ้นอยู่กับว่าข้อมูลของคุณอยู่ที่ไหน หากข้อมูลของคุณแพร่กระจายไปทั่วโลกมันจะไม่ทำงานตามระยะทางที่ไม่ใช่แบบยุคลิดตามที่ผู้ใช้คนอื่นได้บอกไปแล้ว แต่ถ้าข้อมูลของคุณอยู่ในพื้นที่มากขึ้นค่าเฉลี่ย k จะดีพอเนื่องจากรูปทรงเรขาคณิตเป็นแบบยุคลิดแบบท้องถิ่น
Juan Ignacio Gil

คำตอบ:


7

K-mean ควรถูกต้องในกรณีนี้ เนื่องจาก k-หมายถึงพยายามจัดกลุ่มตามระยะทางแบบยุคลิดระหว่างวัตถุเพียงอย่างเดียวคุณจะได้รับกลุ่มของตำแหน่งที่อยู่ใกล้กัน

หากต้องการค้นหาจำนวนที่เหมาะสมของกลุ่มคุณสามารถลองทำพล็อต 'ข้อศอก' ของผลรวมกลุ่มภายในระยะห่างของสแควร์ สิ่งนี้อาจเป็นประโยชน์ ( http://nbviewer.ipython.org/github/nborwankar/LearnDataScience/blob/master/notebooks/D3.%20K-Means%20Analysis.ipynb )


3
จุดที่อยู่ติดกันในจุดที่ล้อมรอบถูกจัดการอย่างไร
casperOne

1
คุณต้องค้นหาอัลกอริทึมที่ใช้เมทริกซ์ระยะทางที่คำนวณล่วงหน้าหรืออนุญาตให้คุณระบุฟังก์ชันระยะทางที่สามารถเรียกใช้เมื่อจำเป็นต้องคำนวณระยะทาง มิฉะนั้นมันจะไม่ทำงาน
Spacedman

พล็อตข้อศอกอาจไม่ช่วยคุณได้เลยเพราะอาจไม่มีข้อศอก นอกจากนี้ตรวจสอบให้แน่ใจว่าลองรัน k-mean หลายครั้งด้วยหมายเลขคลัสเตอร์เดียวกันเนื่องจากคุณอาจได้ผลลัพธ์ที่แตกต่างกัน
ตั๊กแตน

นี่เป็นแนวคิดที่ไม่ดีเนื่องจากคะแนนทั้งหมดจะถูกรวมเป็นกลุ่มซึ่งไม่ค่อยเป็นความคิดที่ดีในการทำแผนที่
ริชาร์ด

52

K-mean ไม่ใช่อัลกอริทึมที่เหมาะสมที่สุดที่นี่

เหตุผลก็คือว่า k หมายถึงถูกออกแบบมาเพื่อลดความแปรปรวน แน่นอนว่านี่คือการปรากฎจากมุมมองเชิงสถิติและการจัดทำสัญญาณ แต่ข้อมูลของคุณไม่ใช่ "เชิงเส้น"

เนื่องจากข้อมูลของคุณอยู่ในรูปแบบละติจูดและลองติจูดคุณควรใช้อัลกอริทึมที่สามารถจัดการกับฟังก์ชันระยะทางตามอำเภอใจโดยเฉพาะในฟังก์ชันระยะทางทางภูมิศาสตร์ การจัดกลุ่มตามลำดับชั้น, PAM, CLARA และ DBSCAN เป็นตัวอย่างที่ได้รับความนิยม

https://www.youtube.com/watch?v=QsGOoWdqaT8ขอแนะนำให้ทำคลัสเตอร์ OPTICS

ปัญหาของค่าเฉลี่ย k นั้นง่ายต่อการดูเมื่อคุณพิจารณาคะแนนที่อยู่ใกล้กับ + -180 องศาที่ล้อมรอบ แม้ว่าคุณแฮ็กค่าเฉลี่ย k เพื่อใช้ระยะห่างจากฮาร์ซีนในขั้นตอนการอัปเดตเมื่อคำนวณค่าเฉลี่ยใหม่ผลลัพธ์จะถูกทำให้แย่ลง กรณีที่เลวร้ายที่สุดคือค่า k หมายถึงจะไม่มาบรรจบกัน!


คุณสามารถแนะนำวิธีการจัดกลุ่มที่เหมาะสมยิ่งขึ้นสำหรับข้อมูลตำแหน่งทางภูมิศาสตร์ได้หรือไม่
Alex Spurling

คุณสังเกตเห็นวรรคสามหรือไม่?
Anony-Mousse

7

พิกัด GPS สามารถแปลงเป็นgeohashได้โดยตรง Geohash แบ่งโลกออกเป็น "ที่เก็บข้อมูล" ขนาดแตกต่างกันตามจำนวนหลัก (รหัส Geohash สั้น ๆ สร้างพื้นที่ขนาดใหญ่และรหัสที่ยาวขึ้นสำหรับพื้นที่ขนาดเล็ก) Geohash เป็นวิธีการจัดกลุ่มที่มีความแม่นยำที่ปรับได้


สิ่งนี้ดูเหมือนว่าจะได้รับผลกระทบจากปัญหา 180 องศาแบบเดียวกับที่ K-Means ทำต่อบทความ Wikipedia ซึ่งเชื่อมโยงกับคำตอบ
นอร์แมน H

อ้อ! รหัสบวกนั้นดีกว่าplus.codes
Brian Spiering

ข้อดีอย่างหนึ่งของการแก้ปัญหานี้ก็คือตราบใดที่คุณคำนวณ geohash ครั้งเดียวการเปรียบเทียบที่เกิดขึ้นซ้ำ ๆจะเร็วขึ้นมาก
นอร์แมน H

Geohash จะมีปัญหากับเคสขอบถัง - จุดสองจุดที่อยู่ใกล้กันมากจะถูกใส่ในถังที่แตกต่างกันตามขอบของแต่ละถัง
Dan G

5

ฉันอาจจะสายเกินไปกับคำตอบของฉัน แต่ถ้าคุณยังคงเกี่ยวข้องกับการจัดกลุ่มทางภูมิศาสตร์คุณอาจพบว่าการศึกษานี้น่าสนใจ มันเกี่ยวข้องกับการเปรียบเทียบสองวิธีที่แตกต่างกันอย่างเป็นธรรมในการจัดประเภทข้อมูลทางภูมิศาสตร์: K-หมายถึงการจัดกลุ่มและการสร้างแบบจำลองการเติบโตระดับแฝง

หนึ่งในภาพจากการศึกษา:

ป้อนคำอธิบายรูปภาพที่นี่

ผู้เขียนสรุปว่าผลลัพธ์สุดท้ายนั้นคล้ายคลึงกันโดยรวมและมีบางแง่มุมที่ LCGM ใช้วิธี K มากเกินไป


5

คุณสามารถใช้HDBSCANสำหรับสิ่งนี้ แพคเกจหลามมีการสนับสนุนสำหรับระยะทาง haversine ซึ่งจะคำนวณระยะทางอย่างถูกต้องระหว่างจุด lat / lon

ดังที่เอกสารระบุไว้คุณจะต้องแปลงคะแนนเป็นเรเดียนก่อนจึงจะสามารถใช้งานได้ psuedocode ต่อไปนี้ควรทำเคล็ดลับ:

points = np.array([[lat1, lon1], [lat2, lon2], ...])
rads = np.radians(points)
clusterer = hdbscan.HDBSCAN(min_cluster_size=N, metric='haversine')
cluster_labels = clusterer.fit_predict(points)

0

อัลกอริทึม k-mean เพื่อจัดกลุ่มสถานที่เป็นความคิดที่ไม่ดี สถานที่ตั้งของคุณสามารถแพร่กระจายไปทั่วโลกและคุณคาดการณ์จำนวนกลุ่มไม่เพียง แต่ถ้าคุณใส่กลุ่มเป็น 1 แล้วสถานที่จะถูกจัดกลุ่มเป็น 1 กลุ่มเดียว ฉันใช้การจัดกลุ่มตามลำดับชั้นสำหรับสิ่งเดียวกัน



-1

ไปกับการจัดกลุ่ม Kmeans เนื่องจาก HBScan จะใช้เวลาตลอดไป ฉันลองใช้กับหนึ่งในโครงการและสิ้นสุด แต่ใช้ Kmeans กับผลลัพธ์ที่ต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.