Sesuai dengan data linier piecewise

18

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.

masukkan deskripsi gambar di sini

P3trus
sumber
Saya tidak berpikir pertanyaan ini dapat dijawab secara wajar kecuali jika Anda memberi tahu kami seberapa akurat Anda ingin mengetahui lokasi break-point, berapa perkiraan Anda untuk panjang terpendek dari suatu segmen linier dan berapa banyak sampel dalam tipikal wilayah transisi. Jika label sumbu horizontal pada gambar Anda adalah nomor sampel, maka, dengan dua transisi dalam rentang dari ke , tugas lebih sulit daripada jika segmen garis lurus memiliki durasi yang lebih lama (dalam sampel). x [ 0 ]x[5]x[0]
Dilip Sarwate
@DilipSarwate Saya memperbarui Pertanyaan dengan persyaratan (btw xaksis adalah medan magnet di tesla)
P3trus
Anda dapat mencoba kotak alat ini jika Anda bekerja dengan MATLAB curve fitting toolbox
Rhei

Jawaban:

12

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.ImageLines

masukkan deskripsi gambar di sini

    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:

masukkan deskripsi gambar di sini

Matthias Odisio
sumber
Sepertinya jawaban yang bagus. Terima kasih telah berkontribusi.
Jason R
7

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]

    y[n]={1,if |(x[n+1]x[n])(x[n]x[n1])|<ϵ,0,otherwise.
    ϵx[n1],x[n],x[n+1](n1,x[n1])(n,x[n])(n,x[n])(n+1,x[n+1])
  • 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]1011ϵ

  • 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]

Dilip Sarwate
sumber
Benar-benar mencuri jawabanku! =)
Telepon
Ide Interresting tetapi sayangnya karena suara pada sinyal saya tidak mendapatkan hasil yang baik.
P3trus
1
Ekspresi yang magnitute-nya dibandingkan dengan epsilon sebenarnya merupakan perkiraan terhadap turunan kedua dari data. Ada cara lain untuk menghitung ini menggunakan lebih dari tiga titik yang tidak terlalu banyak menanggapi kebisingan. Lihatlah Savitzky-Golay.
DarenW
4

(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 smoothing s, 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, dan get_knots()simpulnya. Sebuah perubahan kecil di sdapat 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:

optimal k lines
    = optimal k - 1 lines up to some x
    + cost of the last line x to the end
over x  (all x in theory, nearby x in practice)

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.


masukkan deskripsi gambar di sini

denis
sumber
Masalahnya, paling tidak dengan scipy adalah posisi knot. Scipy menggunakan knot spasi yang sama.
P3trus
@ P3trus, ya untuk permulaan, tapi kemudian mereka bisa bergerak - lihat plotnya. Pokoknya itu menargetkan kesalahan total, bukan simpul.
denis
@ P3trus Sudahkah Anda mencoba menggunakan metode splines regresi multivarian yang secara otomatis memilih breakpoint secara berulang? cs.rtu.lv/jekabsons/regress.html
Atul Ingle
@Atul Ingle, afaik breakpoint / pemilihan simpul adalah masalah yang sama, dari apa pun spline bugar. Jika Anda mengetahui algoritma berbeda untuk itu dari orang-orang R / regresi, bisakah Anda memposting tautan?
denis
Apakah mencari paket di R / Matlab yang melakukan splines regresi adaptif? Di sini: cran.r-project.org/web/packages/earth/index.html cran.r-project.org/web/packages/mda/index.html dan juga ARESLab di Matlab yang sudah saya pasang tautannya.
Atul Ingle
0

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.

porten
sumber
turunannya mungkin berisik. Saya tidak berpikir saya akan merekomendasikan itu.
robert bristow-johnson
0

Menggunakan filter tren l1 adalah ide lain:

Kertas

Contoh Online

SeanVN
sumber
1
Jawaban Anda agak terlalu pendek untuk dianggap konstruktif! Harap pertimbangkan untuk berupaya mengembangkannya dengan cara pedagogis.
sansuiso