Penerapan Inferensi Bayesian menggunakan PHP

Membangun Aplikasi Web Cerdas Menggunakan Probabilitas Bersyarat

Probabilitas Bersyarat -- probabilitas dari pengamatan satu peristiwa sebagai akibat dari peristiwa lain -- merupakan satu faktor penting dalam perancangan aplikasi web yang cerdas.Pada tulisan ini akan diperkenalkan Inferensi Bayesian dengan membahas konsep-konsep matematika dasar yang terlibat dan menunjukkan bagaimana menerapkan perhitungan probabilitas bersyarat menggunakan PHP.Pada artikel ini, penulis membahas bagaimana inferensi Bayesian dapat digunakan untuk membangun antarmuka berbasis PHP yang memandu pengguna dalam proses membuat diagnosis medis. Ketiga bagian dari rangkaian tulisan ini disimulasi dalam aplikasi yang dirancang untuk membantu kita memahami kekuatan dan potensi konsep inferensi Bayesian.

Mau lihat artikel lainya? Dapatkan artikel-artikel lain seputar pemrograman website di sini, dan dapatkan ide-ide baru

Saat kita mengikuti perkembangan pengetahuan tentang kecerdasan buatan(artificial intelligence,AI), statistik, dan data mining dalam jurnal,buku-buku dan konferensi, kita akan melihat bahwa tehnik inferensi Bayesian diterapkan untuk masalah yang semakin kompleks di sejumlah area aplikasi yang sedang berkembang. Banyak pengembang web (web developer), tidak mempunyai pemahaman yang konstruktif terhadap inferensi Bayesian dan tentunya menjadikannya tehnik ini tidak digunakan dalam aplikasi mereka. Artikel ini (yang pertama dari tiga) bertujuan untuk memperbaiki situasi tersebut.

Probabilitas bersyarat (conditional probability) adalah probabilitas dari sebuah peristiwa yang akan terjadi jika sebuah peristiwa lainnya telah terjadi (peristiwa bersyarat).

Representasi Matematis

Sebuah probabilitas bersyarat mengacu pada probabilitas dalam pengamatan suatu kejadian A dengan melihat peristiwa B yang sudah terjadi sebelumnya dapat direpresentasikan dalam notasi matematis sebagai berikut:

P(A|B)

Bayangkan bahwa A mengacu pada "pelanggan membeli produk A" dan B mengacu pada "pelanggan membeli produk B". P (A | B) kemudian akan dibaca sebagai "probabilitas bahwa pelanggan akan membeli produk A mengingat bahwa mereka telah membeli produk B." Jika A cenderung terjadi ketika B terjadi, kemudian mengetahui bahwa B telah terjadi memungkinkan Anda untuk menetapkan probabilitas yang lebih tinggi untuk terjadinya A daripada dalam situasi di mana Anda tidak tahu bahwa B terjadi.

Secara umum, jika A dan B dalam beberapa cara secara sistematis berbeda, maka P (A | B) tidak akan sama dengan P(A). Sebaliknya, jika A dan B adalah kejadian yang independen, maka P (A | B) bisa diharapkan untuk sama dengan P(A).Perlunya perhitung probabilitas bersyarat akan terjadi disaat kita berpikir terjadinya beberapa peristiwa memiliki pengaruh pada kemungkinan peristiwa lain terjadi.

Metode Set Enumeration

Metode yang paling dasar dan intuitif untuk perhitungan P (A | B) adalah metode pencacahan set(Set Enumeration). Dengan menggunakan metode ini, P (A | B) dapat dihitung dengan menghitung berapa kali A dan B terjadi bersama-sama {A & B} dan membaginya dengan jumlah berapa kali B terjadi {B} sehingga diperoleh:

P (A | B) = {A & B} / {B}

Jika Anda mengamati bahwa ada 12 pelanggan membeli produk B dan dari 12 orang tersebut,ada 10 orang yang juga membeli produk A, maka P (A | B) akan diperkirakan pada 10/12 atau 0,833. Dengan kata lain, kemungkinan pelanggan membeli produk A mengingat bahwa mereka telah membeli produk B dapat diperkirakan adalah 83 persen dengan menggunakan metode yang melibatkan data frekuensi relatif dari persitiwa A dan B yang dikumpulkan hingga saat ini.

kita dapat menghitung probabilitas bersyarat dengan menggunakan metode Set Enumeration dengan kode PHP berikut:.

<?php
/**
* Returns conditional probability of $A given $B and $Data.
* $Data is an indexed array.  Each element of the $Data array 
* consists of an A measurement and B measurment on a sample 
* item.
*/
function getConditionalProbabilty($A, $B, $Data) {
  $NumAB   = 0;
  $NumB    = 0;
  $NumData = count($Data);
  for ($i=0; $i < $NumData; $i++) {
    if (in_array($B, $Data[$i])) {
      $NumB++;
      if (in_array($A, $Data[$i])) {
        $NumAB++;
      }
    }
  }
  return $NumAB / $NumB;
}
?>

Listing 1. Menghitung Probabilitas Bersyarat Menggunakan Set Enumeration

Probabilitas Bersyarat dan SQL

Frekuensi vs Probabilitas

Penggabungan Probabilitas

Penurunan Teori Bayes

Saat ini kita akan membicarakan rumus kanonis untuk inferense Bayes. Penurunan rumus Bayes pada dasarnya mengikuti dari definisi Probabilitas bersyarat menggunakan perhitungan probabilitas, sebagai berikut

P(A | B) = P(A & B) / P(B)

Dengan menggunakan beberapa perhitungan aljabar, persamaan sebelumnya bisa ditulis kembali sebagai:

P(A & B) = P(A | B) P(B)

Persamaan di sebelah kanan dapat dituliskan juga dengan A sebagai variable syaratnya, sehingga didapat:

P(A & B) = P(B | A) P(A)

Dari kesetaraan dari rumus rumus sebelumnya, akan diperoleh:

P(A | B) P(B) = P(B | A) P(A)

Dengan menyederhanakannya diperoleh teori Bayes :

P(A | B) = P(B | A) P(A)/ P(B)

Perhatikan bahwa rumus ini untuk perhitungan Probabilitas Bersyarat adalah serupa dengan rumus aslinya, dengan pengecualian probabilitas gabungan P( A & B ) yang digunakan pada rumus sebagai pembilang digantikan dengan ekspresi yang setara yaitu P(B | A) P(A)

Menghitung Full Posterior

Contoh Kasus

Diagnosa Medis

File class Bayes.php mengimplementasikan perhitungan teorema Bayes. Pada metode getPosterior() terletak sebagian besar kode matematis yang menarik berada.

<?php
/**
* FILENAME : Bayes.php
*
* Bayes
*
* Calculates posterior probabilities for m hypotheses and n evidence 
* alternatives.  The code was inspired by a procedural TrueBasic version 
* (Bayes.tru) bundled with Grimstead and Snell's excellent online 
* textbook "Introduction to Probability".
*/
class Bayes {

  /**
  * Number of evidence alternatives (that is, number of rows).
  */
  var $m;

  /**
  * Number of hypothesis alternatives (that is, number of columns).
  */
  var $n;

  /**
  * Output labels for evidence alternatives.
  */
  var $row_labels = array();
  
  /**
  * Output labels for hypothesis alternatives.
  */  
  var $column_labels = array();

  /**
  * Vector container for prior probabilities.
  */
  var $priors = array();

  /**
  * Matrix container for likelihood of evidence e given hypothesis h.
  */
  var $likelihoods = array();

  /**
  * Matrix container for posterior probabilties.
  */
  var $posterior = array();

  /**
  * Vector container for evidence probabilties.
  */
  var $evidence = array();

  /**
  * Initialize the Bayes algorithm by setting the priors, likelihoods 
  * and dimensions of the likelihood and posterior matrices.
  */
  function Bayes($priors, $likelihoods) {
    $this->priors = $priors;
    $this->likelihoods = $likelihoods;
    $this->m = count($this->likelihoods);  // num rows
    $this->n = count($this->likelihoods[0]); // num cols
    return true;
  }
  
  /**
  * Output method for setting row labels prior to display.
  */
  function setRowLabels($row_labels) {
    $this->row_labels = $row_labels;
    return true;
  }

  /**
  * Output method for setting column labels prior to display.
  */
  function setColumnLabels($column_labels) {
    $this->column_labels = $column_labels;
    return true;
  }

  /**
  * Compute the posterior probability matrix given the priors and 
  * likelihoods.
  *
  * The first set of loops computes the denominator of the canonical 
  * Bayes equation. The probability appearing in the denominator 
  * serves a normalizing role in the computation - it ensures that 
  * posterior probabilities sum to 1.
  *
  * The second set of loops:
  *
  *   1. multiplies the prior[$h] by the likelihood[$h][$e]
  *   2. divides the result by the denominator
  *   3. assigns the result to the posterior[$e][$h] probability matrix
  */
  function getPosterior() {
    // Find probability of evidence e
    for($e=0; $e < $this->n; $e++) {
      for ($h=0; $h < $this->m; $h++) {
        $this->evidence[$e] += $this->priors[$h]
           * $this->likelihoods[$h][$e];
      }
    }
    // Find probability of hypothesis given evidence
    for($e=0; $e < $this->n; $e++) {
      for ($h=0; $h < $this->m; $h++) {
        $this->posterior[$e][$h] = $this->priors[$h
           * $this->likelihoods[$h][$e] / $this->evidence[$e];
      }
    }
    return true;
  }
  
  /**
  * Output method for displaying posterior probability matrix
  */
  function toHTML($number_format="%01.3f") {
    ?>
    <table border='1' cellpadding='5' cellspacing='0'>
      <tr>
        <td> </td>
        <?php
        for ($h=0; $h < $this->m; $h++) {
          ?>
          <td align='center'>
             <b><?php echo $this->column_labels[$h] ?></b>
          </td>
          <?php
        }
        ?>
      </tr>
      <?php
      for($e=0; $e < $this->n; $e++) {
        ?>
        <tr>
          <td><b><?php echo $this->row_labels[$e] ?></b></td>
          <?php
          for ($h=0; $h < $this->m; $h++) {
            ?>
            <td align='right'>
               <?php printf($number_format, $this->posterior[$e][$h]) ?>
            </td>
            <?php
          }
          ?>
        </tr>
        <?php
      }
      ?>
    </table>
    <?php
  }
}
?>

Listing 5. Menerapkan perhitungan dengan class bayes.php

Belum ada kesimpulan, artikelnya aja belum ditulis :p