Bagaimana Anda menyesuaikan kurva non linier dengan python?

Tujuan dari latihan ini adalah menyesuaikan model dengan beberapa data. Data yang digunakan dalam tutorial ini adalah data lidar dan dijelaskan secara rinci dalam paragraf pengantar berikut. Jika Anda tidak sabar dan ingin berlatih sekarang, silakan lewati dan langsung ke

pengantar

Sistem Lidar adalah pengukur jarak optik yang menganalisis properti cahaya yang tersebar untuk mengukur jarak. Sebagian besar dari mereka memancarkan impuls cahaya pendek ke arah target dan merekam sinyal yang dipantulkan. Sinyal ini kemudian diproses untuk mengekstrak jarak antara sistem lidar dan target

Sistem lidar topografi adalah sistem yang tertanam di platform udara. Mereka mengukur jarak antara platform dan Bumi, untuk menyampaikan informasi tentang topografi Bumi (lihat untuk detail lebih lanjut)

Palu, C. dan Bretar, F. Lidar Topografi Gelombang Penuh. Negara-of-the-Art. Jurnal Fotogrametri dan Penginderaan Jauh ISPRS 64(1), hlm. 1-16 Januari 2009 http. //dx. doi. org/10. 1016/j. isprsjprs. 2008. 09. 007

Dalam tutorial ini, tujuannya adalah menganalisis bentuk gelombang yang direkam oleh sistem lidar. Sinyal seperti itu mengandung puncak yang pusat dan amplitudonya memungkinkan untuk menghitung posisi dan beberapa karakteristik target sasaran. Ketika jejak sinar laser sekitar 1m di permukaan bumi, sinar dapat mengenai beberapa target selama perambatan dua arah (misalnya tanah dan puncak pohon atau bangunan). Jumlah kontribusi setiap target yang terkena sinar laser kemudian menghasilkan sinyal yang kompleks dengan banyak puncak, masing-masing berisi informasi tentang satu target.

Salah satu metode canggih untuk mengekstraksi informasi dari data ini adalah menguraikannya dalam sejumlah fungsi Gaussian di mana setiap fungsi mewakili kontribusi target yang terkena sinar laser.

Oleh karena itu, kami menggunakan modul untuk menyesuaikan bentuk gelombang dengan satu atau sejumlah fungsi Gaussian

Memuat dan visualisasi

Muat bentuk gelombang pertama menggunakan

>>> import numpy as np
>>> waveform_1 = np.load('intro/summary-exercises/examples/waveform_1.npy')

dan memvisualisasikannya

>>> import matplotlib.pyplot as plt
>>> t = np.arange(len(waveform_1))
>>> plt.plot(t, waveform_1) 
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show()
_

Seperti yang ditunjukkan di bawah ini, bentuk gelombang ini adalah sinyal sepanjang 80 bin dengan puncak tunggal dengan amplitudo kira-kira 30 dalam bin 15 nanodetik. Selain itu, tingkat kebisingan dasar sekitar 3. Nilai-nilai ini dapat digunakan dalam solusi awal

Bagaimana Anda menyesuaikan kurva non linier dengan python?

Menyesuaikan bentuk gelombang dengan model Gaussian sederhana

Sinyalnya sangat sederhana dan dapat dimodelkan sebagai fungsi Gaussian tunggal dan offset yang sesuai dengan kebisingan latar belakang. Untuk mencocokkan sinyal dengan fungsinya, kita harus

  • tentukan modelnya
  • mengusulkan solusi awal
  • hubungi scipy.optimize.leastsq

Model

Fungsi Gaussian didefinisikan oleh

Bagaimana Anda menyesuaikan kurva non linier dengan python?

dapat didefinisikan dalam python oleh

>>> def model(t, coeffs):
..    return coeffs[0] + coeffs[1] * np.exp( - ((t-coeffs[2])/coeffs[3])**2 )

di mana

  • coeffs[0] adalah
    Bagaimana Anda menyesuaikan kurva non linier dengan python?
    (berisik)
  • >>> import matplotlib.pyplot as plt
    >>> t = np.arange(len(waveform_1))
    >>> plt.plot(t, waveform_1) 
    [<matplotlib.lines.Line2D object at ...>]
    >>> plt.show()
    
    0 adalah
    Bagaimana Anda menyesuaikan kurva non linier dengan python?
    (amplitudo)
  • >>> import matplotlib.pyplot as plt
    >>> t = np.arange(len(waveform_1))
    >>> plt.plot(t, waveform_1) 
    [<matplotlib.lines.Line2D object at ...>]
    >>> plt.show()
    
    1 adalah
    Bagaimana Anda menyesuaikan kurva non linier dengan python?
    (tengah)
  • >>> import matplotlib.pyplot as plt
    >>> t = np.arange(len(waveform_1))
    >>> plt.plot(t, waveform_1) 
    [<matplotlib.lines.Line2D object at ...>]
    >>> plt.show()
    
    2 adalah
    Bagaimana Anda menyesuaikan kurva non linier dengan python?
    (lebar)

Solusi awal

Salah satu solusi awal yang mungkin yang kami tentukan dengan inspeksi adalah

>>> x0 = np.array([3, 30, 15, 1], dtype=float)
_

Bugar

scipy.optimize.leastsq meminimalkan jumlah kuadrat dari fungsi yang diberikan sebagai argumen. Pada dasarnya fungsi untuk meminimumkan adalah residual (selisih antara data dan model)

>>> def residuals(coeffs, y, t):
..     return y - model(t, coeffs)

Jadi mari kita dapatkan solusinya dengan memanggil dengan argumen berikut

  • fungsi untuk meminimalkan
  • sebuah solusi awal
  • argumen tambahan untuk diteruskan ke fungsi

>>> from scipy.optimize import leastsq
>>> t = np.arange(len(waveform_1))
>>> x, flag = leastsq(residuals, x0, args=(waveform_1, t))
>>> print(x)
[  2.70363341  27.82020742  15.47924562   3.05636228]
_

Dan visualisasikan solusinya

fig, ax = plt.subplots(figsize=(8, 6))
plt.plot(t, waveform_1, t, model(t, x))
plt.xlabel('Time [ns]')
plt.ylabel('Amplitude [bins]')
plt.legend(['Waveform', 'Model'])
plt.show()
_

Bagaimana Anda menyesuaikan kurva non linier dengan python?

Komentar. dari scipy v0. 8 dan lebih tinggi, Anda sebaiknya menggunakan which mengambil model dan data sebagai argumen, jadi Anda tidak perlu mendefinisikan residu lagi

Bagaimana Anda menyesuaikan persamaan dengan kurva dengan Python?

data = kerangka data. nilai-nilai. .
x, y = data[. , 4], data[. , -1] # kecocokan kurva
popt, _ = curve_fit(objective, x, y) # meringkas nilai parameter
cetak('y = %. 5f * x + %. 5f * x^2 + %. 5f' % (a, b, c)) # plot input vs output
pyplot. sebar (x, y).
x_line = arange(min(x), maks(x), 1).
y_line = tujuan(x_line, a, b, c)

Bagaimana Anda menjalankan regresi non linier dengan Python?

Mengimpor perpustakaan yang diperlukan .
x = np. atur (-5. 0, 5. 0, 0. 1) #Anda dapat menyesuaikan kemiringan dan mencegat untuk memverifikasi perubahan dalam grafik. .
x = np. atur (-5. 0, 5. 0, 0. 1) #Anda dapat menyesuaikan kemiringan dan mencegat untuk memverifikasi perubahan dalam grafik. .
plt. angka(figsize=(8,5))

Yang mana yang dapat digunakan untuk menyesuaikan data non linier?

Semakin kecil jumlah angka kuadrat ini, semakin baik fungsi tersebut cocok dengan titik data dalam himpunan. Regresi nonlinier menggunakan fungsi logaritmik, fungsi trigonometri, fungsi eksponensial, fungsi daya, kurva Lorenz, fungsi Gaussian, dan metode pemasangan lainnya .

Apa itu pemasangan kurva non linier?

Satu grup pemasangan kurva adalah linier dan grup lainnya dikenal sebagai pemasangan kurva non-linier. Jenis pemasangan kurva ini adalah metode untuk menemukan model non-linier untuk menemukan hubungan antara variabel dependen dan sekumpulan variabel independen .