Phát hiện các cụm trong một chuỗi nhị phân


8

Tôi có một chuỗi nhị phân như 11111011011110101100000000000100101011011111101111100000000000011010100000010000000011101111

Trong đó các cụm chủ yếu là 1 được theo sau bởi số lượng không lớn hơn, như trong hình bên dưới (màu đen là 1):

nhập mô tả hình ảnh ở đây

Tôi muốn áp dụng một kỹ thuật (tốt nhất là trong R hoặc trong Python), nơi tôi có thể tự động phát hiện các cụm 1 này và tạo ra các nhịp (được biểu thị là các đường màu đỏ trong hình ảnh). Tôi biết người ta có thể làm điều này với một ngưỡng, tức là nói rằng hai cụm phải được tách biệt bởi ít nhất n 0 là cụm, nhưng tôi tự hỏi liệu có những phương pháp được thiết lập nào khác không sử dụng ngưỡng được xác định trước hay không.

Bất kỳ ý tưởng?

Câu trả lời:


5

Tôi sẽ tránh gọi chúng là "cụm". Với thuật ngữ này, cuối cùng bạn sẽ bị phân tâm vào các kỹ thuật đa chiều từ việc khai thác dữ liệu mọi lúc.

Vấn đề của bạn là một thiết lập một chiều đơn giản hơn nhiều. Và thậm chí đơn giản hơn: bạn thậm chí không có tọa độ mà là một loạt các số không và số không.

Sẽ không có một one-size-fits tất cả các giải pháp cho vấn đề của bạn bao giờ hết . Bởi vì một người dùng có thể muốn đọc "mã vạch" có độ phân giải rất cao, trong khi người dùng khác có nhiều tiếng ồn.

Vì vậy, cuối cùng, bạn sẽ cần phải có một tham số. Bạn có một số lựa chọn: kích thước khoảng cách tuyệt đối, kích thước khoảng cách tương đối, băng thông kernel, v.v.

Cách tiếp cận "dựa trên kernel" rất đơn giản sẽ là ánh xạ từng pixel theo số pixel được đặt trong -10 ... + 10. Vậy là 21 ô, giá trị sẽ là 0 đến 21. Bây giờ hãy tìm mức tối thiểu cục bộ. Tăng kích thước cửa sổ, nếu nó bắt đầu phân tách các lần chạy mà bạn chưa muốn tách.


Cảm ơn. Đề xuất với kernel và tối thiểu cục bộ thực sự giống với những gì @EngrStudent đề xuất, phải không? Tôi vẫn không hoàn toàn hiểu ý nghĩa của nó. Làm thế nào tôi thậm chí có thể tìm kiếm một mức tối thiểu cục bộ theo cách dựa trên máy? Tức là làm thế nào tôi có thể tính đạo hàm đầu tiên của "hàm" mà không biết chính hàm đó mà chỉ biết các giá trị?
wnstnsmth

Vâng, đó có lẽ là giống như EngrStudent đề xuất. Ước tính mật độ hạt nhân là một kỹ thuật rất chuẩn để làm mịn. Nó cũng được sử dụng ở mọi nơi trong xử lý hình ảnh! Đó là mức tối thiểu cục bộ nếu không có giá trị lân cận nhỏ hơn ... đơn giản như vậy nếu bạn có một bộ dữ liệu riêng biệt.
Có QUIT - Anony-Mousse

2

Tham chiếu 1 trên các trang 49-55 có phần hay về các phương thức dựa trên kernel có thể hữu ích ở đây. Nếu tôi đang làm điều đó thì tôi sẽ xem xét một số tổng trọng số của các giá trị thực và đạo hàm đầu tiên của chúng bởi vì nó có thể là một chỉ số tốt hơn về "thông tin".

Tham khảo: http://amzn.com/0198538642 "Mạng lưới thần kinh để nhận dạng mẫu" của Christopher Bishop. (1995)


1
đạo hàm số đầu tiên liên quan đến chỉ số là "diff". Vì vậy, nếu bạn có nhiều "cái" liên tiếp, đạo hàm sẽ là số không. Nếu bạn có những cái thưa thớt thì mỗi lần nó chuyển sang diff sẽ lớn hơn. Bạn có thể sử dụng EWMA như một kernel mans nghèo. vi.wikipedia.org/wiki/Exponential_smoothing . Làm thế nào nó hoạt động? Nó làm cho trung bình có trọng số của một cửa sổ các giá trị. Một hàm kernel làm một cái gì đó liên quan nhưng phức tạp hơn một chút. Nó có một cửa sổ đôi khi là một cửa sổ rộng hơn nhiều, và sau đó tính toán một hàm dựa trên các giá trị trong đó. Đôi khi chức năng trông giống như một pdf.
EngrStudent

1
Tổng các khác biệt và các giá trị thô cung cấp cho bạn thông tin khi các giá trị thưa thớt và khi chúng dày đặc.
EngrStudent

Bạn có thể giải thích về phản hồi và nhận xét của bạn với một chuỗi ví dụ nhỏ không? Tôi có một vấn đề rất tương tự.
Arun Jose

Giá trị tuyệt đối của một diff là một máy dò cạnh. Nếu bạn có một chuỗi như 000111000 và bạn lấy độ lệch bạn nhận được 00100 (-1) 00. Vị trí của 1 trong khác biệt cho bạn thấy cạnh tăng và -1 hiển thị cạnh giảm. Nếu bạn lấy giá trị tuyệt đối của diff, và sau đó tính tổng, bạn sẽ nhận được 2 cạnh toal. Nếu bạn đã có chuỗi 010101010 thì độ lệch tuyệt đối của nó là 11111111, tổng bằng 8 cạnh. Có một số lượng đáng kể cạnh cao hơn. Nếu bạn KHÔNG phải là diff diff và sử dụng nó trong một tổng số đang chạy, nó sẽ cho bạn biết bạn có bao nhiêu 1 hoặc bao nhiêu 0 trong một hàng.
EngrStudent

Theo tiêu chí nào bạn sẽ nói chạy 1 giây kết thúc và bắt đầu? Làm thế nào để bạn xác định kích thước của cửa sổ?
Arun Jose

0

Vấn đề có một số điểm tương đồng với xử lý hình ảnh. Bạn có một hình ảnh nhị phân với chiều cao một pixel và muốn đạt được một số phân đoạn .

Bản chất của hình ảnh đầu vào cho thấy một bộ lọc hình thái để làm mịn các vùng, ví dụ như đóng . Bạn cần chọn thành phần cấu trúc để từ đó xác định "liên kết" của các cụm. Cuối cùng, điều này khá giống với cách tiếp cận của bạn. Bạn cũng có thể làm mịn hình ảnh bằng cách sử dụng các bộ lọc tích chập, ví dụ như sử dụng nhân mờ hoặc nhân gaussian và áp dụng ngưỡng đã chọn để tái cấu trúc lại nó.

Nếu bạn có thể coi mọi điểm 1là một điểm, vị trí của nó trong chuỗi là tọa độ và có thể tạo ra một số liệu khoảng cách, bạn có thể sử dụng khá nhiều thuật toán phân cụm tiêu chuẩn. Ví dụ: bạn có thể sử dụng phân cụm theo phân cấp (chọn tiêu chí liên kết và ngưỡng), bạn có thể sử dụng phương tiện k hoặc EM với mô hình hỗn hợp gaussian (chọn số cụm bạn đang tìm).

Nhưng tôi không nghĩ rằng, cuối cùng bạn có thể thoát khỏi mà không cần phải xác định trước độ nhạy của thuật toán ít nhất.

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.