วิธีทำงานกับการจัดกลุ่มใน Python

วิธีทำงานกับการจัดกลุ่มใน 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))  # True

contains() ตรงกันด้วยความเท่ากัน — 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))  # 2

ClusterCollection ไม่ได้เปิดเผยเมธอดใด ๆ เพื่อดึงคลัสเตอร์กลับออก — ควรเก็บอ้างอิงถึงรายการที่คุณส่งเข้าไปในคอนสตรัคเตอร์หากต้องการวนลูปคลัสเตอร์ต่อมา.

ปัญหาทั่วไปและวิธีแก้ไข

ไม่มีวิธีการใดที่จะเพิ่มรายการลงในที่มีอยู่ 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(). มันไม่ได้เพิ่มการวนรอบ, การค้นหา หรือพฤติกรรมการรวมเหนือสิ่งที่คุณมีอยู่แล้วในรายการที่คุณสร้างจากมัน.

ดูเพิ่มเติม

 ภาษาไทย