Prasyarat MFDS-NM-02
- ADSP-01 : https://taudata.blogspot.com/2022/04/adsp-01.html (Memahami dasar Python dengan baik)
- Kalkulus Dasar
- Statistika Dasar
- MFDS-NM-01
Metode Numerik
Metode Numerik di Statistik Sederhana
(C) Taufik Sutanto - 2020
tau-data Indonesia ~ https://tau-data.id/MFDS-NM-02/
Quick Review¶
Sebelumnya kita telah membahas:
- Konversi basis bilangan dan error yang muncul karenanya di sistem floating point.
- Error mutlak & absolut
- Significant digit, truncation, rounding, dan cancellation error.
Pada kesempatan kali ini kita akan melihat lebih jauh pengaruh error-error tersebut ketika rumus statistika sederhana seperti Rata-Rata dan Variansi dihitung dengan cara biasa dan solusi apa yang bisa kita lakukan agar mendapatkan hasil perhitungan yang lebih baik.¶
# Fungsi menghitung Significant digit
import math
def sigDigit(real, approx):
rel_error = abs(real - approx)/abs(real)
return int( -math.log10( rel_error / 0.5 ) )
Tujuan¶
Peserta memahami lebih mendalam bagaimana pemrograman Statistika/Data Science (bahkan yang paling sederhana sekalipun) membutuhkan pengetahuan metode/analisa numerik yang baik. Dengan memahami materi di lesson ini peserta diharapkan mulai memahami konsep programming di Big Data dengan konsep dasar yang kuat dan baik.
Outline: Studi Empiris (Eksperimen Numerik)¶
- Generate contoh data sample (kasus sederhana)
- Implementasi (well-known) modul (sebagai benchmark sederhana)
- Implementasi Naif
- Evaluasi
- Pendekatan yang lebih baik.
Elementary Statistics/Statistical Mathematics¶
image source: https://image2.slideserve.com/4702922/uniform-distribution-mean-variance-l.jpg
import numpy as np
np.random.seed(88) # Biasakan menggunakan SEED pada percobaan random/Stokhastik
X = np.random.uniform(0, 1, 10)
Y = X+1
X[0], X, Y
# Plot distribusinya
import matplotlib.pyplot as plt
X = np.random.uniform(0, 1, 3000)
count, bins, ignored = plt.hist(X, 10, density=True)
plt.plot(bins, np.ones_like(bins), linewidth=2, color='r')
plt.show()
Our Sample Data¶
# Hati-hati menggunakan memory yang cukup besar dan komputasi yang cukup besar (lama)!
# Rubah ke nilai yang lebih kecil jika menggunakan laptop/netbook
# yang Spec-nya Low-Med.
M = 10**12
X = np.random.uniform(0, 1, 10**6) + M
X[0]
Solusi Benchmark (Numpy)¶
realMean = np.mean(X)
realVar = np.var(X)
print("sample mean: ", realMean)
print( "sample variance: ", realVar)
#print( "Standard Deviation: ", np.std(X))
# Notice seberapa cepat nilai-nilai ini dihitung? Bandingkan nanti jika kita menggunakan looping.
Nope hasil diatas tidak tepat! Numpy Var by default menghitung Variansi Populasi bukan sample.¶
- Baca di dokumentasinya disini: https://numpy.org/doc/stable/reference/generated/numpy.var.html
- Dengan mudah di sesuaikan dengan cara berikut:
realMean = np.mean(X)
realVar = np.var(X, ddof=1)
print("sample mean: ", realMean)
print( "sample variance: ", realVar)
Solusi Standard (Naive 2-pass)¶
- Rata-rata sample: $\bar{x}=\frac{1}{N}\sum_{i=1}^{N}{x_i}$
- Variansi sample: $\sigma^2 = \frac{1}{N-1} \sum_{i=1}^{N}{(x_i-\bar{x})^2}$
# Hati-hati komputasi cukup lama!
M = 10**6
sum_ = 0.0 # ingat juggling variable di kuliah pertama
for i in range(M):
sum_ += X[i]
rerata = sum_/M
print('Significant digit Rata-rata =', sigDigit(realMean, rerata))
var_ = 0.0
for i in range(M):
var_ += (X[i]-rerata)**2
var_ = var_/(M-1)
print('Significant digit Variansi=', sigDigit(realVar, var_))
Mengapa errornya besar sekali?¶
- Cancellation
- Plus impractical, kenapa?. Algoritma Two Pass tidak cocok untuk data streaming, misal ketika menangani Velocity di Big Data.
Hal ini muncul di beberapa kasus nyata, misal di:¶
- computing regression coefficients
- computing Pearson’s correlation coefficient.
- signal processing.
How to improve?¶
# Generate ulang X, just to make sure
X = np.random.uniform(0, 1, 10**6) + 10**12
def onePassVar(X):
sum_, sumsq_ = 0.0, 0.0
N = len(X)
for x in X:
sum_ += x
sumsq_ += x**2
rerata = sum_/N
return (sumsq_ - N*rerata**2)/(N-1)
print('Significant digit Variansi=', sigDigit(realVar, onePassVar(X)))
# Hati-hati komputasi cukup lama di komputer dengan spec low-mid
# Generate ulang X, just to make sure
X = np.random.uniform(0, 1, 10**6) + 10**12
X = X-10**12 # Shifting
N = len(X)
sum_ = 0.0 # ingat juggling variable di kuliah pertama
for x in X:
sum_ += x
rerata = sum_/N
var_ = 0.0
for x in X:
var_ += (x-rerata)**2
var_ = var_/(N-1)
print('Significant digit Variansi=', sigDigit(realVar, var_))
Mengapa hanya dengan "shifting"/menggeser meningkatkan akurasi begitu besar?¶
Alternative: Metode Welford¶
[*]. Welford, B. P. (1962). Note on a method for calculating corrected sums of squares and products. Technometrics, 4(3), 419-420.
- Penjelasan lebih lanjut: https://math.stackexchange.com/questions/2798082/how-is-welfords-algorithm-derived
# kita harus kembalikan dahulu nilai X
M = 10**12
X = np.random.uniform(0, 1, 10**6) + M
def welford(x_array):
k = 0
for x in x_array:
k += 1
if k == 1:
M = x
S = 0
else:
Mnext = M + (x - M) / k
S = S + (x - M)*(x - Mnext)
M = Mnext
return S/(k-1)
print('Significant digit Variansi=', sigDigit(realVar, welford(X)))
Mengapa Lebih baik (the logic behind Welford method)¶
- Single Pass, cocok untuk streaming analytics
- Pembuktian/penjelasan lebih lanjut:
Jika ingin mendalami lebih lanjut:¶
Comparison of Several Algorithms for Computing Sample Means and Variances Robert F. Ling Journal of the American Statistical Association Vol. 69, No. 348 (Dec., 1974), pp. 859-866 (8 pages) Published By: Taylor & Francis, Ltd. DOI: 10.2307/2286154 https://www.jstor.org/stable/2286154
End of Modul MFDS-NM-02¶
Code Lesson MFDS-NM-02
Code dari lesson ini dapat di akses di Link berikut (wajib login ke Google/Gmail): Code MFDS-NM-02
Di link tersebut anda langsung bisa merubah code dan menjalankannya. Keterangan lebih lanjut di Video MFDS-NM-01.
Sangat disarankan untuk membuka code dan video "side-by-side" untuk mendapatkan pengalaman belajar yang baik (Gambar dibawah). SIlahkan modifikasi (coba-coba) hal lain, selain yang ditunjukkan di video untuk mendapatkan pengalaman belajar yang lebih mendalam. Tentu saja juga silahkan akses berbagai referensi lain untuk memperkaya pengetahuan lalu diskusikan di forum yang telah disediakan.
Video Lesson MFDS-NM-02
Referensi MFDS-NM:
- Johansson, R. (2018). Numerical Python: Scientific Computing and Data Science Applications with Numpy, SciPy and Matplotlib. Apress.
- John H. Mathews, Numerical Methods for Mathematics, Prentice Hall, 1992
- Heath, M. T. (2018). Scientific computing: an introductory survey (Vol. 80). SIAM.
- Conte, S. D., u0026amp; De Boor, C. (2017). Elementary numerical analysis: an algorithmic approach (Vol. 78). SIAM.
Tidak ada komentar:
Posting Komentar
Relevant & Respectful Comments Only.