基于PHP实现的多元线性回归模拟曲线算法


Posted in PHP onJanuary 30, 2018

本文实例讲述了基于PHP实现的多元线性回归模拟曲线算法。分享给大家供大家参考,具体如下:

多元线性回归模型: y = b1x1 + b2x2 + b3x3 +...... +bnxn;

我们根据一组数据: 类似 arr_x = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]; arr_y = [5, 10, 15]; 我们最后要求出的是一个数组,包含了从b1 到bn;

方法:利用最小二乘法

公式:基于PHP实现的多元线性回归模拟曲线算法我们只用公式的前半部分,也就是用矩阵来计算

式中的X就是arr_x,二维数组我们可以把它看成是一个矩阵,式中的y就是arr_y,也把它看成一个矩阵(5, 10, 15) ,不过应该是竖着写的。

然后可以根据公式我们会发现要用到矩阵的相乘,转置,求逆;所以下面的代码一一给出:

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;
}

最后的getParams()方法就是最后求b参数数组的方法,传入一个二维数组arr_x, 和一个一维数组arr_y就可以了。

这一般用于大数据分析,根据大数据来模拟和预测下面的发展和走势。

PHP 相关文章推荐
汉字转化为拼音(php版)
Oct 09 PHP
MySQL修改密码方法总结
Mar 25 PHP
php之对抗Web扫描器的脚本技巧
Oct 01 PHP
关于crontab的使用详解
Jun 24 PHP
ThinkPHP模板替换与系统常量及应用实例教程
Aug 22 PHP
PHP实现图片裁剪、添加水印效果代码
Oct 01 PHP
php修改上传图片尺寸的方法
Apr 14 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
Dec 15 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
Jun 21 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
Laravel5.5以下版本中如何自定义日志行为详解
Aug 01 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
May 09 PHP
PHP 记录访客的浏览信息方法
Jan 29 #PHP
laravel ORM 只开启created_at的几种方法总结
Jan 29 #PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
Jan 29 #PHP
PHP 使用二进制保存用户状态的实例
Jan 29 #PHP
thinkphp3.2.0 setInc方法 源码全面解析
Jan 29 #PHP
Ubuntu上安装yaf扩展的方法
Jan 29 #PHP
PHP实现的防止跨站和xss攻击代码【来自阿里云】
Jan 29 #PHP
You might like
PHP 中执行系统外部命令
2006/10/09 PHP
php生成缩略图的类代码
2008/10/02 PHP
PHP下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
2011/09/19 PHP
如何使用php绘制在图片上的正余弦曲线
2013/06/08 PHP
PHP json_encode() 函数详解及中文乱码问题
2015/11/05 PHP
php正则修正符用法实例详解
2016/12/29 PHP
深入浅析PHP的session反序列化漏洞问题
2017/06/15 PHP
Prototype Hash对象 学习
2009/07/19 Javascript
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件
2011/12/21 Javascript
javascript中interval与setTimeOut的区别示例介绍
2014/03/14 Javascript
nodejs通过phantomjs实现下载网页
2015/05/04 NodeJs
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
2016/05/05 Javascript
jQuery Mobile中的button按钮组件基础使用教程
2016/05/23 Javascript
angular2倒计时组件使用详解
2017/01/12 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
jQuery日期范围选择器附源码下载
2017/05/23 jQuery
Angularjs按需查询实例代码
2017/10/30 Javascript
JavaScript同源策略和跨域访问实例详解
2018/04/03 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
JS实现点击按钮可实现编辑功能
2018/07/03 Javascript
Vue表单控件绑定图文详解
2019/02/11 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
WEB前端性能优化的7大手段详解
2020/02/04 Javascript
pydev使用wxpython找不到路径的解决方法
2013/02/10 Python
python dict.get()和dict['key']的区别详解
2016/06/30 Python
完美解决python遍历删除字典里值为空的元素报错问题
2016/09/11 Python
python fabric实现远程部署
2017/01/05 Python
在Pandas中处理NaN值的方法
2019/06/25 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
EJB3.1都有哪些改进
2012/11/17 面试题
社区工作感言
2014/02/21 职场文书
初中班主任教育随笔
2015/08/15 职场文书
CentOS安装Nginx并部署vue
2022/04/12 Servers
Java Spring Boot 正确读取配置文件中的属性的值
2022/04/20 Java/Android