2013-07-03 43 views
5

Nếu đầu vào để sklearn.clustering.DBSCAN được pre-processeed?Làm thế nào để mở rộng quy mô đầu vào DBSCAN trong scikit-tìm hiểu

Trong ví dụ http://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html#example-cluster-plot-dbscan-py khoảng cách giữa các mẫu đầu vào X được tính toán và chuẩn hóa:

D = distance.squareform(distance.pdist(X)) 
S = 1 - (D/np.max(D)) 
db = DBSCAN(eps=0.95, min_samples=10).fit(S) 

Trong một ví dụ khác cho v0.14 (http://jaquesgrobler.github.io/online-sklearn-build/auto_examples/cluster/plot_dbscan.html) một số mở rộng quy mô được thực hiện:

X = StandardScaler().fit_transform(X) 
db = DBSCAN(eps=0.3, min_samples=10).fit(X) 

tôi dựa vào mã của tôi trên ví dụ sau và có phân cụm hiển thị hoạt động tốt hơn với quy mô này. Tuy nhiên, quy mô này "Chuẩn hóa các tính năng bằng cách loại bỏ phương tiện trung bình và chia tỷ lệ thành phương sai". Tôi cố gắng tìm các cụm 2d. Nếu tôi có các cụm được phân phối trong một khu vực bình phương - giả sử 100x100 tôi thấy không có vấn đề gì trong việc mở rộng. Tuy nhiên, nếu được phân phối trong một khu vực hình chữ nhật, ví dụ: 800x200 quy mô 'ép' mẫu của tôi và thay đổi khoảng cách tương đối giữa chúng trong một chiều. Điều này làm giảm sự phân cụm, phải không? Hay tôi hiểu sth. sai rồi? Tôi có cần phải áp dụng một số tiền xử lý ở tất cả hay tôi có thể chỉ cần nhập dữ liệu 'thô' của mình?

Trả lời

12

Tùy thuộc vào những gì bạn đang cố gắng làm.

Nếu bạn chạy DBSCAN trên dữ liệu địa lý và khoảng cách tính bằng mét, có thể bạn không muốn bình thường hóa bất kỳ thứ gì, nhưng cũng đặt ngưỡng epsilon của bạn tính bằng mét.

Và có, cụ thể là việc chia tỷ lệ không thống nhất sẽ làm mất khoảng cách. Trong khi tỷ lệ không bóp méo tương đương với chỉ sử dụng một giá trị epsilon khác!

Lưu ý rằng trong ví dụ đầu tiên, có vẻ là một sự tương tự tương tự và không phải là khoảng cách ma trận được xử lý. S = (1 - D/np.max(D)) là một heuristic để chuyển đổi một ma trận tương tự thành một ma trận không giống nhau. Epsilon 0,95 sau đó hiệu quả có nghĩa là nhiều nhất là "0,05 của sự khác biệt tối đa quan sát". Một phiên bản thay thế mà nên mang lại kết quả tương tự là:

D = distance.squareform(distance.pdist(X)) 
S = np.max(D) - D 
db = DBSCAN(eps=0.95 * np.max(D), min_samples=10).fit(S) 

Trong khi trong ví dụ thứ hai, fit(X) thực sự xử lý dữ liệu thô đầu vào, và không phải là một ma trận khoảng cách. IMHO đó là một hack xấu xí, để quá tải phương pháp theo cách này. Đó là thuận tiện, nhưng nó dẫn đến sự hiểu lầm và đôi khi có thể sử dụng không chính xác.

Nhìn chung, tôi sẽ không lấy DBSCAN của sklearn làm giới thiệu. Toàn bộ API dường như bị thúc đẩy mạnh mẽ bởi phân loại, không phải bằng cách phân cụm. Thông thường, bạn không fit một nhóm, bạn làm điều đó chỉ cho các phương pháp được giám sát. Ngoài ra, sklearn hiện không sử dụng các chỉ mục để tăng tốc và cần bộ nhớ O(n^2) (mà DBSCAN thường không làm).

Nói chung, bạn cần đảm bảo rằng các khoảng cách hoạt động. Nếu hàm khoảng cách của bạn không hoạt động no thuật toán dựa trên khoảng cách sẽ tạo ra kết quả mong muốn. Trên một số tập dữ liệu, khoảng cách ngây thơ như Euclidean hoạt động tốt hơn khi bạn chuẩn hóa dữ liệu lần đầu tiên. Trên các tập dữ liệu khác, bạn có hiểu biết tốt về khoảng cách nào (ví dụ: dữ liệu địa lý. Làm tiêu chuẩn hóa điều này không có nghĩa, cũng không có khoảng cách Euclide!)

+0

Cảm ơn bạn rất nhiều vì đã trả lời nhanh.Tôi muốn xác định các nguồn ánh sáng nhấp nháy có thể di chuyển xung quanh một cách ngẫu nhiên dẫn đến một tiếng Gaussian bôi nhọ. Ngoài ra tôi có nhiễu phủ lên. Hiện tại tôi đang bỏ qua các cường độ chớp mắt và chỉ ăn ở vị trí 2d của các sự kiện chớp mắt. Vì vậy, tôi nghĩ rằng khoảng cách Euclide là OK? Từ câu trả lời của bạn Tôi hiểu trong trường hợp của tôi, tôi không phải xử lý trước dữ liệu (đó là vị trí trong nm). Nhưng cách triển khai sklearn thì sao? Liệu nó thực sự cần sự giống nhau như đầu vào hay tôi có thể chỉ cho nó vị trí và nó áp dụng chính phương pháp đo khoảng cách Euclide? – Alex

+0

Nếu bạn có các pixel có khoảng cách bằng nhau trên x và y, thì không bình thường hóa và sử dụng Euclide. Đối với sklearn, bạn sẽ phải đào sâu qua tài liệu và mã nguồn. Tôi tin rằng nếu bạn cung cấp dữ liệu thô, nó sẽ tự tính toán ma trận khoảng cách Euclide. (Nhưng KHÔNG sử dụng các chỉ mục để tăng tốc. Hãy thử ELKI, nó sẽ nhanh hơn rất nhiều với các chỉ mục). –

+0

Ok, cảm ơn tất cả. Tôi sẽ xem xét ELKI và tìm hiểu bản thân thông qua tài liệu sklearn. – Alex