Mendeteksi cluster dalam urutan biner

8

Saya memiliki urutan biner seperti 11111011011110101100000000000100101011011111101111100000000000011010100000010000000011101111

Di mana kluster sebagian besar 1 diikuti oleh jumlah yang lebih besar dari nol, seperti pada gambar di bawah ini (hitam singkatan dari 1):

masukkan deskripsi gambar di sini

Saya ingin menerapkan teknik (lebih disukai dalam R atau dengan Python) di mana saya dapat secara otomatis mendeteksi kluster 1 ini, dan menghasilkan bentang (dilambangkan sebagai garis merah pada gambar). Saya tahu orang bisa melakukan ini dengan ambang, yaitu mengatakan bahwa dua cluster harus dipisahkan oleh setidaknya n 0 untuk menjadi cluster, tetapi saya bertanya-tanya apakah ada metode lain yang ditetapkan yang tidak menggunakan ambang batas yang telah ditentukan .

Ada ide?

wnstnsmth
sumber

Jawaban:

5

Saya akan menghindari menyebut mereka "cluster". Dengan terminologi ini, Anda pada akhirnya akan dialihkan ke teknik multidimensi dari penambangan data sepanjang waktu.

Masalah Anda adalah pengaturan satu dimensi yang lebih sederhana. Dan bahkan lebih sederhana: Anda bahkan tidak memiliki koordinat tetapi array nol dan satu.

Tidak akan ada satu ukuran cocok semua solusi untuk masalah Anda pernah . Karena satu pengguna mungkin ingin membaca "barcode" resolusi sangat tinggi, sedangkan pengguna lain memiliki banyak suara.

Jadi pada akhirnya, Anda harus memiliki satu parameter. Anda memiliki sejumlah pilihan: ukuran celah absolut, ukuran celah relatif, bandwidth kernel dll.

Pendekatan "berbasis kernel" yang sangat sederhana adalah memetakan setiap piksel ke jumlah piksel yang diatur dalam -10 ... + 10. Jadi itu adalah 21 sel, nilainya akan menjadi 0 hingga 21. Sekarang cari minimum lokal. Tingkatkan ukuran jendela, jika mulai membagi menjalankan yang Anda belum ingin membagi.

Memiliki QUIT - Anony-Mousse
sumber
Terima kasih. Saran dengan kernel dan minimum lokal sebenarnya mirip dengan apa yang diusulkan oleh @EngrStudent, kan? Meski begitu saya belum sepenuhnya mengerti apa yang dimaksud olehnya. Bagaimana saya bisa mencari minimum lokal dengan cara berbasis mesin? Yaitu bagaimana saya bisa menghitung turunan pertama dari "fungsi" tanpa mengetahui fungsi itu sendiri tetapi hanya nilainya?
wnstnsmth
Ya, itu mungkin sama dengan yang disarankan EngrStudent. Estimasi kepadatan kernel adalah teknik yang sangat standar untuk perataan. Ini juga digunakan di semua tempat dalam pemrosesan gambar! Ini minimum lokal jika tidak ada nilai tetangga yang lebih kecil ... sesederhana itu jika Anda memiliki set data diskrit.
Memiliki QUIT - Anony-Mousse
2

Referensi 1 pada halaman 49-55 memiliki bagian yang bagus tentang metode berbasis kernel yang mungkin berguna di sini. Jika saya melakukannya maka saya akan melihat sejumlah nilai tertimbang dari nilai aktual dan turunan pertama mereka karena mungkin menjadi indikator yang lebih baik dari "informasi".

Referensi: http://amzn.com/0198538642 "Jaringan Saraf untuk Pengenalan Pola" oleh Christopher Bishop. (1995)

EngrStudent
sumber
1
turunan numerik pertama sehubungan dengan indeks adalah "diff". Jadi jika Anda memiliki banyak "yang" berturut-turut turunannya akan nol. Jika Anda memiliki yang jarang maka setiap kali ia beralih, diff akan lebih besar. Anda bisa menggunakan EWMA sebagai kernel mans miskin yang mulus. en.wikipedia.org/wiki/Exponential_smoothing . Bagaimana cara kerjanya? Itu membuat rata-rata tertimbang dari jendela nilai. Fungsi kernel melakukan sesuatu yang terkait tetapi sedikit lebih kompleks. Dibutuhkan jendela kadang-kadang jendela yang jauh lebih luas, dan kemudian menghitung fungsi berdasarkan nilai-nilai di dalamnya. Terkadang fungsinya terlihat seperti pdf.
EngrStudent
1
Menjumlahkan perbedaan dan nilai mentah memberi Anda informasi ketika yang jarang dan ketika mereka padat.
EngrStudent
Bisakah Anda menguraikan respons dan komentar Anda dengan sedikit contoh urutan? Saya memiliki masalah yang sangat mirip.
Arun Jose
Nilai absolut dari diff adalah detektor tepi. Jika Anda memiliki urutan seperti 000111000, dan Anda mengambil diff Anda mendapatkan 00100 (-1) 00. Lokasi 1 dalam diff menunjukkan Anda tepi naik dan -1 menunjukkan tepi jatuh. Jika Anda mengambil nilai absolut dari diff, dan kemudian dijumlahkan Anda akan mendapatkan 2 tepi toal. Jika Anda memiliki urutan 010101010 maka perbedaan mutlaknya adalah 11111111, yang berjumlah 8 tepi. Ada jumlah tepi yang jauh lebih tinggi. Jika Anda BUKAN abs diff dan menggunakannya dalam jumlah berjalan, itu akan memberi tahu Anda berapa banyak 1 atau berapa 0 yang Anda miliki dalam satu baris.
EngrStudent
Di bawah kriteria apa yang akan Anda katakan jangka waktu 1 berakhir dan dimulai? Bagaimana Anda menentukan ukuran jendela?
Arun Jose
0

Masalahnya memiliki beberapa kesamaan dengan pemrosesan gambar. Anda memiliki gambar biner dengan tinggi satu piksel dan ingin mencapai semacam segmentasi .

Sifat gambar input menunjukkan filter morfologis untuk menghaluskan daerah, misalnya penutupan . Anda harus memilih elemen penataan yang dengan demikian menentukan "keterkaitan" cluster. Pada akhirnya ini sangat mirip dengan pendekatan Anda. Anda juga dapat menghaluskan gambar menggunakan filter konvolusi, misalnya menggunakan blur, atau kernel gaussian dan menerapkan ambang yang dipilih untuk melakukan binarisasi ulang.

Jika Anda dapat memperlakukan setiap 1sebagai titik, posisinya dalam urutan sebagai koordinat, dan dapat membuat beberapa metrik jarak, Anda dapat menggunakan hampir semua algoritma pengelompokan standar yang ada. Misalnya, Anda dapat menggunakan pengelompokan hierarkis (pilih kriteria keterkaitan dan ambang batas), Anda dapat menggunakan k-means atau EM dengan model campuran gaussian (pilih jumlah cluster yang Anda cari).

Tapi saya tidak berpikir, Anda akhirnya bisa pergi tanpa harus menentukan sensitivitas dari algoritma setidaknya.

moooeeeep
sumber