Maison  >  Article  >  développement back-end  >  Algorithme de courbe de simulation de régression linéaire multiple basé sur les compétences PHP PHP

Algorithme de courbe de simulation de régression linéaire multiple basé sur les compétences PHP PHP

jacklove
jackloveoriginal
2018-06-28 17:45:401879parcourir

Cet article présente principalement l'algorithme de courbe de simulation de régression linéaire multiple basé sur PHP. Il analyse les principes de l'algorithme de courbe de simulation de régression linéaire multiple et les compétences d'implémentation PHP associées sur la base d'exemples spécifiques. Les amis dans le besoin peuvent s'y référer

L'exemple de cet article décrit l'algorithme de courbe de simulation de régression linéaire multiple basé sur PHP. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Modèle de régression linéaire multiple : y = b1x1 + b2x2 + b3x3 +... +bnxn;

Nous nous basons sur un ensemble de données : similaire à arr_x = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14 , 15]]; arr_y = [5, 10, 15]; Ce que nous voulons finalement trouver, c'est un tableau de b1 à bn;

Méthode : Utiliser la méthode des moindres carrés

Formule :Nous utilisons uniquement la première moitié de la formule, c'est-à-dire qu'en utilisant la matrice pour calculer

X dans la formule est arr_x Nous pouvons considérer le tableau bidimensionnel comme une matrice, et y dans la formule est arr_y, c'est-à-dire Considérez-le comme une matrice (5, 10, 15), mais il doit être écrit verticalement.

Ensuite, d'après la formule, nous constaterons que nous devons utiliser la multiplication, la transposition et l'inversion matricielles ; les codes suivants sont donc donnés un par un :

public function get_complement($data, $i, $j) {
  /* x和y为矩阵data的行数和列数 */
  $x = count($data);
  $y = count($data[0]);
  /* data2为所求剩余矩阵 */
  $data2 =[];
  for ($k = 0; $k < $x -1; $k++) {
    if ($k < $i) {
      for ($kk = 0; $kk < $y -1; $kk++) {
        if ($kk < $j) {
          $data2[$k][$kk] = $data[$k][$kk];
        } else {
          $data2[$k][$kk] = $data[$k][$kk +1];
        }
      }
    } else {
      for ($kk = 0; $kk < $y -1; $kk++) {
        if ($kk < $j) {
          $data2[$k][$kk] = $data[$k +1][$kk];
        } else {
          $data2[$k][$kk] = $data[$k +1][$kk +1];
        }
      }
    }
  }
  return $data2;
}
/* 计算矩阵行列式 */
public function cal_det($data) {
  $ans = 0;
  if (count($data[0]) === 2) {
    $ans = $data[0][0] * $data[1][1] - $data[0][1] * $data[1][0];
  } else {
    for ($i = 0; $i < count($data[0]); $i++) {
      $data_temp = $this->get_complement($data, 0, $i);
      if ($i % 2 === 0) {
        $ans = $ans + $data[0][$i] * ($this->cal_det($data_temp));
      } else {
        $ans = $ans - $data[0][$i] * ($this->cal_det($data_temp));
      }
    }
  }
  return $ans;
}
/*计算矩阵的伴随矩阵*/
public function ajoint($data) {
  $m = count($data);
  $n = count($data[0]);
  $data2 =[];
  for ($i = 0; $i < $m; $i++) {
    for ($j = 0; $j < $n; $j++) {
      if (($i + $j) % 2 === 0) {
        $data2[$i][$j] = $this->cal_det($this->get_complement($data, $i, $j));
      } else {
        $data2[$i][$j] = - $this->cal_det($this->get_complement($data, $i, $j));
      }
    }
  }
  return $this->trans($data2);
}
/*转置矩阵*/
public function trans($data) {
  $i = count($data);
  $j = count($data[0]);
  $data2 =[];
  for ($k2 = 0; $k2 < $j; $k2++) {
    for ($k1 = 0; $k1 < $i; $k1++) {
      $data2[$k2][$k1] = $data[$k1][$k2];
    }
  }
  /*将矩阵转置便可得到伴随矩阵*/
  return $data2;
}
/*求矩阵的逆,输入参数为原矩阵*/
public function inv($data) {
  $m = count($data);
  $n = count($data[0]);
  $data2 =[];
  $det_val = $this->cal_det($data);
  $data2 = $this->ajoint($data);
  for ($i = 0; $i < $m; $i++) {
    for ($j = 0; $j < $n; $j++) {
      $data2[$i][$j] = $data2[$i][$j] / $det_val;
    }
  }
  return $data2;
}
/*求两矩阵的乘积*/
public function getProduct($data1, $data2) {
  /*$data1 为左乘矩阵*/
  $m1 = count($data1);
  $n1 = count($data1[0]);
  $m2 = count($data2);
  $n2 = count($data2[0]);
  $data_new =[];
  if ($n1 !== $m2) {
    return false;
  } else {
    for ($i = 0; $i <= $m1 -1; $i++) {
      for ($k = 0; $k <= $n2 -1; $k++) {
        $data_new[$i][$k] = 0;
        for ($j = 0; $j <= $n1 -1; $j++) {
          $data_new[$i][$k] += $data1[$i][$j] * $data2[$j][$k];
        }
      }
    }
  }
  return $data_new;
}
/*多元线性方程*/
public function getParams($arr_x, $arr_y) {
  $final =[];
  $arr_x_t = $this->trans($arr_x);
  $result = $this->getProduct($this->getProduct($this->inv($this->getProduct($arr_x_t, $arr_x)), $arr_x_t), $arr_y);
  foreach ($result as $key => $val) {
    foreach ($val as $_k => $_v) {
      $final[] = $_v;
    }
  }
  return $final;
}

La méthode finale getParams() est la méthode finale pour trouver le tableau de paramètres b. Il suffit de passer un tableau bidimensionnel arr_x et un tableau unidimensionnel arr_y.

Ceci est généralement utilisé pour l'analyse du Big Data afin de simuler et de prédire les développements et tendances suivants sur la base du Big Data.

PS : Voici deux outils de courbe de simulation associés recommandés pour votre référence :

Courbe polynomiale en ligne et fonction Courbe outils d'ajustement :
http://tools.jb51.net/jisuanqi/create_fun

Outils graphiques de courbes polynomiales/fonctions de dessin en ligne :
http://tools.jb51.net/jisuanqi/fun_draw

Articles qui pourraient vous intéresser :

PHP Liste doublement chaînée définition et exemples d'utilisation Compétences PHP

PHP utilise foreach pour convertir comme par magie des tableaux (explication avec exemples) Exemples PHP

Solution au rapport d'erreurs lors de l'accès aux éléments du tableau dans PHP guillemets doubles Conseils PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn