Apa cara yang kuat untuk mencocokkan data linear tapi berisik?
Saya mengukur sinyal, yang terdiri dari beberapa segmen yang hampir linier. Saya ingin secara otomatis memasukkan beberapa baris ke data untuk mendeteksi transisi.
Dataset terdiri dari beberapa ribu poin, dengan 1-10 segmen dan saya tahu jumlah segmen.
Ini adalah contoh dari apa yang ingin saya lakukan secara otomatis.
algorithms
P3trus
sumber
sumber
Jawaban:
Saya mencoba dua pendekatan, secara naif (hanya menggunakan 3 segmen). Tentunya akan ada metode yang lebih bagus di luar sana.
RANSAC, seharusnya menjadi mekanisme pemasangan yang kuat. Sangat mudah untuk menghentikan algoritme setelah sejumlah segmen. Namun mungkin sulit untuk menegakkan kesinambungan antar segmen - seperti yang diperlukan dalam aplikasi Anda - setidaknya dengan implementasi sederhana. Sebagai bukti konsep, saya membuat gambar dari titik data sehingga saya bisa menggunakan mesin RANSAC yang tersedia di , fungsi deteksi garis Mathematica.sayam a ge L i n e s
Sesuaikan model linear piecewise menggunakan minimizer tujuan umum. Sangat mudah untuk menegakkan kontinuitas segmen. Menariknya, pengujian untuk residu dan properti lainnya dapat memberikan informasi yang cukup untuk menentukan secara otomatis jumlah segmen - Saya belum mencobanya. Begini tampilannya di Mathematica:
sumber
Saya tidak mengklaim metode berikut ini kuat, tetapi mungkin berhasil untuk Anda. Dengan ribuan titik dan mungkin sepuluh atau lebih segmen garis lurus, lakukan sebagai berikut.x [ n ]
Proses poin untuk membuat bit array sebagai berikut. Di sini adalah sejumlah kecil yang dipilih sesuai dengan gagasan Anda tentang seberapa dekat dengan garis lurus yang Anda inginkan poin untuk ditebang. Kriteria tersebut akan diakui oleh cognoscenti yang menuntut agar garis lurus melalui dan memiliki kemiringan yang hampir sama dengan kemiringan garis lurus dan .x [ n ] y[ n ]
Jika adalah deretan sepuluh atau lebih gondrong berjalan detik yang dipisahkan oleh lari detik dengan sesekali menyimpang detik di sana-sini untuk merusak keindahan, santai, Anda berada di jalur yang benar. Lain, jika ada terlalu sedikit berjalan atau terlalu banyak berjalan detik, ulangi langkah sebelumnya dengan berbeda .y[n] 1 0 1 1 ϵ
Gunakan linear-mean-square-error-fitting fitting untuk menyesuaikan garis lurus dengan titik yang diidentifikasi oleh sebagai bagian dari segmen garis lurus yang sama. Anda sekarang memiliki sepuluh titik pemasangan garis lurus, katakanlah, Garis A cocok dengan poin hingga ; baris B cocok dengan poin hingga , Jalur C cocok dengan poin melalui , dan seterusnya. Rentangkan A ke kanan dan B ke kiri untuk mencari tahu di mana mereka berpotongan; memperpanjang B ke kanan dan C ke kiri untuk mencari tahu di mana mereka berpotongan, dll. Selamat, Anda sekarang memiliki model linear kontinu dan sebagian untuk data Anda.x [ 3 ] x [ 88 ] x [ 94 ] x [ 120 ] x [ 129 ] ⋯y[n] x[3] x[88] x[94] x[120] x[129] ⋯
sumber
(Bertahun-tahun kemudian) fungsi piecewise-linear adalah spline derajat 1, yang bisa dilakukan oleh sebagian besar spline tukang ojek. scipy.interpolate.UnivariateSpline misalnya dapat dijalankan dengan
k=1
dan parameter smoothings
, yang harus Anda mainkan - lihat scipy-interpolasi-dengan-univariate-splines .Di Matlab, lihat cara memilih knot .
Ditambahkan: menemukan simpul yang optimal tidak mudah, karena mungkin ada banyak optima lokal. Sebagai gantinya, Anda memberi UnivariateSpline target
s
, jumlah kesalahan ^ 2, dan membiarkannya menentukan jumlah simpul. Setelah pas,get_residual()
akan mendapatkan jumlah sebenarnya dari kesalahan ^ 2, danget_knots()
simpulnya. Sebuah perubahan kecil dis
dapat banyak mengubah simpul, terutama dalam kebisingan tinggi - ymmv.Plot menunjukkan cocok untuk fungsi piecewise-linear acak + noise untuk berbagai
s
.Untuk mendapatkan konstanta sambungan sedikit demi sedikit, lihat Langkah deteksi . Bisakah itu digunakan untuk pw linear? Tidak tahu; memulai dengan membedakan data bising akan meningkatkan noise, salah.
Fungsi pengujian lainnya, dan / atau tautan ke makalah atau kode, akan diterima. Beberapa tautan:
piecewise-linear-regression-with-knots-as-parameter linier sangat sensitif terhadap tempat simpul ditempatkan sebagai simpul-pemilihan-untuk-kubik-regresi-splines Ini adalah masalah yang rumit dan kebanyakan orang hanya memilih simpul dengan coba-coba. Salah satu pendekatan yang semakin populer adalah menggunakan splines regresi yang dihukum.
Ditambahkan Maret 2014: Pemrograman dinamis adalah metode umum untuk masalah dengan subproblem bersarang seperti ini:
Pemrograman dinamis sangat cerdas, tetapi bisakah ia mengalahkan brute force + heuristics untuk tugas ini?
Lihat catatan kursus yang sangat baik oleh Erik Demaine di bawah MIT 6.006 Pengenalan algoritma dan regresi linier tersegmentasi
google juga sindrom John Henry.
sumber
Ambil turunannya dan cari area dengan nilai yang hampir konstan. Anda perlu membuat algoritme untuk mencari area-area dengan idealnya beberapa tingkat +/- kemiringan dan itu akan memberi Anda kemiringan garis untuk bagian itu. Anda mungkin ingin melakukan beberapa penghalusan, seperti rata-rata geser, sebelum melakukan klasifikasi bagian. Langkah selanjutnya adalah mendapatkan persimpangan-y, yang seharusnya sepele pada saat itu.
sumber
Menggunakan filter tren l1 adalah ide lain:
Kertas
Contoh Online
sumber