วิธีทำงานกับการจัดกลุ่มใน Python
Aspose.PDF FOSS สำหรับ Python รวมยูทิลิตี้การจัดกลุ่มเชิงลำดับชั้นแบบรวมตัวขนาดเล็กและใช้งานทั่วไป — แยกจากการดำเนินการ PDF ใด ๆ — เพื่อจัดกลุ่มวัตถุ DataPoint ที่เกี่ยวข้องเป็นอินสแตนซ์ Cluster และคำนวณศูนย์กลางของคลัสเตอร์ คุณกำหนดว่าจุดข้อมูลแต่ละจุดหมายถึงอะไรและให้พิกัดด้วยตนเอง; ยูทิลิตี้จะไม่เติมค่าพิกัดโดยอัตโนมัติ ไลบรารีจะถูกติดตั้งด้วยคำสั่งด้านล่าง.
คู่มือแบบขั้นตอนต่อขั้นตอน
ขั้นตอนที่ 1: ติดตั้งแพ็กเกจ
ติดตั้งแพ็กเกจ Aspose.PDF FOSS:
git clone https://github.com/aspose-pdf-foss/Aspose-PDF-FOSS-for-Python.git
cd Aspose-PDF-FOSS-for-Python
pip install -e .ตรวจสอบการติดตั้งโดยการนำเข้า Cluster และพิมพ์ข้อความยืนยัน:
from aspose_pdf import Cluster
print("aspose-pdf-foss-for-python is ready.")ขั้นตอนที่ 2: นำเข้าคลาสที่จำเป็น
นำเข้าคลาสสามคลาสที่ประกอบเป็นยูทิลิตี้การจัดกลุ่ม:
from aspose_pdf import Cluster, ClusterCollection, DataPointขั้นตอนที่ 3: สร้างจุดข้อมูล
A DataPoint จับคู่สตริง name กับรายการ value ของค่า float — พิกัดหรือเวกเตอร์ลักษณะที่คุณกำหนดว่าเป็นความหมายสำหรับตรรกะการจัดกลุ่มของคุณเอง:
from aspose_pdf import DataPoint
point_a = DataPoint("item-1", [12.0, 45.0])
point_b = DataPoint("item-2", [13.5, 44.0])
point_c = DataPoint("item-3", [98.0, 5.0])
print(point_a.name, point_a.value)DataPoint ไม่ผูก value กับแนวคิด PDF ใดเป็นพิเศษ — พิกัดหน้า, เมตริกฟอนต์, หรือเวกเตอร์ลักษณะเชิงตัวเลขอื่น ๆ ทั้งหมดทำงานได้เท่าเทียมกัน.
ขั้นตอนที่ 4: จัดกลุ่มจุดข้อมูลเข้าสู่คลัสเตอร์
ส่งรายการสมาชิกทั้งหมดไปยังคอนสตรัคเตอร์ของ Cluster. ไม่มีเมธอดใดที่จะเพิ่มรายการลงใน Cluster หลังจากที่มันถูกสร้างแล้ว, ดังนั้นให้ตัดสินใจเรื่องสมาชิกก่อน:
from aspose_pdf import Cluster
nearby = Cluster([point_a, point_b])
print(nearby.count) # 2
print(nearby.contains(point_a)) # Truecontains() ตรงกันด้วยความเท่ากัน — DataPoint กำหนดความเท่ากันบน name และ value ร่วมกัน, ดังนั้นอินสแตนซ์ DataPoint ที่แตกต่างแต่มีชื่อและค่าเดียวกันก็จะถูกรายงานว่าเป็นส่วนหนึ่งเช่นกัน.
ขั้นตอนที่ 5: คำนวณศูนย์กลางของคลัสเตอร์
DataPoint.get_centroid(cluster) เป็นเมธอดแบบสแตติกที่หาค่าเฉลี่ยของแต่ละมิติของทุก DataPoint.value ในคลัสเตอร์และส่งคืนผลลัพธ์เป็น DataPoint ใหม่ที่ชื่อ "centroid":
from aspose_pdf import DataPoint
centroid = DataPoint.get_centroid(nearby)
print(centroid.name) # "centroid"
print(centroid.value) # per-dimension average across the clusterแต่ละรายการ DataPoint.value ในคลัสเตอร์ต้องมีความยาวเท่ากัน — get_centroid คำนวณค่าเฉลี่ยตำแหน่งต่อตำแหน่งและไม่ได้ตรวจสอบว่าความยาวตรงกัน การเรียกใช้บน Cluster.empty() หรือคลัสเตอร์ใด ๆ ที่มี count == 0 จะทำให้เกิด ValueError.
ขั้นตอนที่ 6: คัดลอกคลัสเตอร์หรือใช้ตัวอย่างว่างที่แชร์ร่วมกัน
clone() ส่งคืน Cluster ที่เป็นอิสระซึ่งบรรจุรายการเดียวกัน; Cluster.empty() จะส่งคืนอินสแตนซ์คลัสเตอร์ว่างที่เก็บไว้ในแคชเดียวกันเสมอ แทนที่จะสร้างอินสแตนซ์ใหม่:
from aspose_pdf import Cluster
backup = nearby.clone()
print(backup is nearby) # False -- independent copy
print(backup.contains(point_a)) # True -- same items
placeholder = Cluster.empty()
print(placeholder.count) # 0ขั้นตอนที่ 7: จัดกลุ่มคลัสเตอร์หลายตัวเข้าสู่ ClusterCollection
ClusterCollection รวมวัตถุ Cluster หลายรายการไว้เบื้องหลังคอนเทนเนอร์ที่รับรู้ len() เพียงหนึ่งตัว:
from aspose_pdf import Cluster, ClusterCollection
outliers = Cluster([point_c])
collection = ClusterCollection([nearby, outliers])
print(len(collection)) # 2ClusterCollection ไม่ได้เปิดเผยเมธอดใด ๆ เพื่อดึงคลัสเตอร์กลับออก — ควรเก็บอ้างอิงถึงรายการที่คุณส่งเข้าไปในคอนสตรัคเตอร์หากต้องการวนลูปคลัสเตอร์ต่อมา.
ปัญหาทั่วไปและวิธีแก้ไข
ไม่มีวิธีการใดที่จะเพิ่มรายการลงในที่มีอยู่ Cluster
Cluster รับรายการสมาชิกได้เฉพาะตอนสร้างเท่านั้น (Cluster(items)) สร้างรายการเต็มของวัตถุ DataPoint ก่อน แล้วจึงสร้าง Cluster — ไม่มี add() หรือ append() ที่จะเรียกใช้หลังจากนั้น.
DataPoint.get_centroid() raises ValueError
เหตุการณ์นี้เกิดขึ้นเมื่อคลัสเตอร์ที่ส่งเข้ามาว่างเปล่า (count == 0) รวมถึง Cluster.empty() ตรวจสอบ cluster.count ก่อนเรียก get_centroid หรือจัดการข้อยกเว้นหากคลัสเตอร์ที่ว่างเป็นอินพุตที่ถูกต้องในกระบวนการทำงานของคุณ.
ค่าศูนย์กลางดูไม่ถูกต้อง
get_centroid รวมแต่ละตำแหน่งของ DataPoint.value ทีละตำแหน่งและหารด้วยจำนวนจุด — มันไม่ได้ตรวจสอบว่าแต่ละรายการ value ในคลัสเตอร์มีความยาวเท่ากันหรือไม่ การผสมวัตถุ DataPoint ที่มีมิติไม่ตรงกันจะทำให้ค่าเฉลี่ยที่ได้ไม่ถูกต้องโดยไม่มีการแจ้งเตือนแทนที่จะโยนข้อยกเว้น.
Expecting Cluster.empty() เพื่อสร้างคลัสเตอร์ว่างใหม่ทุกครั้ง
Cluster.empty() เป็นตัวเข้าถึงแบบ singleton — ทุกการเรียกจะคืนอินสแตนซ์ที่แคชไว้เดียวกัน ใช้ Cluster() (โดยไม่มีอาร์กิวเมนต์) แทนถ้าคุณต้องการคลัสเตอร์ว่างที่แยกจากกันและเป็นอิสระ.
คาดว่าห้องสมุดจะจัดกลุ่มจุดโดยอัตโนมัติ
DataPoint, Cluster และ ClusterCollection เป็นโครงสร้างข้อมูลสำหรับแทนจุด, คลัสเตอร์, และการคำนวณศูนย์กลาง — โมดูลนี้ไม่ได้รวมฟังก์ชันการเชื่อมโยงหรือระยะทางที่ตัดสินว่าจุดใดควรอยู่ด้วยกัน โค้ดของคุณเองต้องกำหนดสมาชิกของคลัสเตอร์ก่อนสร้าง Cluster.
คำถามที่พบบ่อย
โมดูลนี้จัดกลุ่มจุดข้อมูลโดยอัตโนมัติตามระยะทางหรือไม่?
ไม่. Cluster, DataPoint และ ClusterCollection เป็นบล็อกพื้นฐานสำหรับแทนกลุ่มที่กำหนดไว้แล้วและคำนวณศูนย์กลาง — ไม่มีขั้นตอนการรวมกลุ่มหรือการมอบหมายตามระยะทางที่สร้างไว้ในตัว.
ความแตกต่างระหว่าง Cluster() กับ Cluster.empty() คืออะไร?
Cluster(items=None) สร้างอินสแตนซ์ใหม่ทุกครั้งที่เรียกใช้. Cluster.empty() เป็น classmethod ที่คืนค่าอินสแตนซ์ empty-cluster ที่แคชและแชร์เดียวกันในทุกการเรียก.
ฉันสามารถเพิ่มรายการลงใน Cluster หลังจากสร้างมันได้หรือไม่?
ไม่. Cluster จะเปิดเผยเฉพาะ contains(), clone() และคุณสมบัติ count นอกเหนือจากการสร้าง — สมาชิกจะถูกกำหนดคงที่เมื่อคอนสตรัคเตอร์ทำงานแล้ว.
get_centroid() ทำงานได้กับจำนวนมิติใด ๆ หรือไม่?
ใช่, ตราบใดที่รายการ DataPoint.value ทุกรายการในคลัสเตอร์มีความยาวเท่ากัน. get_centroid หาค่าเฉลี่ยของแต่ละมิติอย่างอิสระและคืนค่าผลลัพธ์เป็น DataPoint ใหม่.
ClusterCollection เพิ่มอะไรเหนือรายการ Python ธรรมดาของคลัสเตอร์?
โดยหลักคือคอนเทนเนอร์ที่มีประเภทพร้อมการสนับสนุน len(). มันไม่ได้เพิ่มการวนรอบ, การค้นหา หรือพฤติกรรมการรวมเหนือสิ่งที่คุณมีอยู่แล้วในรายการที่คุณสร้างจากมัน.