CẬP NHẬT: Cuối cùng, giải pháp tôi chọn để sử dụng cho phân cụm tập dữ liệu lớn của tôi là một gợi ý của Anony-Mousse bên dưới. Đó là, bằng cách sử dụng hàm ý DBSCAN của ELKI để làm cụm của tôi hơn là tìm kiếm của scikit. Nó có thể được chạy từ dòng lệnh và với chỉ mục thích hợp, thực hiện nhiệm vụ này trong vòng vài giờ. Sử dụng GUI và các tập dữ liệu mẫu nhỏ để làm việc ra các tùy chọn bạn muốn sử dụng và sau đó đi đến thị trấn. Đáng xem xét. Anywho, đọc cho một mô tả về vấn đề ban đầu của tôi và một số cuộc thảo luận thú vị.scikit-learning Sử dụng bộ nhớ DBSCAN
Tôi có tập dữ liệu với ~ 2,5 triệu mẫu, mỗi mẫu có 35 đối tượng (giá trị điểm động) mà tôi đang cố gắng nhóm. Tôi đã cố gắng làm điều này với việc thực hiện scikit-learning của DBSCAN, sử dụng chỉ số khoảng cách Manhattan và giá trị của epsilon được ước tính từ một số mẫu ngẫu nhiên nhỏ được rút ra từ dữ liệu. Càng xa càng tốt. (đây là đoạn trích, để tham khảo)
db = DBSCAN(eps=40, min_samples=10, metric='cityblock').fit(mydata)
Vấn đề của tôi tại thời điểm này là tôi dễ dàng hết bộ nhớ. (Tôi hiện đang làm việc với một máy có RAM 16 GB)
Câu hỏi của tôi là, DBSCAN tính toán ma trận khoảng cách hai chiều khi nó chạy, và đó là điều gì làm lung lay bộ nhớ của tôi? (2,5 triệu^2) * 8 byte rõ ràng là ngu ngốc lớn, tôi sẽ hiểu điều đó. Tôi có nên không sử dụng phương pháp fit()
không? Và nói chung, có cách nào xung quanh vấn đề này, hay tôi thường sủa cây sai ở đây?
Xin lỗi nếu câu trả lời trở nên rõ ràng. Tôi đã bối rối về điều này trong một vài ngày. Cảm ơn!
Phụ lục: Ngoài ra nếu có ai có thể giải thích sự khác biệt giữa fit(X)
và fit_predict(X)
với tôi rõ ràng hơn, tôi cũng đánh giá cao điều đó - Tôi e rằng tôi không hiểu rõ.
Phụ lụC# 2: Để chắc chắn, tôi vừa thử trên một máy có ~ 550 GB RAM và nó vẫn bị nổ, vì vậy tôi cảm thấy DBSCAN có khả năng cố gắng tạo ma trận khoảng cách hai chiều hoặc không muốn nó làm. Tôi đoán bây giờ câu hỏi lớn là làm thế nào để ngăn chặn hành vi đó, hoặc tìm các phương pháp khác có thể phù hợp với nhu cầu của tôi nhiều hơn. Cảm ơn vì đã mang theo tôi ở đây.
Phụ LụC# 3 (!): Tôi quên đính kèm traceback, ở đây là,
Traceback (most recent call last):
File "tDBSCAN.py", line 34, in <module>
db = DBSCAN(eps=float(sys.argv[2]), min_samples=10, metric='cityblock').fit(mydata)
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/base.py", line 329, in fit_predict
self.fit(X)
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/cluster/dbscan_.py", line 186, in fit
**self.get_params())
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/cluster/dbscan_.py", line 69, in dbscan
D = pairwise_distances(X, metric=metric)
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/metrics/pairwise.py", line 651, in pairwise_distances
return func(X, Y, **kwds)
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/metrics/pairwise.py", line 237, in manhattan_distances
D = np.abs(X[:, np.newaxis, :] - Y[np.newaxis, :, :])
MemoryError
Thực ra có vẻ như sẽ không quá khó để cải thiện việc triển khai sklearn. Chúng tôi có cấu trúc dữ liệu cây bóng chính xác hỗ trợ truy vấn bán kính. Tôi không quen thuộc với dbscan vì vậy tôi không biết nó chỉ cần những truy vấn này. Chúng ta chắc chắn nên cải thiện ở đó. –
Có, không quá khó để sửa lỗi này trong sklearn. –
Khả năng triển khai DBSCAN tốt hơn sẽ là tuyệt vời. –