Phân cụm dữ liệu chiều cao


8

TL; DR: Đưa ra một tập dữ liệu hình ảnh lớn (khoảng 36 GiB pixel thô) của dữ liệu chưa được gắn nhãn, làm cách nào tôi có thể phân cụm các hình ảnh (dựa trên các giá trị pixel) mà không biết số lượng cụm Kbắt đầu bằng?

Tôi hiện đang làm việc trong một dự án học tập không giám sát để phân cụm hình ảnh; hãy nghĩ về nó như phân cụm MNIST với các giá trị pixel RGB 16x16x3, chỉ có điều tôi có khoảng 48 triệu ví dụ mà tôi cần phân cụm. Không biết danh tính của họ, tôi biết rằng một số hình ảnh chắc chắn có liên quan vì chúng đến từ cùng một nguồn, nhưng - nói - tôi cũng không biết một cách thích hợp Kđể "chỉ" chạy K-nghĩa trên bộ .

Tôi đã nghĩ đến việc thực hiện một số nhúng 2D thủ công bằng cách sử dụng t-SNE và sau đó phân cụm thủ công trong không gian nhúng (một nhiệm vụ đơn giản hơn so với thực hiện thủ công trong 16x16x3-d), nhưng tất cả các triển khai t-SNE tôi có thể thấy cần phải tải dữ liệu vào bộ nhớ. Tôi cũng đã nghĩ về lần đầu tiên chạy t-SNE, sau đó là K-nghĩa trên dữ liệu nhúng t-SNE, nhưng nếu bạn nhìn vào kết quả của t-SNE từ MNIST, thì rõ ràng các cụm này có thể và có thể sẽ bị biến dạng và sai lệch theo cách phi tuyến tính. Vì vậy, ngay cả khi tôi biết K, các cụm có thể sẽ bị tách ra. Sử dụng khoảng cách Mahalanobis cho phương tiện K có thể là một điều thú vị, nhưng vì tôi không biết hiệp phương sai bắt đầu, nên dường như cũng là một ngõ cụt.

Hiện tại tôi đang cố gắng nếu tôi có thể chạy nén PCA trên các ví dụ để ít nhất lấy lại bộ nhớ cho t-SNE, nhưng điều đó có thể hoặc không thể hoạt động ... hiện tại không thể nói.

Ai đó có thể cho tôi một con trỏ đi đúng hướng để làm điều này ( lý tưởng , nhưng chắc chắn không cần thiết trong bối cảnh Python, TensorFlow hoặc Apache Beam / Dataflow)? Tôi đã làm việc về việc chuyển một Phát trực tuyến / Bóng K - có nghĩa là trước đây có một đặc tính tốt là tạo ra các cụm mới "theo yêu cầu", nhưng trước khi tôi bắt đầu thực hiện lại điều đó trong Python / TensorFlow / Dataflow, tôi đã hy vọng rằng ai đó có thể cho tôi một số ý tưởng bắt đầu từ đâu hoặc những gì cần tránh.


Bạn đang đặt trên phương tiện k? Nếu bạn không biết có bao nhiêu cụm bạn muốn, tại sao không sử dụng phương pháp phân cấp?
MissMonicaE

1
@MissMonicaE Chắc chắn không được đặt trên k-mean, nó chỉ xuất hiện trong đầu tôi. Bạn có thể cho tôi một phương pháp phân cấp sẽ có ý nghĩa trong bối cảnh này?
trời

1
Thật không may, thuật toán duy nhất mà tôi quen thuộc là AGNES và DIANA, có các ma trận không giống nhau (tốt, gói R lấy dữ liệu thô, nhưng tôi không chắc liệu hình ảnh có hoạt động hay không - tôi chỉ từng phân cụm dữ liệu số đơn giản ).
MissMonicaE

2
Thử phương pháp dựa trên mật độ; họ ít heuristic hơn k-nghĩa. Tôi chỉ dùng đến phương tiện k nếu nó là vấn đề về đồ chơi và nếu dữ liệu hoàn toàn từ phân phối bình thường. Vui lòng tham khảo stats.stackexchange.com/questions/133656/ Khăn
Jon

1
Tôi cũng sẽ giới thiệu bạn đến bản trình bày này trên DBSCAN youtube.com/watch?v=5cOhL4B5waU
Jon

Câu trả lời:


11

Tôi không nghĩ rằng bất kỳ kỹ thuật phân cụm "chỉ" nào hoạt động ở quy mô như vậy. Khả năng mở rộng nhất được cho là k-mean (chỉ không sử dụng Spark / Mahout, chúng thực sự rất tệ) và DBSCAN (có một số phiên bản phân phối tốt có sẵn).

Nhưng bạn sẽ phải đối mặt với nhiều thách thức khác ngoài quy mô vì việc phân cụm rất khó khăn . Nó không phải là chỉ đủ để chạy thuật toán và sau đó bạn có các cụm. Phân cụm là một kỹ thuật khám phá. Không có phân cụm "chính xác". Nhưng thay vào đó, bạn sẽ cần phải chạy phân cụm nhiều lần và xem xét mọi cụm . Bởi vì sẽ không có một thiết lập tham số duy nhất nào có được mọi thứ đúng. Thay vào đó, các cụm khác nhau có thể chỉ xuất hiện ở các tham số khác nhau.

Nhưng thách thức chính trong trường hợp của bạn có thể sẽ là chức năng khoảng cách. Ngoại trừ các cài đặt lý tưởng hóa như MNIST, khoảng cách Euclide sẽ không hoạt động. Cũng không có gì làm việc trên các pixel thô. Vì vậy, trước tiên bạn cần thực hiện trích xuất tính năng, sau đó xác định hàm tương tự.

Khi nói đến việc phân cụm, làm việc với một mẫu . Phân cụm mẫu, xác định các cụm thú vị, sau đó nghĩ cách tổng quát hóa nhãn cho toàn bộ tập dữ liệu của bạn. Ví dụ: bằng cách phân loại (các điểm dữ liệu được gắn nhãn của bạn là tập huấn luyện của bạn, hãy dự đoán nhãn của các điểm chưa được gắn nhãn).


0

Nếu bạn đang cố gắng thực hiện giảm kích thước, bạn nên sử dụng Mahout - tốt nhất trong lớp và là dự án nguồn mở duy nhất để cung cấp các phiên bản PCA / SVD thực sự phân tán.

http://mahout.apache.org/docs/0.13.1-SNAPSHOT/alerskyms/linear-acheebra/d-spca.html

http://mahout.apache.org/docs/0.13.1-SNAPSHOT/alerskyms/linear-acheebra/d-ssvd.html

Mahout cũng có triển khai DBSCAN, WIP như một phần của dự án Google Summer of Code, đáng để mắt tới.

Tôi đoán nhận xét "Mahout là xấu" của Anony (tôi đồng ý Spark là) có liên quan đến phiên bản Mahout của MapReduce không được chấp nhận (vì phiên bản mới chưa triển khai K-Means ngoài hộp, mặc dù có một cuộc thảo luận về danh sách gửi thư về cách làm điều này khá dễ dàng).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.