Saya memiliki satu set data yang tidak dipesan dengan cara tertentu tetapi ketika diplot jelas memiliki dua tren yang berbeda. Regresi linier sederhana tidak akan cukup memadai di sini karena perbedaan yang jelas antara kedua seri. Apakah ada cara sederhana untuk mendapatkan dua trendline linear independen?
Sebagai catatan saya menggunakan Python dan saya cukup nyaman dengan pemrograman dan analisis data, termasuk pembelajaran mesin tetapi bersedia untuk beralih ke R jika benar-benar diperlukan.
time-series
python
curve-fitting
teringat
sumber
sumber
Jawaban:
Untuk mengatasi masalah Anda, pendekatan yang baik adalah menentukan model probabilistik yang cocok dengan asumsi tentang dataset Anda. Dalam kasus Anda, Anda mungkin menginginkan campuran model regresi linier. Anda dapat membuat model "campuran regressor" yang serupa dengan model campuran gaussian dengan mengaitkan titik data yang berbeda dengan komponen campuran yang berbeda.
Saya telah memasukkan beberapa kode untuk membantu Anda memulai. Kode mengimplementasikan algoritma EM untuk campuran dua regressor (seharusnya relatif mudah diperluas ke campuran yang lebih besar). Kode tampaknya cukup kuat untuk kumpulan data acak. Namun, tidak seperti regresi linier, model campuran memiliki tujuan non-cembung, jadi untuk dataset nyata, Anda mungkin perlu menjalankan beberapa percobaan dengan titik awal acak yang berbeda.
sumber
Di tempat lain di utas ini, user1149913 memberikan saran yang bagus (mendefinisikan model probabilistik) dan kode untuk pendekatan yang kuat (estimasi EM). Masih ada dua masalah yang harus diatasi:
Bagaimana cara mengatasi penyimpangan dari model probabilistik (yang sangat jelas dalam data 2011-2012 dan agak jelas dalam undulasi dari titik yang kurang miring).
Cara mengidentifikasi nilai awal yang baik untuk algoritma EM (atau algoritma lainnya).
Untuk mengatasi # 2, pertimbangkan untuk menggunakan transformasi Hough . Ini adalah algoritma pendeteksian fitur yang, untuk menemukan peregangan linier fitur, dapat secara efisien dihitung sebagai transformasi Radon .
Untuk memulai dengan data ini, saya pertama-tama memangkas hal-hal tambahan (sumbu, tanda centang, dan label) dan untuk ukuran yang baik memangkas titik-titik yang jelas-jelas terpencil di kanan bawah dan menaburkan di sepanjang sumbu bawah. (Ketika hal-hal itu tidak dipotong, prosedur masih bekerja dengan baik, tetapi ia juga mendeteksi sumbu, bingkai, urutan linier kutu, urutan linier label, dan bahkan titik-titik yang terletak secara sporadis pada sumbu bawah!)
(Ini dan sisa kode ada di Mathematica .)
Untuk setiap titik dalam gambar ini sesuai dengan rentang sempit kurva dalam transformasi Hough, terlihat di sini. Mereka adalah gelombang sinus:
Ini membuat secara visual memanifestasikan arti di mana pertanyaannya adalah masalah pengelompokan garis : transformasi Hough menguranginya menjadi masalah pengelompokan titik , di mana kita dapat menerapkan metode pengelompokan apa pun yang kita suka.
Dalam hal ini, pengelompokan sangat jelas sehingga pasca-pemrosesan sederhana dari transformasi Hough sudah memadai. Untuk mengidentifikasi lokasi dengan intensitas terbesar dalam transformasi, saya meningkatkan kontras dan mengaburkan transformasi pada radius sekitar 1%: itu sebanding dengan diameter titik plot pada gambar asli.
Thresholding hasilnya mempersempitnya menjadi dua gumpalan kecil yang sentroidnya cukup mengidentifikasi titik-titik intensitas terbesar: ini memperkirakan garis yang pas.
Sisi kiri gambar sesuai dengan arah 0 derajat (horizontal) dan, seperti yang kita lihat dari kiri ke kanan, sudut itu meningkat secara linear hingga 180 derajat. Interpolasi, saya menghitung bahwa kedua gumpalan itu berpusat pada 19 dan 57,1 derajat, masing-masing. Kita juga dapat membacakan intersepsi dari posisi vertikal gumpalan. Informasi ini menghasilkan kecocokan awal:
Dengan cara yang sama, seseorang dapat menghitung intersep yang sesuai dengan lereng ini, memberikan kesesuaian ini:
(Garis merah sesuai dengan titik merah muda kecil pada gambar sebelumnya dan garis biru sesuai dengan gumpalan aqua yang lebih besar.)
Sebagian besar, pendekatan ini secara otomatis berurusan dengan masalah pertama: penyimpangan dari linearitas mengotori titik-titik intensitas terbesar, tetapi biasanya tidak banyak menggeser mereka. Titik-titik terpencil yang jujur akan menyumbang kebisingan tingkat rendah di seluruh transformasi Hough, yang akan hilang selama prosedur pasca-pemrosesan.
Pada titik ini orang dapat memberikan estimasi ini sebagai nilai awal untuk algoritma EM atau untuk minimizer kemungkinan (yang, jika diberikan estimasi yang baik, akan bertemu dengan cepat). Namun, yang lebih baik adalah menggunakan estimator regresi yang kuat seperti kuadrat terkecil yang berulang secara berulang . Itu mampu memberikan bobot regresi ke setiap titik. Bobot rendah menunjukkan bahwa suatu titik bukan "milik" suatu garis. Manfaatkan bobot ini, jika diinginkan, untuk menetapkan setiap titik ke garis yang sesuai. Kemudian, setelah mengklasifikasikan poin, Anda dapat menggunakan kuadrat terkecil biasa (atau prosedur regresi lainnya) secara terpisah pada dua kelompok poin.
sumber
rotation
, yang awalnya diatur ke nol dan karena itu tidak membuat perbedaan.Saya menemukan pertanyaan ini ditautkan dengan pertanyaan lain . Saya sebenarnya melakukan penelitian akademis tentang masalah seperti ini. Silakan periksa jawaban saya "Least square root" pas? Metode pas dengan beberapa minimum untuk detail lebih lanjut.
Pendekatan berbasis transformasi Hough whuber adalah solusi yang sangat baik untuk skenario sederhana seperti yang Anda berikan. Saya mengerjakan skenario dengan data yang lebih kompleks, seperti ini:
Rekan penulis dan saya menyatakan ini sebagai masalah "asosiasi data". Ketika Anda mencoba menyelesaikannya, masalah utama biasanya kombinatorial karena jumlah eksponensial dari kombinasi data yang mungkin.
Kami memiliki publikasi " Campuran Tumpang tindih Proses Gaussian untuk masalah asosiasi data " di mana kami mendekati masalah umum kurva N dengan teknik berulang, memberikan hasil yang sangat baik. Anda dapat menemukan kode Matlab tertaut di kertas.
[Perbarui] Implementasi Python dari teknik OMGP dapat ditemukan di perpustakaan GPClust .
Saya memiliki makalah lain di mana kami mengendurkan masalah untuk mendapatkan masalah optimasi cembung, tetapi belum diterima untuk publikasi. Ini khusus untuk 2 kurva, sehingga akan bekerja dengan sempurna pada data Anda. Beri tahu saya jika Anda tertarik.
sumber
user1149913 memiliki jawaban yang sangat baik (+1), tetapi bagi saya tampaknya pengumpulan data Anda berantakan pada akhir 2011, jadi Anda harus memotong bagian data Anda, dan kemudian masih menjalankan beberapa kali dengan acak berbeda mulai koefisien untuk melihat apa yang Anda dapatkan.
Salah satu cara mudah untuk melakukan sesuatu adalah dengan memisahkan data Anda menjadi dua set dengan mata, kemudian menggunakan teknik model linier apa pun yang biasa Anda gunakan. Dalam R, itu akan menjadi
lm
fungsinya.Atau paskan dua garis dengan mata. Dalam R Anda akan menggunakannya
abline
untuk melakukan ini.Data bercampur aduk, memiliki outlier, dan berantakan pada akhirnya, namun dengan mata memiliki dua garis yang cukup jelas, jadi saya tidak yakin metode mewah itu sepadan.
sumber