Cách làm việc với Clustering trong Python
Aspose.PDF FOSS cho Python gói một tiện ích phân cụm hợp nhất phân cấp nhỏ, đa mục đích — độc lập với bất kỳ thao tác PDF nào — để nhóm các đối tượng DataPoint liên quan thành các thể hiện Cluster và tính trung tâm cụm. Bạn quyết định mỗi điểm dữ liệu đại diện cho gì và tự cung cấp tọa độ của chúng; tiện ích không tự động điền chúng. Thư viện được cài đặt bằng lệnh dưới đây.
Hướng Dẫn Từng Bước
Bước 1: Cài đặt Gói
Cài đặt gói 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 .Xác nhận việc cài đặt bằng cách nhập Cluster và in ra thông báo xác nhận:
from aspose_pdf import Cluster
print("aspose-pdf-foss-for-python is ready.")Bước 2: Nhập các lớp cần thiết
Nhập ba lớp tạo nên tiện ích phân cụm:
from aspose_pdf import Cluster, ClusterCollection, DataPointBước 3: Tạo các điểm dữ liệu
Một DataPoint ghép một chuỗi name với một danh sách value các số thực — tọa độ hoặc vector đặc trưng mà bạn quyết định là có ý nghĩa cho logic nhóm của riêng bạn:
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 không liên kết value với bất kỳ khái niệm PDF cụ thể nào — tọa độ trang, chỉ số phông chữ, hoặc bất kỳ vector đặc trưng số nào khác đều hoạt động tương đương.
Bước 4: Nhóm các điểm dữ liệu thành một cụm
Truyền danh sách thành viên đầy đủ cho hàm khởi tạo Cluster. Không có phương pháp nào để thêm mục vào Cluster sau khi nó được tạo, vì vậy hãy quyết định thành viên trước:
from aspose_pdf import Cluster
nearby = Cluster([point_a, point_b])
print(nearby.count) # 2
print(nearby.contains(point_a)) # Truecontains() khớp theo sự bằng nhau — DataPoint định nghĩa sự bằng nhau trên name và value cùng nhau, vì vậy một thể hiện DataPoint khác với cùng tên và giá trị cũng được báo cáo là đã chứa.
Bước 5: Tính Trung tâm Cụm
DataPoint.get_centroid(cluster) là một phương thức tĩnh tính trung bình mỗi chiều của mọi DataPoint.value trong cụm và trả về kết quả dưới dạng một DataPoint mới có tên "centroid":
from aspose_pdf import DataPoint
centroid = DataPoint.get_centroid(nearby)
print(centroid.name) # "centroid"
print(centroid.value) # per-dimension average across the clusterMỗi danh sách DataPoint.value trong cụm phải có cùng độ dài — get_centroid tính trung bình vị trí theo vị trí và không kiểm tra xem độ dài có khớp hay không. Gọi nó trên Cluster.empty(), hoặc bất kỳ cụm nào có count == 0, sẽ gây ra ValueError.
Bước 6: Sao chép một Cụm hoặc Tái sử dụng Thể hiện Trống Được Chia Sẻ
clone() trả về một Cluster độc lập chứa các mục giống nhau; Cluster.empty() luôn trả về cùng một thể hiện cụm trống được lưu trong bộ nhớ đệm thay vì cấp phát một cái mới:
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) # 0Bước 7: Nhóm nhiều Cụm thành một ClusterCollection
ClusterCollection gói nhiều đối tượng Cluster lại phía sau một container duy nhất có khả năng nhận biết len():
from aspose_pdf import Cluster, ClusterCollection
outliers = Cluster([point_c])
collection = ClusterCollection([nearby, outliers])
print(len(collection)) # 2ClusterCollection không cung cấp phương thức nào để lấy lại các cụm của nó — hãy giữ một tham chiếu tới danh sách bạn truyền vào hàm khởi tạo nếu bạn cần duyệt các cụm sau này.
Các vấn đề phổ biến và cách khắc phục
Không có phương pháp nào để thêm một mục vào một đối tượng hiện có Cluster
Cluster chỉ chấp nhận danh sách thành viên của nó tại thời điểm khởi tạo (Cluster(items)). Hãy xây dựng danh sách đầy đủ các đối tượng DataPoint trước, sau đó tạo Cluster — không có add() hoặc append() nào để gọi sau này.
DataPoint.get_centroid() raises ValueError
Điều này xảy ra khi cụm được truyền vào rỗng (count == 0), bao gồm cả Cluster.empty(). Kiểm tra cluster.count trước khi gọi get_centroid, hoặc xử lý ngoại lệ nếu một cụm rỗng là đầu vào hợp lệ trong quy trình công việc của bạn.
Giá trị centroid có vẻ sai
get_centroid cộng từng vị trí DataPoint.value một cách tuần tự và chia cho số điểm — nó không kiểm tra rằng mọi danh sách value trong cụm đều có cùng độ dài. Việc trộn các đối tượng DataPoint có chiều kích không khớp sẽ tạo ra một trung bình không chính xác mà không báo lỗi.
Expecting Cluster.empty() để tạo một cụm trống mới mỗi lần
Cluster.empty() là một accessor singleton — mỗi lần gọi đều trả về cùng một instance đã được lưu trong bộ nhớ cache. Hãy sử dụng Cluster() (không có đối số) thay thế nếu bạn cần một cụm trống riêng biệt, độc lập.
Mong đợi thư viện tự động nhóm các điểm
DataPoint, Cluster và ClusterCollection là các cấu trúc dữ liệu dùng để biểu diễn điểm, cụm và phép tính trung tâm — mô-đun không bao gồm hàm liên kết hay hàm khoảng cách nào quyết định các điểm thuộc cùng một nhóm. Mã của bạn tự xác định thành viên của cụm trước khi tạo một Cluster.
Câu hỏi thường gặp
Mô-đun này có tự động nhóm các điểm dữ liệu theo khoảng cách không?
Không. Cluster, DataPoint và ClusterCollection là các khối xây dựng dùng để biểu diễn các nhóm đã được quyết định và tính toán trung tâm — không có bước hợp nhất hay gán dựa trên khoảng cách được tích hợp sẵn.
Sự khác biệt giữa Cluster() và Cluster.empty() là gì?
Cluster(items=None) tạo một thể hiện mới mỗi khi nó được gọi. Cluster.empty() là một classmethod trả về cùng một thể hiện empty-cluster đã được lưu trong bộ nhớ cache, được chia sẻ cho mỗi lần gọi.
Tôi có thể thêm mục vào Cluster sau khi tạo nó không?
Không. Cluster chỉ công khai contains(), clone(), và thuộc tính count sau quá trình khởi tạo — thành viên được cố định một khi hàm khởi tạo chạy.
get_centroid() có hoạt động với bất kỳ số chiều nào không?
Có, miễn là mọi danh sách DataPoint.value trong cụm đều có cùng độ dài. get_centroid tính trung bình mỗi chiều một cách độc lập và trả về kết quả dưới dạng một DataPoint mới.
ClusterCollection bổ sung gì so với một danh sách Python đơn giản của các cụm?
Chủ yếu là một container có kiểu với hỗ trợ len(). Nó không thêm khả năng lặp, tra cứu, hay hợp nhất ngoài những gì bạn đã có trong danh sách mà bạn tạo ra nó.