Apakah ada algoritme untuk memperkirakan median, mode, kemiringan, dan / atau kurtosis dari kumpulan nilai, tetapi itu TIDAK mengharuskan penyimpanan semua nilai dalam memori sekaligus?
Saya ingin menghitung statistik dasar:
- mean: rata-rata aritmatika
- varians: rata-rata deviasi kuadrat dari mean
- deviasi standar: akar kuadrat dari varians
- median: nilai yang memisahkan setengah angka yang lebih besar dari setengah angka yang lebih kecil
- mode: nilai paling sering ditemukan di set
- kemiringan: tl; dr
- kurtosis: tl; dr
Rumus dasar untuk menghitung semua ini adalah aritmatika sekolah dasar, dan saya memang mengetahuinya. Ada banyak pustaka statistik yang menerapkannya juga.
Masalah saya adalah banyaknya (miliaran) nilai dalam set yang saya tangani: Bekerja dengan Python, saya tidak bisa hanya membuat daftar atau hash dengan miliaran elemen. Bahkan jika saya menulis ini dalam C, array miliar elemen tidak terlalu praktis.
Data tidak diurutkan. Ini diproduksi secara acak, dengan cepat, oleh proses lain. Ukuran setiap set sangat bervariasi, dan ukurannya tidak akan diketahui sebelumnya.
Saya sudah menemukan cara menangani mean dan varians dengan cukup baik, mengulangi setiap nilai dalam set dalam urutan apa pun. (Sebenarnya, dalam kasus saya, saya mengambilnya sesuai urutan pembuatannya.) Berikut adalah algoritme yang saya gunakan, dengan izin http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm :
- Inisialisasi tiga variabel: count, sum, dan sum_of_squares
- Untuk setiap nilai:
- Hitungan kenaikan.
- Tambahkan nilai untuk menjumlahkan.
- Tambahkan kuadrat dari nilai tersebut ke sum_of_squares.
- Bagilah jumlah dengan hitungan, simpan sebagai rata-rata variabel.
- Bagilah sum_of_squares dengan hitungan, simpan sebagai variabel mean_of_squares.
- Rata-rata persegi, menyimpan sebagai square_of_mean.
- Kurangi square_of_mean dari mean_of_squares, simpan sebagai varians.
- Rata-rata keluaran dan varians.
Algoritme "on-line" ini memiliki kelemahan (misalnya, masalah akurasi karena sum_of_squares dengan cepat tumbuh lebih besar dari kisaran integer atau presisi float), tetapi pada dasarnya memberikan apa yang saya butuhkan, tanpa harus menyimpan setiap nilai di setiap set.
Tapi saya tidak tahu apakah ada teknik serupa untuk memperkirakan statistik tambahan (median, mode, skewness, kurtosis). Saya bisa hidup dengan estimator bias, atau bahkan metode yang membahayakan akurasi sampai tingkat tertentu, selama memori yang dibutuhkan untuk memproses nilai N secara substansial kurang dari O (N).
Mengarahkan saya ke pustaka statistik yang ada juga akan membantu, jika pustaka tersebut memiliki fungsi untuk menghitung satu atau lebih operasi ini "on-line".