Topik ini membahas empat keluarga fungsi yang paling sering ditemui, yaitu linear, kuadratik, eksponensial, dan logaritma. Setiap keluarga dijelaskan dari perilakunya, diverifikasi angka demi angka dengan NumPy, lalu dikenali dari bentuk grafiknya. Setelah membaca, rumus atau kurva dapat dihubungkan dengan keluarganya, dan keluarga tersebut dapat dihitung ulang dalam kode untuk memeriksa perilakunya.
Keluarga linear dan kuadratik#
Fungsi linear bertumbuh dengan laju yang tetap, yaitu setiap kenaikan satu satuan menambah keluaran tepat . Sifat ini mudah diverifikasi karena selisih dua keluaran berurutan selalu sama. Grafiknya garis lurus dengan kemiringan , dan dua bilangan itu sepenuhnya menentukan bentuknya. Fungsi ini menjadi pembanding paling sederhana untuk semua keluarga lain.
Fungsi kuadratik menghasilkan parabola. Tanda menentukan arah buka, sedangkan puncaknya berada pada . Bentuk puncak menunjukkan bahwa parabola apa pun merupakan transformasi dari , sehingga letak puncaknya terbaca langsung dari nilai dan .
Akar persamaan menjadi titik potong sumbu-x parabolanya, sehingga jumlah akar dan bentuk parabola saling menjelaskan. Parabola yang tidak memotong sumbu-x berarti persamaannya tidak memiliki akar real, dan parabola yang menyinggung sumbu-x berarti akarnya kembar. Pada tabel nilai, keluarannya berubah dengan langkah yang makin besar atau makin kecil, bukan dengan selisih tetap seperti pada keluarga linear.
Keluarga eksponensial#
Fungsi eksponensial menempatkan bilangan tetap pada posisi pangkat, dengan syarat dan . Setiap kenaikan satu satuan mengalikan keluaran dengan , sehingga urutan nilainya berbentuk penggandaan, yaitu untuk . Domainnya semua bilangan real, sedangkan daerah hasilnya karena perpangkatan tidak pernah menghasilkan nol maupun bilangan negatif. Bilangan Euler menjadi basis yang paling lazim dalam kode, dan NumPy menyediakannya sebagai np.exp.
Cara cepat membaca adalah melalui waktu penggandaan, yaitu berapa kenaikan yang dibutuhkan agar keluaran menjadi dua kali lipat. Untuk waktunya tepat satu satuan, sedangkan untuk lebih cepat dari itu. Sebaliknya, menghasilkan peluruhan, karena setiap kenaikan justru membagi keluaran dengan bilangan yang lebih dari satu. Ciri khas keluarga ini adalah pertumbuhan yang melampaui fungsi linear apa pun pada akhirnya, seberapa pun kemiringan garisnya. Perilaku itu sulit dipercaya dari beberapa angka pertama saja, karena awal pertumbuhannya terlihat lambat, tetapi menjadi sangat curam setelah beberapa penggandaan.
Keluarga logaritma#
Fungsi logaritma adalah kebalikan fungsi eksponensial. Persamaan sama artinya dengan , sehingga logaritma menjawab pertanyaan tentang banyak penggandaan, yaitu berapa kali basis harus dikalikan untuk mencapai . Domainnya karena eksponensial tidak pernah menghasilkan keluaran nol maupun negatif.
Kurvanya tumbuh sangat lambat, dan contohnya , yang berarti penggandaan sepuluh kali sudah cukup untuk melewati seribu. Skala logaritmik digunakan ketika nilai membentang sangat lebar, karena logaritma memampatkan rentang besar menjadi rentang yang mudah dibaca. Desibel pada suara dan skala kekuatan gempa menggunakan gagasan yang sama, sedangkan pada kode histogram logaritmik dipilih ketika data membentang dari satu sampai sejuta.
Mengenali keluarga dari bentuk grafiknya#
Bentuk grafik langsung menunjukkan keluarganya. Garis lurus menandakan fungsi linear, parabola simetris menandakan kuadratik, kurva yang makin curam menandakan eksponensial, dan kurva yang makin landai menandakan logaritma. Contoh berikut menggambar satu wakil dari setiap keluarga pada empat panel, lalu menyimpannya sebagai berkas SVG.
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-4.0, 4.0, 200)
xp = np.linspace(0.25, 4.0, 200)
xe = np.linspace(-2.0, 2.0, 200)
fig, axs = plt.subplots(2, 2, figsize=(7, 5))
axs[0, 0].plot(x, 0.5 * x + 1, color="#1a5fb4")
axs[0, 0].set_title("linear: y = 0.5x + 1", fontsize=9)
axs[0, 1].plot(x, 0.25 * x**2 - 1, color="#c01c28")
axs[0, 1].set_title("kuadratik: y = 0.25x^2 - 1", fontsize=9)
axs[1, 0].plot(xe, np.exp(xe), color="#26a269")
axs[1, 0].set_ylim(0.0, 8.0)
axs[1, 0].set_title("eksponensial: y = e^x", fontsize=9)
axs[1, 1].plot(xp, np.log(xp), color="#813e9c")
axs[1, 1].set_title("logaritma: y = ln x", fontsize=9)
for ax in axs.flat:
ax.axhline(0.0, color="#000000", linewidth=0.8)
ax.axvline(0.0, color="#000000", linewidth=0.8)
ax.tick_params(labelsize=8)
fig.tight_layout()
fig.savefig("keluarga-fungsi.svg")Perbedaan paling mencolok ada pada pertumbuhan eksponensial dibandingkan linear. Contoh berikut membandingkan dengan pada , , dan .
import numpy as np
x = np.array([10.0, 20.0, 30.0])
print("linear 4x :", 4.0 * x)
print("eksponen 2^x:", 2.0**x)linear 4x : [ 40. 80. 120.]
eksponen 2^x: [1.02400000e+03 1.04857600e+06 1.07374182e+09]Pada kedua nilai masih sepadan, yaitu 40 berhadapan dengan 1024. Pada fungsi linear baru mencapai 120, sedangkan eksponensialnya melonjak ke , yaitu sekitar satu miliar, yang oleh NumPy ditulis dengan notasi ilmiah 1.074e+09. Eksponensial pada akhirnya melampaui garis apa pun, dan grafik empat panel di atas menyimpan perilaku itu sebagai kurva yang makin curam. Domain dan daerah hasilnya juga terbaca kembali dari panel-panel itu, karena panel logaritma hanya memuat positif, sedangkan panel eksponensial selalu berada di atas sumbu horizontal.
Menghitung empat keluarga dengan NumPy#
Skrip berikut menghitung satu wakil dari setiap keluarga, yaitu selisih tetap fungsi linear, puncak parabola, penggandaan eksponensial, dan kebalikannya pada logaritma. Setiap baris keluarannya dapat dihitung ulang secara manual sebagai pemeriksaan. NumPy menjadi kalkulator tetap sepanjang jalur ini, dan pola skrip di atas dapat disalin untuk menguji fungsi apa pun pada beberapa masukan pilihan. Jalankan skrip dengan python3 keluarga_fungsi.py di dalam direktori topik untuk menghasilkan kembali keluaran yang sama.
import numpy as np
# linear: kenaikan konstan
x = np.array([0, 1, 2, 3, 4])
print("3x + 1 :", 3 * x + 1)
# kuadratik: titik puncak parabola y = x^2 - 4x + 1
a, b, c = 1.0, -4.0, 1.0
x_puncak = -b / (2.0 * a)
y_puncak = a * x_puncak**2 + b * x_puncak + c
print("puncak : x =", x_puncak, "y =", y_puncak)
# eksponensial: penggandaan pada setiap kenaikan x
x = np.arange(0, 6)
print("2^x :", 2.0**x)
# logaritma: kebalikan eksponensial
x = np.array([1, 2, 4, 8, 1024])
print("log2(x) :", np.log2(x))3x + 1 : [ 1 4 7 10 13]
puncak : x = 2.0 y = -3.0
2^x : [ 1. 2. 4. 8. 16. 32.]
log2(x) : [ 0. 1. 2. 3. 10.]Baris pertama memperlihatkan selisih yang selalu 3, sesuai kemiringan rumusnya. Baris kedua menemukan puncak parabola di melalui rumus , dan posisi puncak beserta nilainya cukup untuk menggambar parabola tanpa tabel nilai. Dua baris terakhir saling mencerminkan, karena menggandakan keluaran sedangkan menghitung banyak penggandaan, dan pasangan dengan menutup hubungan kebalikannya. Label pada setiap baris keluaran sengaja dicantumkan agar keluarga yang sedang dihitung terbaca tanpa membaca ulang skripnya. Pola print berlabel seperti ini merupakan kebiasaan yang baik saat memeriksa rumus baru dengan cepat.
Demo interaktif: mengganti keluarga fungsi#
Demo berikut menggambar satu fungsi pada kanvas, dan keluarganya diganti melalui tombol pilihan. Parameter pada penggeser berlaku sesuai keluarganya, yaitu kemiringan untuk linear, lebar parabola untuk kuadratik, basis untuk eksponensial, dan basis untuk logaritma. Pilih eksponensial, geser melewati nilai 1, dan amati kurva berbalik dari tumbuh menjadi luruh. Pilih logaritma dan perhatikan bahwa kurva hanya muncul pada sisi kanan sumbu vertikal karena domainnya .
Rentang untuk dua keluarga terakhir dipersempit otomatis agar basis selalu positif, dan penggantian keluarga ketika bernilai satu menggesernya ke 2 karena basis satu hanya menghasilkan kurva datar. Hubungan kebalikan antara eksponensial dan logaritma dapat dirasakan dengan mengganti keluarga pada basis yang sama, karena kurvanya berpindah dari makin curam menjadi makin landai. Demo ini juga memperlihatkan perlakuan domain secara langsung, karena kurva logaritma berhenti di sumbu vertikal dan tidak pernah menyeberang ke kiri, sedangkan fungsi linear terus membentang ke kedua sisi tanpa henti. Perbedaan perilaku semacam ini menjadi pertimbangan ketika memilih model atau transformasi untuk data.
Di mana hal ini ditemui dalam kode#
Lapisan linear (dense layer) pada jaringan saraf menghitung , yaitu bentuk versi banyak variabel, sehingga keluarga linear menjadi unit dasar dari model paling sederhana sekaligus komponen setiap lapisan. Loss kuadratik menggunakan keluarga kuadratik, dan bentuk parabolanya menjelaskan mengapa error kecil dikenakan biaya ringan sedangkan error besar dikenakan biaya yang jauh lebih berat. Model regresi paling sederhana berhenti pada kedua bentuk itu, karena prediksinya memang berupa tanpa suku tambahan apa pun.
Keluarga eksponensial muncul pada fungsi sigmoid dan softmax yang keduanya memanggil np.exp, sedangkan jadwal penurunan tingkat pembelajaran sering berbentuk peluruhan eksponensial. Peluruhan yang sama digunakan pada rata-rata bergerak (moving average) untuk melacak rata-rata loss secara halus. Keluarga logaritma menghitung cross-entropy, karena logaritma mengubah perkalian peluang yang kecil menjadi penjumlahan yang stabil secara numerik. Bahkan satuan bit pada teori informasi didefinisikan melalui , sehingga di atas persis berarti sepuluh bit. Gagasan yang sama berlaku pada kurva karakteristik sensor, yang sering dimodelkan dengan salah satu keluarga ini sebelum digunakan untuk kalibrasi.
Ringkasan#
- Fungsi linear bertumbuh dengan selisih tetap, sedangkan kuadratik membentuk parabola dengan puncak pada .
- Eksponensial menggandakan keluaran pada setiap kenaikan masukan, sedangkan logaritma menghitung banyak penggandaan itu sebagai kebalikannya.
- Bentuk grafik mengidentifikasi keluarganya, yaitu garis lurus, parabola, kurva yang makin curam, dan kurva yang makin landai.
- Keempat keluarga menjadi bahan dasar kode machine learning, dari lapisan linear dan loss kuadratik sampai sigmoid, softmax, dan cross-entropy.
Referensi#
- Precalculus 4.1: Exponential Functions — OpenStax — Definisi, grafik, dan sifat pertumbuhan fungsi eksponensial.
- Precalculus 4.3: Logarithmic Functions — OpenStax — Logaritma sebagai kebalikan eksponensial beserta domain dan grafiknya.
- Mathematics for Machine Learning — Deisenroth, Faisal, and Ong — Buku teks terbuka yang menggunakan keluarga fungsi ini pada model dan loss machine learning.