Cara Belajar Matematika

Membaca simbol sebagai notasi, mengerjakan contoh secara manual, dan membangun kebiasaan verifikasi dalam kode.

Daftar isi

Topik ini membahas tiga kebiasaan yang membuat pembelajaran matematika berjalan lebih mantap bagi pemrogram, yaitu membaca simbol sebagai notasi, mengerjakan contoh secara manual, dan memverifikasi setiap rumus dengan kode. Ketiganya dipraktikkan pada satu contoh statistika kecil yang dihitung dengan tangan terlebih dahulu, kemudian diperiksa ulang menggunakan NumPy. Alur ketiga kebiasaan tersebut bergerak melingkar, sebagaimana dirangkum pada diagram berikut. Setelah topik ini selesai, rumus yang panjang tidak lagi terbaca sebagai teka-teki, melainkan sebagai rangkaian operasi yang dapat dieksekusi.

Siklus belajar matematika untuk pemrogram1. Baca simbolnyaterjemahkan ke operasi2. Hitung manualdengan bilangan kecil3. Verifikasi kodecocokkan dengan patokanulangi pada rumus dan contoh berikutnya
Siklus belajar matematika untuk pemrogram

Simbol sebagai notasi, bukan teka-teki#

Rumus matematika pada dasarnya adalah notasi singkat, yaitu cara menulis operasi yang berulang agar tidak memakan halaman. Simbol ∑\sum menandai penjumlahan berindeks, huruf Yunani μ\mu lazim menjadi lambang rata-rata, dan garis pecah tetap berarti pembagian. Membaca rumus menjadi mudah apabila setiap simbol diterjemahkan ke operasi pemrograman yang setara. Sebagai contoh, rumus rata-rata berikut dibaca dari kiri ke kanan sebagaimana baris kode dieksekusi.

μ=1n∑i=1nxi \mu = \frac{1}{n}\sum_{i=1}^{n} x_i

Bacaan harfiahnya: nilai μ\mu sama dengan seluruh xix_i yang dijumlahkan dari indeks 1 sampai nn, lalu dibagi nn. Dalam kode NumPy, rumus yang sama ditulis sebagai mu = x.sum() / n. Tabel berikut merangkum simbol yang paling sering muncul sepanjang jalur ini beserta padanannya dalam kode.

SimbolDibacaPadanan dalam kode
∑i=1nxi \sum_{i=1}^{n} x_i sigmapenjumlahan seluruh elemen, np.sum(x)
1n \frac{1}{n} satu per npembagian biasa, 1 / n
xi x_i x indeks ielemen ke-i dari array, x[i]
x \sqrt{x} akar kuadratnp.sqrt(x)
μ \mu murata-rata, np.mean(x)
σ2 \sigma^2 sigma kuadratvarians, np.var(x)

Padanan pada tabel tidak boleh dibaca terbalik. Rumus menyatakan maksud, sedangkan kode menyatakan langkah eksekusinya, sehingga keduanya setara secara nilai meski bentuknya berbeda. Kebiasaan menerjemahkan dua arah, dari rumus ke kode dan dari kode kembali ke rumus, merupakan keterampilan inti yang digunakan pada seluruh jalur.

Mengerjakan contoh secara manual#

Contoh yang dihitung dengan tangan memberi dua hal yang tidak diberikan oleh kode apa pun, yaitu angka yang diketahui benar dan intuisi tentang besarnya nilai. Contoh yang digunakan sepanjang topik ini adalah lima catatan sensor suhu dalam derajat Celsius selama lima jam, yaitu 22, 24, 23, 25, dan 26. Nilainya sengaja kecil agar seluruh langkah dapat dikerjakan tanpa kalkulator.

Urutan langkah manualnya adalah sebagai berikut.

  1. Jumlahkan seluruh data, yaitu 22+24+23+25+26=12022 + 24 + 23 + 25 + 26 = 120, lalu bagi dengan lima sehingga diperoleh rata-rata 24.
  2. Hitung selisih setiap data terhadap 24, yaitu −2,0,−1,1,2-2, 0, -1, 1, 2.
  3. Kuadratkan setiap selisih sehingga diperoleh 4, 0, 1, 1, dan 4, kemudian jumlahkan menjadi 10.
  4. Bagi 10 dengan banyaknya data untuk memperoleh varians 10/5=210 / 5 = 2.

Angka 24 untuk rata-rata dan 2 untuk varians kini menjadi patokan kebenaran yang siap digunakan. Kedua nilai tersebut merupakan hasil dari rumus umum berikut, yang sengaja ditulis setelah langkah manualnya dipahami. Urutan ini sengaja dibuat berlawanan dengan kebiasaan menghafal rumus lebih dahulu, karena setiap simbol kini sudah membawa gambaran angka.

μ=1n∑i=1nxi,σ2=1n∑i=1n(xi−μ)2 \mu = \frac{1}{n}\sum_{i=1}^{n} x_i, \qquad \sigma^2 = \frac{1}{n}\sum_{i=1}^{n} (x_i - \mu)^2

Bentuk umum tidak menambah hal baru selain notasi, tetapi notasi itulah yang membuat rumus dapat ditulis ulang dalam bahasa pemrograman mana pun. Simbol nn kini berarti banyaknya data apa pun, bukan lagi angka lima pada contoh suhu. Sifat inilah yang membuat satu rumus mencakup tak terhingga banyak kasus sekaligus.

Membangun kebiasaan verifikasi dalam kode#

Verifikasi dalam kode berarti menuliskan ulang rumus apa adanya, menjalankannya pada contoh manual, lalu membandingkan hasilnya dengan patokan yang sudah diketahui. NumPy mendukung kebiasaan ini karena penjumlahan, kuadrat, dan pembagian tersedia sebagai operasi yang bentuknya mirip notasi rumusnya. Kode berikut menghitung ulang kedua nilai patokan dan membandingkannya dengan fungsi bawaan NumPy.

python verifikasi_statistik.py
import numpy as np

# catatan sensor suhu dalam derajat Celsius selama lima jam
x = np.array([22.0, 24.0, 23.0, 25.0, 26.0])
n = x.size

mu = x.sum() / n                     # rumus rata-rata ditulis apa adanya
sigma2 = ((x - mu) ** 2).sum() / n   # rumus varians ditulis apa adanya

print(f"Rata-rata : {mu:.4f}")
print(f"Varians   : {sigma2:.4f}")
print(f"Cocok dengan np.mean dan np.var: {np.isclose(mu, np.mean(x)) and np.isclose(sigma2, np.var(x))}")
text Keluaran
Rata-rata : 24.0000
Varians   : 2.0000
Cocok dengan np.mean dan np.var: True

Keluaran menunjukkan kedua jalur perhitungan bertemu pada angka yang sama, yaitu 24 untuk rata-rata dan 2 untuk varians. Nilai patokan dari hitungan tangan dan keluaran NumPy saling mengunci, sehingga kemungkinan salah di kedua sisi sekaligus menjadi sangat kecil. Fungsi np.isclose sengaja dipilih alih-alih operator == karena perbandingan pecahan biner membutuhkan toleransi. Alasannya terlihat jelas pada contoh berikut.

python bandingkan_float.py
import numpy as np

# membandingkan bilangan pecahan biner dengan dua cara
hasil = 0.1 + 0.2
print(f"Nilai hasil penjumlahan : {hasil!r}")
print(f"Persamaan ==            : {hasil == 0.3}")
print(f"np.isclose              : {np.isclose(hasil, 0.3)}")
text Keluaran
Nilai hasil penjumlahan : 0.30000000000000004
Persamaan ==            : False
np.isclose              : True

Penjumlahan 0.1 + 0.2 menghasilkan 0.30000000000000004 karena kedua bilangan tidak dapat direpresentasikan persis dalam pecahan biner. Operator == menuntut kesamaan persis sehingga menjawab False, sedangkan np.isclose mengizinkan selisih kecil sehingga menjawab True. Kebiasaan verifikasi yang sehat selalu menggunakan toleransi untuk membandingkan hasil pecahan, dan prinsip ini berlaku pada setiap perhitungan numerik sepanjang jalur.

Di mana hal ini ditemui dalam kode#

Ketiga kebiasaan di atas bukan latihan akademis, melainkan pola kerja yang muncul hampir di setiap proyek numerik. Bentuknya menyesuaikan konteks, tetapi intinya selalu sama, yaitu ada rumus, ada contoh kecil, dan ada pembanding otomatis. Beberapa bentuk yang paling umum adalah sebagai berikut:

  • Pengujian unit memverifikasi fungsi statistika menggunakan contoh kecil yang hasilnya sudah dihitung dengan tangan, ditulis sebagai pernyataan assert np.isclose(...).
  • Pelatihan model machine learning diperiksa melalui gradient checking, yaitu perbandingan gradien hasil rumus dengan gradien hasil selisih kecil yang dihitung secara numerik.
  • Pipeline data (data pipeline) memvalidasi rentang nilai menggunakan pertidaksamaan, sehingga data janggal terdeteksi sebelum diolah lebih jauh.
  • Dokumentasi NumPy menyertakan contoh keluaran pada halaman setiap fungsinya, dan contoh tersebut diperiksa secara otomatis oleh sistem uji proyeknya.

Pola yang sama juga menjadi pola kerja jalur ini, yaitu setiap rumus baru disertai kode pemeriksa yang membandingkan hasil NumPy dengan angka patokan. Dengan kebiasaan tersebut, ketidaksamaan kecil antara rumus dan kode tidak lagi menjadi teka-teki, melainkan alarm yang jelas untuk ditelusuri. Alarm inilah yang membedakan kode yang kebetulan benar dari kode yang terbukti benar.

Ringkasan#

  • Simbol matematika adalah notasi singkat, dan setiap simbolnya memiliki padanan operasi di NumPy.
  • Contoh yang dihitung manual menghasilkan patokan kebenaran berupa angka yang diketahui benar.
  • Verifikasi dalam kode menuliskan ulang rumus, menjalankannya pada contoh manual, lalu membandingkan hasilnya menggunakan toleransi np.isclose.

Referensi#