3

I'm making a program that will predict the next year's collection from the database using php-ml.

and I'm getting this error.

Phpml\Exception\MatrixException Message: Matrix is singular

Im using this functions

use Phpml\Regression\LeastSquares;

use \Phpml\Math\Matrix;

use \Phpml\Math\Set;

newbie here.

Regression_controller

public function index()
{
    $this->load->model("regression_model") ;
    $array = $this->regression_model->display_data();
    $targets = $this->regression_model->display_data2();

    $matrix = new Matrix($array);
    $set = new Set($targets);

    $arraytrix = $matrix->toArray(); 
    $arrayset = $set->toArray();

    $col[] = array_column($arraytrix, 'year');
    $col2[] = array_column($arrayset, 'total');

    var_dump($col);
    var_dump($col2);

    $regression = new LeastSquares();
    $regression->train($col, $col2);

    $predicted = $regression->predict([2018]);

    var_dump($predicted);

    $this->load->view('regression');

}

Regression_model

function display_data()
{
    $query1 = $this->db->query("SELECT year from total_year");
    return $query1->result_array();

}
function display_data2()
{
    $query1 = $this->db->query("SELECT total from total_year");
    return $query1->result_array();
}
neubert
  • 15,947
  • 24
  • 120
  • 212
stephoroi
  • 31
  • 2

2 Answers2

2

The problem arises when all the values of a dataset attribute are similar in all records.

$samples = [ [1000,3,145], [1000,5,135], [1000,4,143], [1000,3,123]];

$targets = [ 4, 1, 3, 2];

$regression->train($samples, $targets);

In the above sample, the first values of all records ar equal to 1000. Therefore, when $regression->train($samples, $targets) is executed it sees attribute count of $sample is 2 instead of 3, which creates a mismatch between array dimension which is 3 x 4 not 2 x 4.

Tharindu Sathischandra
  • 1,654
  • 1
  • 15
  • 37
0

I also had this problem but I was able to solve it. Make sure that you don't have the following:

  • less than two data
  • wrong format

Less Than Two Data. Upon trial and error, I've found out that it needs at least 2 data.

Wrong Format. Make sure to follow the proper formatting of the target and sample (see the documentation).

$samples = [[60], [61], [62], [63], [65]];
$targets = [3.1, 3.6, 3.8, 4, 4.1];

$regression = new LeastSquares();
$regression->train($samples, $targets);

As you can see in $samples, it's an array of arrays. So, make sure that each value in your array is an array itself.

Lynnell Neri
  • 473
  • 1
  • 9
  • 21