Pendahuluan
Dibandingkan dengan bahasa open source lainnya seperti Perl dan Python, komunitas PHP kurang memiliki upaya yang kuat untuk mengembangkan perpustakaan matematika.
Salah satu alasannya mungkin karena sudah terdapat sejumlah besar alat matematika yang matang, yang mungkin menghambat upaya komunitas untuk mengembangkan sendiri alat PHP. Misalnya, saya mengerjakan alat canggih, S System, yang memiliki kumpulan perpustakaan statistik yang mengesankan, dirancang khusus untuk menganalisis kumpulan data, dan memenangkan ACM Award pada tahun 1998 untuk desain bahasanya. Jika S atau sepupu open source R hanyalah panggilan exec_shell, mengapa harus bersusah payah mengimplementasikan fungsi komputasi statistik yang sama di PHP? Untuk informasi lebih lanjut tentang Sistem S, ACM Award, atau R-nya, lihat referensi terkait.
Bukankah ini membuang-buang energi pengembang? Jika motivasi untuk mengembangkan perpustakaan matematika PHP adalah untuk menghemat upaya pengembang dan menggunakan alat terbaik untuk pekerjaan itu, maka topik PHP saat ini masuk akal.
Di sisi lain, motivasi pedagogis dapat mendorong pengembangan perpustakaan matematika PHP. Bagi sekitar 10% orang, matematika adalah mata pelajaran menarik yang perlu ditelusuri. Bagi yang juga mahir PHP, pengembangan perpustakaan matematika PHP dapat meningkatkan proses pembelajaran matematika. Dengan kata lain, tidak hanya membaca bab tentang tes-T, tetapi juga mengimplementasikan program yang dapat menghitung perantara yang sesuai nilai-nilai dan menampilkannya dalam format standar kelasnya.
Melalui bimbingan dan pelatihan, saya berharap dapat menunjukkan bahwa mengembangkan perpustakaan matematika PHP bukanlah tugas yang sulit dan mungkin merupakan tantangan teknis dan pembelajaran yang menarik. Pada artikel ini, saya akan memberikan contoh perpustakaan matematika PHP, yang disebut SimpleLinearRegression, yang menunjukkan pendekatan umum yang dapat digunakan untuk mengembangkan perpustakaan matematika PHP. Mari kita mulai dengan membahas beberapa prinsip umum yang memandu saya dalam mengembangkan kelas SimpleLinearRegression.
Prinsip Panduan
Saya menggunakan enam prinsip umum untuk memandu pengembangan kelas SimpleLinearRegression.
Buat kelas untuk setiap model analisis.
Gunakan tautan balik untuk mengembangkan kelas.
Diharapkan sejumlah besar pengambil.
Simpan hasil antara.
Tetapkan preferensi untuk API terperinci.
Kesempurnaan bukanlah tujuan.
Mari kita periksa masing-masing pedoman ini secara lebih rinci.
Buat kelas untuk setiap model analisis.
Setiap pengujian atau proses analisis utama harus memiliki kelas PHP dengan nama yang sama dengan pengujian atau proses. Kelas ini berisi fungsi masukan, fungsi untuk menghitung nilai antara dan nilai ringkasan, dan fungsi keluaran ( menggantikan nilai perantara). Nilai dan nilai ringkasan semuanya ditampilkan di layar dalam format teks atau grafik).
Menggunakan rantai terbalik untuk mengembangkan kelas
Dalam pemrograman matematika, target pengkodean biasanya berupa nilai keluaran standar yang ingin dihasilkan oleh prosedur analisis (seperti MultipleRegression, TimeSeries, atau ChiSquared). Dari perspektif pemecahan masalah, ini berarti Anda dapat menggunakan rangkaian mundur untuk mengembangkan metode yang mirip matematika.
Misalnya, layar keluaran ringkasan menampilkan hasil dari satu atau lebih statistik ringkasan. Ringkasan hasil statistik ini bergantung pada perhitungan hasil statistik menengah, dan hasil statistik menengah ini mungkin melibatkan hasil statistik menengah yang lebih dalam, dan seterusnya. Pendekatan pengembangan berbasis backlink ini mengarah pada prinsip berikutnya.
Harapkan sejumlah besar
kelas matematika yang rajin. Sebagian besar pekerjaan pengembangan kelas melibatkan penghitungan nilai perantara dan ringkasan. Dalam praktiknya, ini berarti Anda tidak perlu heran jika kelas Anda berisi banyak metode pengambil yang menghitung nilai perantara dan ringkasan.
Menyimpan Hasil Antara
Menyimpan hasil perhitungan antara dalam objek hasil sehingga Anda dapat menggunakan hasil antara sebagai masukan untuk perhitungan selanjutnya. Prinsip ini diterapkan dalam desain bahasa S. Dalam konteks saat ini, prinsip ini diterapkan dengan memilih variabel instan untuk mewakili nilai antara yang dihitung dan hasil ringkasan.
Menetapkan Preferensi untuk API Terperinci
Saat mengembangkan skema penamaan untuk fungsi anggota dan variabel instan di kelas SimpleLinearRegression, saya menemukan bahwa jika saya menggunakan nama yang lebih panjang (seperti getSumSquaredError alih-alih getYY2 ) untuk mendeskripsikan fungsi anggota dan variabel Instance, maka itu lebih mudah untuk memahami isi operasi fungsi dan arti variabel.
Saya belum sepenuhnya meninggalkan nama yang disingkat; namun, ketika saya menggunakan nama yang disingkat, saya harus mencoba memberikan catatan yang menjelaskan arti nama tersebut secara lengkap. Pendapat saya adalah ini: skema penamaan yang sangat disingkat adalah hal yang umum dalam pemrograman matematika, namun skema tersebut membuat lebih sulit untuk memahami dan membuktikan bahwa rutinitas matematika tertentu benar daripada yang seharusnya.
Kesempurnaan Bukan Tujuan
Tujuan dari latihan pengkodean ini tidak selalu untuk mengembangkan mesin matematika yang sangat optimal dan ketat untuk PHP. Pada tahap awal, penekanan harus diberikan pada pembelajaran untuk menerapkan tes analitis yang bermakna dan memecahkan masalah-masalah sulit di bidang ini.
Variabel Instance
Saat memodelkan pengujian atau proses statistik, Anda perlu menunjukkan variabel instan mana yang dideklarasikan.
Pemilihan variabel instan dapat ditentukan dengan memperhitungkan nilai perantara dan nilai ringkasan yang dihasilkan oleh proses analisis. Setiap nilai antara dan ringkasan dapat memiliki variabel instan yang sesuai, dengan nilai variabel tersebut sebagai properti objek.
Saya menggunakan analisis ini untuk menentukan variabel mana yang akan dideklarasikan untuk kelas SimpleLinearRegression di Listing 1. Analisis serupa dapat dilakukan pada prosedur MultipleRegression, ANOVA, atau TimeSeries.
Listing 1. Variabel instan dari kelas SimpleLinearRegression
<?php
// Hak Cipta 2003, Paul Meagher
// Didistribusikan di bawah GPL
kelas SimpleLinearRegression {
var$n;
var $X = susunan();
var $Y = susunan();
var $ConfInt;
var $Alfa;
var $XMean;
var $YBerarti;
var $JumlahXX;
var $JumlahXY;
var $JumlahYY;
var $Kemiringan;
var $YInt;
var $PrediksiY = array();
var $Kesalahan = array();
var $SquaredError = array();
var $TotalError;
var $JumlahKesalahan;
var $JumlahSquaredError;
var $ErrorVariance;
var $StdErr;
var $KemiringanStdErr;
var $SlopeVal; // T nilai Kemiringan
var $YIntStdErr;
var $YIntTVal; // Nilai T untuk Intersepsi Y
var $R;
var $RSquared;
var $DF; // Derajat Kebebasan
var $SlopeProb; // Probabilitas Estimasi Kemiringan
var $YIntProb; // Probabilitas Estimasi Intersep Y
var $AlphaTVal; // Nilai T untuk pengaturan alfa tertentu
var $ConfIntOfSlope;
var $RPath = "/usr/local/bin/R"; // Jalur Anda di sini
var $format = "%01.2f"; // Digunakan untuk memformat keluaran
}
?>
Konstruktor
Metode konstruktor kelas SimpleLinearRegression menerima vektor X dan Y, masing-masing dengan jumlah nilai yang sama. Anda juga dapat menetapkan interval kepercayaan 95% default untuk nilai Y yang Anda harapkan.
Metode konstruktor dimulai dengan memverifikasi bahwa formulir data cocok untuk diproses. Setelah vektor masukan lolos pengujian "ukuran sama" dan "nilai lebih besar dari 1", bagian inti algoritme dijalankan.
Melakukan tugas ini melibatkan penghitungan nilai perantara dan ringkasan dari proses statistik melalui serangkaian metode pengambil. Tetapkan nilai kembalian setiap pemanggilan metode ke variabel instan kelas. Menyimpan hasil perhitungan dengan cara ini memastikan bahwa nilai perantara dan ringkasan tersedia untuk memanggil rutinitas dalam perhitungan berantai. Anda juga dapat menampilkan hasil ini dengan memanggil metode keluaran kelas ini, seperti yang dijelaskan pada Listing 2.
Listing 2. Memanggil metode keluaran kelas
<?php
// Hak Cipta 2003, Paul Meagher
// Didistribusikan di bawah GPL
function SimpleLinearRegression($X, $Y, $ConfidenceInterval="95") {
$angkaX = hitungan($X);
$angkaY = hitungan($Y);
if ($angkaX != $angkaY) {
die("Error: Ukuran vektor X dan Y harus sama.");
}
jika ($angkaX <= 1) {
die("Kesalahan: Ukuran array masukan minimal harus 2.");
}
$ini->n = $angkaX;
$ini->X = $X;
$ini->Y = $Y;
$ini->ConfInt = $ConfidenceInterval;
$ini->Alpha = (1 + ($ini->ConfInt / 100) ) / 2;
$ini->XMean = $ini->getMean($ini->X);
$ini->YMean = $ini->getMean($ini->Y);
$ini->JumlahXX = $ini->getSumXX();
$ini->JumlahYY = $ini->getSumYY();
$ini->JumlahXY = $ini->getSumXY();
$ini->Kemiringan = $ini->getSlope();
$ini->YInt = $ini->getYInt();
$ini->PrediksiY = $ini->getPredictedY();
$ini->Kesalahan = $ini->getError();
$ini->SquaredError = $ini->getSquaredError();
$ini->JumlahError = $ini->getSumError();
$ini->TotalError = $ini->getTotalError();
$ini->SumSquaredError = $ini->getSumSquaredError();
$ini->ErrorVariance = $ini->getErrorVariance();
$ini->StdErr = $ini->getStdErr();
$ini->SlopeStdErr = $ini->getSlopeStdErr();
$ini->YIntStdErr = $ini->getYIntStdErr();
$ini->SlopeTVal = $ini->getSlopeTVal();
$ini->YIntTVal = $ini->getYIntTVal();
$ini->R = $ini->getR();
$ini->RSquared = $ini->getRSquared();
$ini->DF = $ini->getDF();
$ini->SlopeProb = $ini->getStudentProb($ini->SlopeTVal, $ini->DF);
$ini->YIntProb = $ini->getStudentProb($ini->YIntTVal, $ini->DF);
$ini->AlphaTVal = $ini->getInverseStudentProb($ini->Alpha, $ini->DF);
$ini->ConfIntOfSlope = $ini->getConfIntOfSlope();
kembali benar;
}
?>
Nama metode dan urutannya diperoleh melalui kombinasi tautan balik dan referensi ke buku teks statistik yang digunakan oleh mahasiswa sarjana, yang menjelaskan langkah demi langkah cara menghitung nilai antara. Nama nilai antara yang perlu saya hitung diawali dengan "dapatkan", sehingga mendapatkan nama metodenya.
Menyesuaikan model dengan data
Prosedur SimpleLinearRegression digunakan untuk menghasilkan garis lurus yang sesuai dengan data, dimana garis tersebut memiliki persamaan standar sebagai berikut:
y = b + mx
Format PHP persamaan ini terlihat mirip dengan Listing 3:
Listing 3. Sesuaikan model dengan data Pencocokan persamaan PHP
$PredictedY[$i] = $YIntercept + $Slope * $X[$i]
Kelas SimpleLinearRegression menggunakan kriteria kuadrat terkecil untuk memperoleh perkiraan parameter titik potong Y (Y Intercept) dan kemiringan (Slope). Estimasi parameter ini digunakan untuk membuat persamaan linier (lihat Daftar 3) yang memodelkan hubungan antara nilai X dan Y.
Dengan menggunakan persamaan linier turunan, Anda dapat memperoleh prediksi nilai Y untuk setiap nilai X. Jika persamaan linier cocok dengan data, maka nilai Y yang diamati dan diprediksi cenderung konsisten.
Cara menentukan apakah ada kecocokan
Kelas SimpleLinearRegression menghasilkan cukup banyak nilai ringkasan. Nilai ringkasan yang penting adalah statistik T, yang mengukur seberapa cocok suatu persamaan linier dengan data. Jika kesepakatannya sangat baik maka statistik T akan cenderung besar. Jika statistik T kecil, maka persamaan linier harus diganti dengan model yang mengasumsikan bahwa mean dari nilai Y adalah prediktor terbaik (artinya, mean dari sekumpulan nilai biasanya merupakan prediktor yang berguna. pengamatan berikutnya, jadikan model default).
Untuk menguji apakah statistik T cukup besar untuk tidak mempertimbangkan rata-rata nilai Y sebagai prediktor terbaik, Anda perlu menghitung probabilitas acak untuk memperoleh statistik T. Jika kemungkinan memperoleh T-statistik rendah, maka hipotesis nol yang menyatakan mean adalah prediktor terbaik dapat ditolak dan, oleh karena itu, yakinlah bahwa model linier sederhana cocok dengan data.
Lalu bagaimana cara menghitung probabilitas nilai statistik T?
Menghitung probabilitas nilai T-statistik
Karena PHP tidak memiliki rutinitas matematika untuk menghitung probabilitas nilai T-statistik, saya memutuskan untuk menyerahkan tugas ini ke paket komputasi statistik R (lihat www.r-project.org di Sumberdaya) untuk memperoleh nilai-nilai yang diperlukan. Saya juga ingin menarik perhatian pada paket ini karena:
R memberikan banyak ide yang mungkin ditiru oleh pengembang PHP di perpustakaan matematika PHP.
Dengan R, dimungkinkan untuk menentukan apakah nilai yang diperoleh dari perpustakaan matematika PHP konsisten dengan nilai yang diperoleh dari paket statistik sumber terbuka yang matang dan tersedia secara gratis.
Kode pada Listing 4 menunjukkan betapa mudahnya menyerahkannya pada R untuk mendapatkan nilai.
Listing 4. Menanganinya ke paket statistik R untuk mendapatkan suatu nilai
<?php
// Hak Cipta 2003, Paul Meagher
// Didistribusikan di bawah GPL
kelas SimpleLinearRegression {
var $RPath = "/usr/local/bin/R"; // Jalur Anda di sini
fungsi getStudentProb($T, $df) {
$Probabilitas = 0,0;
$cmd = "echo 'dt($T, $df)' | $ini->RPath --slave";
$hasil = shell_exec($cmd);
list($LineNumber, $Probabilitas) = meledak(" ", trim($hasil));
kembalikan $Probabilitas;
}
fungsi getInverseStudentProb($alpha, $df) {
$Probabilitas Terbalik = 0,0;
$cmd = "echo 'qt($alpha, $df)' | $ini->RPath --slave";
$hasil = shell_exec($cmd);
list($LineNumber, $InverseProbability) = meledak(" ", trim($hasil));
kembalikan $InverseProbability;
}
}
?>
Perhatikan bahwa jalur ke R yang dapat dieksekusi telah ditetapkan dan digunakan di kedua fungsi. Fungsi pertama mengembalikan nilai probabilitas yang terkait dengan statistik T berdasarkan distribusi T Student, sedangkan fungsi invers kedua menghitung statistik T yang sesuai dengan pengaturan alfa yang diberikan. Metode getStudentProb digunakan untuk mengevaluasi kesesuaian model linier; metode getInverseStudentProb mengembalikan nilai perantara, yang digunakan untuk menghitung interval kepercayaan untuk setiap nilai Y yang diprediksi.
Karena keterbatasan ruang, tidak mungkin bagi saya untuk merinci semua fungsi di kelas ini satu per satu, jadi jika Anda ingin mengetahui terminologi dan langkah-langkah yang terlibat dalam analisis regresi linier sederhana, saya mendorong Anda untuk merujuk pada buku teks statistik yang digunakan. oleh mahasiswa sarjana.
Studi Burnout
Untuk mendemonstrasikan cara menggunakan kelas ini, saya dapat menggunakan data dari studi burnout di sebuah utilitas. Michael Leiter dan Kimberly Ann Meechan mempelajari hubungan antara ukuran kelelahan yang disebut Indeks Kelelahan dan variabel independen yang disebut Konsentrasi. Konsentrasi mengacu pada proporsi kontak sosial masyarakat yang berasal dari lingkungan kerjanya.
Untuk mempelajari hubungan antara nilai indeks konsumsi dan nilai konsentrasi individu dalam sampelnya, muat nilai-nilai ini ke dalam array dengan nama yang sesuai dan buat instance kelas ini dengan nilai array ini. Setelah membuat instance kelas, tampilkan beberapa nilai ringkasan yang dihasilkan oleh kelas tersebut untuk mengevaluasi seberapa cocok model linier dengan data.
Listing 5 menunjukkan skrip yang memuat data dan menampilkan nilai ringkasan:
Listing 5. Skrip yang memuat data dan menampilkan nilai ringkasan
<?php
// BurnoutStudy.php
// Hak Cipta 2003, Paul Meagher
// Didistribusikan di bawah GPL
sertakan "SimpleLinearRegression.php";
// Memuat data dari studi kelelahan
$Konsentrasi = larik(20,60,38,88,79,87,
68,12,35,70,80,92,
77,86,83,79,75,81,
75,77,77,77,17,85,96);
$ExhaustionIndex = susunan(100,525,300,980,310,900,
410.296.120.501.920.810,
506.493.892.527.600.855,
709.791.718.684.141.400.970);
$slr = SimpleLinearRegression baru($Konsentrasi, $ExhaustionIndex);
$YInt = sprintf($slr->format, $slr->YInt);
$Kemiringan = sprintf($slr->format, $slr->Kemiringan);
$SlopeTVal = sprintf($slr->format, $slr->SlopeTVal);
$SlopeProb = sprintf("%01.6f", $slr->SlopeProb);
?>
<batas tabel='1' cellpadding='5'>
<tr>
<th align='right'>Persamaan:</th>
<td></td>
</tr>
<tr>
<th align='kanan'>T:</th>
<td></td>
</tr>
<tr>
<th align='right'>Masalah > T:</th>
<td><td>
</tr>
</tabel>
Menjalankan script ini melalui web browser menghasilkan keluaran sebagai berikut:
Persamaan: Kelelahan = -29.50 + (8.87 * Konsentrasi)
T: 6.03
Prob > T: 0,000005
Baris terakhir tabel ini menunjukkan bahwa probabilitas acak untuk memperoleh nilai T sebesar itu sangatlah rendah. Dapat disimpulkan bahwa model linier sederhana memiliki daya prediksi yang lebih baik dibandingkan hanya menggunakan mean nilai konsumsi.
Mengetahui konsentrasi koneksi di tempat kerja seseorang dapat digunakan untuk memprediksi tingkat kelelahan yang mungkin mereka alami. Persamaan ini memberitahu kita: setiap kenaikan 1 satuan nilai konsentrasi maka nilai konsumsi seseorang di bidang pelayanan sosial akan bertambah 8 satuan. Hal ini merupakan bukti lebih lanjut bahwa untuk mengurangi potensi kelelahan, individu di layanan sosial harus mempertimbangkan untuk mencari teman di luar tempat kerja mereka.
Ini hanyalah gambaran kasar mengenai arti dari hasil ini. Untuk mengeksplorasi sepenuhnya implikasi kumpulan data ini, Anda mungkin ingin mempelajari data secara lebih rinci untuk memastikan interpretasinya benar. Pada artikel selanjutnya saya akan membahas analisis lain apa yang harus dilakukan.
Apa yang kamu pelajari?
Pertama, Anda tidak perlu menjadi ilmuwan hebat untuk mengembangkan paket matematika berbasis PHP yang bermakna. Dengan mengikuti teknik berorientasi objek standar dan secara eksplisit mengadopsi metode pemecahan masalah rantai terbalik, PHP relatif mudah digunakan untuk mengimplementasikan beberapa proses statistik yang lebih mendasar.
Dari sudut pandang pengajaran, menurut saya latihan ini sangat berguna, karena mengharuskan Anda memikirkan tes statistik atau rutinitas pada tingkat abstraksi yang lebih tinggi dan lebih rendah. Dengan kata lain, cara terbaik untuk melengkapi pengujian statistik atau pembelajaran prosedural Anda adalah dengan menerapkan prosedur sebagai suatu algoritma.
Menerapkan uji statistik sering kali memerlukan lebih dari sekadar informasi yang diberikan serta pemecahan masalah dan penemuan yang kreatif. Ini juga merupakan cara yang baik untuk menemukan kesenjangan dalam pengetahuan tentang suatu subjek.
Pada sisi negatifnya, Anda menemukan bahwa PHP tidak memiliki sarana bawaan untuk pengambilan sampel distribusi, yang diperlukan untuk mengimplementasikan sebagian besar uji statistik. Anda harus membiarkan R melakukan pemrosesan untuk mendapatkan nilai-nilai ini, tetapi saya khawatir Anda tidak punya waktu atau minat untuk menginstal R. Implementasi asli PHP dari beberapa fungsi probabilitas umum dapat mengatasi masalah ini.
Masalah lain: kelas menghasilkan banyak nilai perantara dan ringkasan, tetapi keluaran ringkasan tidak benar-benar memanfaatkan hal ini. Saya telah memberikan beberapa hasil yang sulit dipahami, namun tidak cukup dan tidak terorganisir dengan baik sehingga Anda dapat menafsirkan hasil analisis secara memadai. Sebenarnya, saya sama sekali tidak tahu bagaimana saya bisa mengintegrasikan metode keluaran ke dalam kelas ini. Hal ini perlu diatasi.
Terakhir, memahami data memerlukan lebih dari sekadar melihat nilai ringkasan. Anda juga perlu memahami bagaimana titik data individual didistribusikan. Salah satu cara terbaik untuk melakukannya adalah dengan membuat grafik data Anda. Sekali lagi, saya tidak tahu banyak tentang ini, tetapi jika Anda ingin menggunakan kelas ini untuk menganalisis data nyata, Anda harus menyelesaikan masalah ini.