Login   Register  
PHP Classes
elePHPant
Icontem

File: examples-2.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Pier-André Bouchard St-Amant  >  Matrix new  >  examples-2.php  >  Download  
File: examples-2.php
Role: Example script
Content type: text/plain
Description: More advanced examples.
Class: Matrix new
Perform operations to manipulate matrices
Author: By
Last change:
Date: 2009-12-28 11:05
Size: 6,151 bytes
 

Contents

Class file image Download
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="fr" style="position: static; "><head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Examples with matrix class</title>
</head>
<body>
This line is simple HTML you should be able to read this, no matter if you have PHP or not on your server.<br><br>

<?php
include_once("/Users/pabsta/Desktop/matrix/matrix.php");
?>
<ol>
<li>The simplest example is to solve a system of linear equations : <br>
<table>
<tr><td>x_1</td><td>+</td><td>3 x_2</td><td>+</td><td>5 x_3</td><td>=</td><td>1</td></tr>
<tr><td>3x_1</td><td>+</td><td>5 x_2</td><td>+</td><td>11 x_3</td><td>=</td><td>2</td></tr>
<tr><td>5x_1</td><td>+</td><td>11 x_2</td><td>+</td><td>9 x_3</td><td>=</td><td>3</td></tr>
</table><br>
Which translates into the following matricial system : <br>
<table>
<tr><td>
<table>
<tr align="center"><td>1</td><td>3</td><td>5</td><td></tr>
<tr align="center"><td>3</td><td>5</td><td>11</td><td></tr>
<tr align="center"><td>5</td><td>11</td><td>9</td><td></tr>
</table>
</td>
<td>
<table><tr><td>x_1</td></tr><tr><td>x_2</td></tr><tr><td>x_3</td></tr></table>
</td>
<td>=</td>
<td><table><tr><td>1</td></tr><tr><td>2</td></tr><tr><td>3</td></tr></table></td>
</tr>
</table>
Or : 
<table>
<tr><td>A</td><td>x</td><td>=</td><td>b</td></tr>
</table><br>
The solution is obviously to inverse the A matrix : 
<table>
<tr><td>x</td><td>=</td><td>A^(-1)b</td></tr>
</table><br>
We can do this using this class :<br>
<code>
$A = new matrix(array(array(1,3,5), array(3,5,11), array(5,11,9)));<br>
$b = new matrix(array(array(1), array(2), array(3)));<br>
$A_inv = $A->inv();<br>
$sol = $A_inv->times($b);<br>
$sol->print_matrix();<br>
</code><br>
Which yields the following solution : 
<?php
$A 
= new matrix(array(array(1,3,5), array(3,5,11), array(5,11,9)));
$b = new matrix(array(array(1), array(2), array(3)));
$A_inv $A->inv();
$sol $A_inv->times($b);
$sol->print_matrix();
?><br>
<li>We can also perform a regression : <br>
Let X be the following matrix of data : <br>
<table>
<tr align="center"><td>1</td><td>0.21</td><td>10</td></tr>
<tr align="center"><td>1</td><td>0.35</td><td>11</td></tr>
<tr align="center"><td>1</td><td>0.45</td><td>12</td></tr>
<tr align="center"><td>1</td><td>0.52</td><td>13</td></tr>
<tr align="center"><td>1</td><td>0.63</td><td>14</td></tr>
<tr align="center"><td>1</td><td>0.79</td><td>15</td></tr>
</table><br>
(Note that the matrix X is almost colinear)<br>
<table>
<tr align="center"><td>103.20</td></tr>
<tr align="center"><td>113.30</td></tr>
<tr align="center"><td>123.40</td></tr>
<tr align="center"><td>133.50</td></tr>
<tr align="center"><td>143.60</td></tr>
<tr align="center"><td>153.70</td></tr>
</table><br>
The model is then y = b_1 * 1 + b_2 * x_2 + b_3*x_3 + e, or y = Xb + e and the minimised norm of e is given by : b = (X*X)^(-1)*X'y. This can be done with the following code : <br>
<code>
$arr = array(array(1,0.21, 10), array(1,0.35, 11), array(1,0.45, 12), array(1,0.52, 13), array(1,0.63, 14), array(1,0.79, 15));<br>
$X = new matrix($arr);<br>
$arr = array(array(103.20), array(113.30), array(123.40), array(133.50), array(143.60), array(153.70));<br>
$y = new matrix($arr);<br>
$X_p = $X->prime();<br>
$XX = $X_p->times($X);<br>
$XX_inv = $XX->inv();<br>
$X_py = $X_p->times($y);<br>
$b = $XX_inv->times($X_py); <br>
$b->print_matrix();<br>
</code>
<?php
$arr 
= array(array(1,0.2110), array(1,0.3511), array(1,0.4512), array(1,0.5213), array(1,0.6314), array(1,0.7915));
$X = new matrix($arr);
$arr = array(array(103.20), array(113.30), array(123.40), array(133.50), array(143.60), array(153.70));
$y = new matrix($arr);
$X_p $X->prime();
$XX $X_p->times($X);
$XX_inv $XX->inv();
$X_py $X_p->times($y);
$b $XX_inv->times($X_py);
$b->print_matrix();
?><br>
The predicted values of y and e, the variance of the error terms and the covariance matrix can then be found with : <br>
<code>
$y_hat = $X->times($b);<br>
$e_hat = $y->minus($y_hat);<br>
$e_hat_p = $e_hat->prime();<br>
$sigma2 = $e_hat_p->times($e_hat);<br>
$sigma2 = $sigma2->s_times(1/($X->get_num_rows() - $X->get_num_columns()));<br>
$cov = $XX_inv->s_times($sigma2->get_value(1,1));<br>
$cov->print_matrix();<br>
</code><br>
<?php
$y_hat 
$X->times($b);
$e_hat $y->minus($y_hat);
$e_hat_p $e_hat->prime();
$sigma2 $e_hat_p->times($e_hat);
$sigma2 $sigma2->s_times(1/($X->get_num_rows() - $X->get_num_columns()));
$cov $XX_inv->s_times($sigma2->get_value(1,1));
$cov->print_matrix();
?><br>
</li>
<li>We can also perform some fixed point algorithms. Let X be the following Markov transition matrix :<br>
<table>
<tr align="center"><td>0.6</td><td>0.4</td><td>0.0</td></tr>
<tr align="center"><td>0.2</td><td>0.1</td><td>0.7</td></tr>
<tr align="center"><td>0.1</td><td>0.3</td><td>0.6</td></tr>
</table><br>
One can then find the limiting probability distribution by iterating until convergence : <br>
<code>
$arr = array(array(0.6, 0.4, 0), array(0.2, 0.1, 0.7), array(0.1, 0.3, 0.6));<br>
$X = new matrix($arr);<br>
$power = $X;<br>
$tolerance = 0.000001;<br>
$check = 10;<br>
$iter = 0;<br><br>
while($check > $tolerance)<br>
{<br>
    $last_max = $max;<br>
    $power = $power->times($X);<br><br>
    
    $max = $power->mat_max();<br>
    $max = $max->prime();<br>
    $max = $max->mat_max();<br>
    $max = $max->get_value(1,1);<br>
    $check = abs($max - $last_max);<br><br>
    $iter++;<br><br>
 
}<br>
$power->print_matrix();
echo "Number of iterations : $iter";<br>
</code><br><br>
<?php
$arr 
= array(array(0.60.40), array(0.20.10.7), array(0.10.30.6));
$X = new matrix($arr);
$power $X;
$tolerance 0.000001;
$check 10;
$iter 0

while(
$check $tolerance)
{
    
$last_max $max;
    
$power $power->times($X);
    
    
$max $power->mat_max();
    
$max $max->prime();
    
$max $max->mat_max();
    
$max $max->get_value(1,1);
    
$check abs($max $last_max);
    
$iter++;
 
}
$power->print_matrix();
echo 
"Number of iterations : $iter<br><br>";
?>
</li>
</ol>

</body></html>