PHP:正态分布算法

在上一篇博文中波波分享了近期学习的正态分布在生活中的实际应用,参见《一篇文章教你看懂“正态分布”》。其实正态分布不仅仅是数学的计算公式,同时随着大数据计算,在程序中也随处可见它的身影。比如我们需要开发一个购物商城,如何统计出什么年龄段喜欢看什么类型的产品等等。

正态分布的计算公式:

正态分布计算公式

正态分布计算公式

源代码:(转自:https://www.cnblogs.com/yang95/articles/5888357.html)

  1. <?php
  2. /**
  3.  * php 实现excel的normdist函数
  4.  *
  5.  * 使用方法:
  6.     $list = array(1.09,1.50,1.31,1.44);
  7.     $normdist = new normdist($list);
  8.     echo $normdist->getCdf($list[0]);
  9.  */
  10. class normdist {
  11.     public $list = array();
  12.     public $mu;
  13.     public $sigma;
  14.     public function __construct($list)
  15.     {
  16.         $this->list  = $list;
  17.         $this->mu    = $this->getMu($list); // 获取平均值
  18.         $this->sigma = $this->getSigma($list); // 获取标准偏差
  19.     }
  20.     /**
  21.      * @name 正态分布的累积概率函数
  22.      * @param string|integer $value
  23.      * @return number
  24.      */
  25.     public function getCdf($value)
  26.     {
  27.         $mu = $this->mu;
  28.         $sigma = $this->sigma;
  29.         $t = $value - $mu;
  30.         $y = 0.5 * $this->erfcc(-$t / ($sigma * sqrt(2.0)));
  31.         if ($y > 1.0) $y = 1.0;
  32.         return $y;
  33.     }
  34.     private function erfcc($x)
  35.     {
  36.         $z = abs($x);
  37.         $t = 1. / (1. + 0.5 * $z);
  38.         $r =
  39.             $t * exp(-$z*$z-1.26551223+
  40.             $t*(1.00002368+
  41.             $t*(.37409196+
  42.             $t*(.09678418+
  43.             $t*(-.18628806+
  44.             $t*(.27886807+
  45.             $t*(-1.13520398+
  46.             $t*(1.48851587+
  47.             $t*(-.82215223+
  48.             $t*.17087277)))))))));
  49.         if ($x >= 0.)
  50.             return $r;
  51.         else
  52.             return 2 - $r;
  53.     }
  54.     /**
  55.      * @name 获取平均值
  56.      * @param array $list
  57.      * @return number
  58.      */
  59.     private function getMu($list)
  60.     {
  61.         return array_sum($list) / count($list);
  62.     }
  63.     /**
  64.      * @name 获取标准差
  65.      * @param array $list
  66.      * @return number
  67.      * @beizhu 标准差  = 方差的平方根
  68.      */
  69.     private function getSigma($list)
  70.     {
  71.         $total_var = 0;
  72.         foreach ($list as $v) {
  73.             $total_var += pow( ($v - $this->getMu($list)), 2);
  74.         }
  75.         return sqrt( $total_var / (count($list) - 1 )); // 这里为什么数组元素个数要减去1
  76.     }
  77. }

现在最大的感触就是任何科学的最终研究途径都离不开数学计算,所以也希望正在上学的孩子们能够好好的学习数学。

 

你想把广告放到这里吗?

发表评论

您必须 登录 才能发表留言!