/**
* Creates a correlation matrix from a given data matrix.
*
* @see http://lib.stat.cmu.edu/multi/pca.c
*
* @author Paul Meagher
* @version 0.2
* @modified Mar 23, 2008
*/
class CorrelationMatrix {
private $eps = 0.005;
public $nrows = 0;
public $ncols = 0;
public $means = array();
public $stddevs = array();
public $cormat = array();
function CorrelationMatrix($data) {
// num rows
$this->nrows = count($data);
// num cols
$this->ncols = count($data[0]);
// Determine mean of column vectors of input data matrix
for ($j=0; $j < $this->ncols; $j++) {
$this->means[$j] = 0.0;
for($i=0; $i < $this->nrows; $i++)
$this->means[$j] += $data[$i][$j];
$this->means[$j] /= $this->nrows;
}
// Determine standard deviations of column vectors of data matrix.
for ($j=0; $j < $this->ncols; $j++) {
$this->stddevs[$j] = 0.0;
for ($i=0; $i < $this->nrows; $i++)
$this->stddevs[$j] += (($data[$i][$j]-$this->means[$j])*($data[$i][$j]-$this->means[$j]));
$this->stddevs[$j] /= $this->nrows;
$this->stddevs[$j] = sqrt($this->stddevs[$j]);
// The following in an inelegant but usual way to handle
// near-zero stddev values, which would cause a zero-
// divide error.
if ($this->stddevs[$j] <= $this->eps)
$this->stddevs[$j] = 1.0;
}
// Center and reduce the column vectors.
for ($i=0; $i < $this->nrows; $i++) {
for ($j=0; $j < $this->ncols; $j++) {
$data[$i][$j] -= $this->means[$j];
$x = sqrt($this->nrows);
$x *= $this->stddevs[$j];
$data[$i][$j] /= $x;
}
}
// Calculate the m * m correlation matrix.
for ($j1=0; $j1 < $this->ncols-1; $j1++) {
$this->cormat[$j1][$j1] = 1.0;
for ($j2=$j1+1; $j2 < $this->ncols; $j2++) {
$this->cormat[$j1][$j2] = 0.0;
for ($i=0; $i < $this->nrows; $i++)
$this->cormat[$j1][$j2] += ( $data[$i][$j1] * $data[$i][$j2]);
$this->cormat[$j2][$j1] = $this->cormat[$j1][$j2];
}
}
$this->cormat[$this->ncols-1][$this->ncols-1] = 1.0;
}
function printMeans() {
printf("Column Means:
");
for ($j=0; $j < $this->ncols; $j++)
printf("%7.2f", $this->means[$j]);
printf("
");
}
function printStdDevs() {
printf("Column Standard Deviations:
");
for ($j=0; $j < $this->ncols; $j++)
printf("%7.2f", $this->stddevs[$j]);
printf("
");
}
function printCorMat() {
printf("Correlation Matrix:
");
for ($i=0; $i < $this->ncols; $i++) {
for ($j=0; $j < $this->ncols; $j++)
//echo $this->cormat[$i][$j]." ";
printf("%7.4f", $this->cormat[$i][$j]);
printf("
");
}
}
}
動作デモ
include "CorrelationMatrix.php"; $data[0] = array(1, 2, 3); $data[1] = array(2, 3, 4); $data[2] = array(3, 4, 5); $data[3] = array(4, 6, 8); $data[4] = array(5, 8, 10); $cm = new CorrelationMatrix($data); print ""; $cm->printMeans(); print "";
"; $cm->printStdDevs(); print "
"; $cm->printCorMat(); print "
"; print_r ( $cm->cormat ) ; print "
デモ出力
Column Means:
3.00 4.60 6.00
Column Standard Deviations:
1.41 2.15 2.61
Correlation Matrix:
1.0000 0.9848 0.9762
0.9848 1.0000 0.9970
0.9762 0.9970 1.0000
Array
(
[0] => Array
(
[0] => 1
[1] => 0.98479824644792
[2] => 0.97618706018395
)
[1] => Array
(
[0] => 0.98479824644792
[1] => 1
[2] => 0.9969527608178
)
[2] => Array
(
[0] => 0.97618706018395
[1] => 0.9969527608178
[2] => 1
)
)
10行目の、$cm = new CorrelationMatrix($data); の配列に結果数値が入って帰ってくる。
0 件のコメント:
コメントを投稿