ホームページ php教程 php手册 PHP实现简单线性回归之数据研究工具

PHP实现简单线性回归之数据研究工具

Jun 13, 2016 am 10:33 AM
php 戻る 基本 成し遂げる 道具 モデリング データ コンセプト 目標 研究 単純 線形 戻る

概念

  简单线性回归建模背后的基本目标是从成对的 X值和 Y值(即 XY测量值)组成的二维平面中找到最吻合的直线。一旦用 最小方差法找到这条直线,就可以执行各种统计测试,以确定这条直线与观测到的 Y值的偏离量吻合程度。

  线性方程( y = mx + b)有两个参数必须根据所提供的 XY数据估算出来,它们是斜率( m)和 y 轴截距( b)。一旦估算出这两个参数,就可以将观测值输入线性方程,并观察方程所生成的 Y预测值。

  要使用最小方差法估算出 mb参数,就要找到 m 和 b 的估计值,使它们对于所有的 X值得到的 Y值的观测值和预测值最小。观测值和预测值之差称为误差( y i- (mx i+ b) ),并且,如果对每个误差值都求平方,然后求这些残差的和,其结果是一个被称为 预测平方差的数。使用最小方差法来确定最吻合的直线涉及寻找使预测方差最小的 mb的估计值。

  可以用两种基本方法来找到满足最小方差法的估计值 mb。第一种方法,可以使用数值搜索过程设定不同的 mb值并对它们求值,最终决定产生最小方差的估计值。第二种方法是使用微积分找到用于估算 mb 的方程。我不打算深入讨论推导出这些方程所涉及的微积分,但我确实在 SimpleLinearRegression 类中使用了这些分析方程,以找到 mb 的最小平方估计值(请参阅 SimpleLinearRegression 类中的 getSlope() 和 getYIntercept 方法)。

  即使拥有了可以用来找到 mb的最小平方估计值的方程,也并不意味着只要将这些参数代入线性方程,其结果就是一条与数据良好吻合的直线。这个简单线性回归过程中的下一步是确定其余的预测方差是否可以接受。

  可以使用统计决策过程来否决“直线与数据吻合”这个备择假设。这个过程基于对 T 统计值的计算,使用概率函数求得随机大的观测值的概率。正如第 1 部分所提到的, SimpleLinearRegression 类生成了为数众多的汇总值,其中一个重要的汇总值是 T 统计值,它可以用来衡量线性方程与数据的吻合程度。如果吻合良好,则 T 统计值往往是一个较大的值;如果 T 值很小,就应该用一个缺省模型代替您的线性方程,该模型假定 Y值的平均值是最佳预测值(因为一组值的平均值通常可以是下一个观测值的有用的预测值)。

  要测试 T 统计值是否大到可以不用 Y值的平均值作为最佳预测值,需要计算随机获得 T 统计值的概率。如果概率很低,那就可以不采用平均值是最佳预测值这一无效假设,并且相应地可以确信简单线性模型是与数据良好吻合的。(有关计算 T 统计值概率的更多信息,请参阅第 1 部分。)

  回过头讨论统计决策过程。它告诉您何时不采用无效假设,却没有告诉您是否接受备择假设。在研究环境中,需要通过理论参数和统计参数来建立线性模型备择假设。

  您将构建的数据研究工具实现了用于线性模型(T 测试)的统计决策过程,并提供了可以用来构造理论和统计参数的汇总数据,这些参数是建立线性模型所需要的。数据研究工具可以归类为决策支持工具,供知识工作者在中小规模的数据集中研究模式。

  从学习的角度来看,简单线性回归建模值得研究,因为它是理解更高级形式的统计建模的必由之路。例如,简单线性回归中的许多核心概念为理解多次回归(Multiple Regression)、要素分析(Factor Analysis)和时间序列(Time Series)等建立了良好的基础。

  简单线性回归还是一种多用途的建模技术。通过转换原始数据(通常用对数或幂转换),可以用它来为曲线数据建模。这些转换可以使数据线性化,这样就可以使用简单线性回归来为数据建模。所生成的线性模型将被表示为与被转换值相关的线性公式。

  概率函数

  在前一篇文章中,我通过交由 R 来求得概率值,从而避开了用 PHP 实现概率函数的问题。我对这个解决方案并非完全满意,因此我开始研究这个问题:开发基于 PHP 的概率函数需要些什么。

  我开始上网查找信息和代码。一个两者兼有的来源是书籍 Numerical Recipes in C 中的概率函数。我用 PHP 重新实现了一些概率函数代码( gammln.c 和 betai.c 函数),但我对结果还是不满意。与其它一些实现相比,其代码似乎多了些。此外,我还需要反概率函数。

  幸运的是,我偶然发现了 John Pezzullo 的 Interactive Statistical Calculation。John 关于 概率分布函数的网站上有我需要的所有函数,为便于学习,这些函数已用 JavaScript 实现。

  我将 Student T 和 Fisher F 函数移植到了 PHP。我对 API 作了一点改动,以便符合 Java 命名风格,并将所有函数嵌入到名为 Distribution 的类中。该实现的一个很棒的功能是 doCommonMath 方法,这个库中的所有函数都重用了它。我没有花费力气去实现的其它测试(正态测试和卡方测试)也都使用 doCommonMath 方法。

  这次移植的另一个方面也值得注意。通过使用 JavaScript,用户可以将动态确定的值赋给实例变量,譬如:

            var PiD2 = pi() / 2
            
ログイン後にコピー

  在 PHP 中不能这样做。只能把简单的常量值赋给实例变量。希望在 PHP5 中会解决这个缺陷。

  请注意 清单 1中的代码并未定义实例变量 — 这是因为在 JavaScript 版本中,它们是动态赋予的值。

  清单 1. 实现概率函数

            <?php
            // Distribution.php
            // Copyright John Pezullo
            // Released under same terms as PHP.
            // PHP Port and OOfying by Paul Meagher
            class Distribution {
            function doCommonMath($q, $i, $j, $b) {
            $zz = 1;
            $z  = $zz;
            $k  = $i;
            while($k <= $j) {
            $zz = $zz * $q * $k / ($k - $b);
            $z  = $z + $zz;
            $k  = $k + 2;
            }
            return $z;
            }
            function getStudentT($t, $df) {
            $t  = abs($t);
            $w  = $t  / sqrt($df);
            $th = atan($w);
            if ($df == 1) {
            return 1 - $th / (pi() / 2);
            }
            $sth = sin($th);
            $cth = cos($th);
            if( ($df % 2) ==1 ) {
            return
            1 - ($th + $sth * $cth * $this->doCommonMath($cth * $cth, 2, $df - 3, -1))
            / (pi()/2);
            } else {
            return 1 - $sth * $this->doCommonMath($cth * $cth, 1, $df - 3, -1);
            }
            }
            function getInverseStudentT($p, $df) {
            $v =  0.5;
            $dv = 0.5;
            $t  = 0;
            while($dv > 1e-6) {
            $t = (1 / $v) - 1;
            $dv = $dv / 2;
            if ( $this->getStudentT($t, $df) > $p) {
            $v = $v - $dv;
            } else {
            $v = $v + $dv;
            }
            }
            return $t;
            }
            function getFisherF($f, $n1, $n2) {
            // implemented but not shown
            }
            function getInverseFisherF($p, $n1, $n2) {
            // implemented but not shown
            }
            }
            ?>
            
ログイン後にコピー
 输出方法

  既然您已经用 PHP 实现了概率函数,那么开发基于 PHP 的数据研究工具剩下的唯一难题就是设计用于显示分析结果的方法。

  简单的解决方案是根据需要将所有实例变量的值都显示到屏幕上。在第一篇文章中,当显示燃耗研究(Burnout Study)的线性方程、 T值和 T 概率时,我就是这么做的。能根据特定目的而访问特定值是很有帮助的, SimpleLinearRegression 支持此类用法。

  然而,另一种用于输出结果的方法是将输出的各部分系统化地进行分组。如果研究用于回归分析的主要统计软件包的输出,就会发现它们往往是用同样的方式对输出进行分组的。它们往往有 摘要表(Summary Table)偏离值分析(Analysis Of Variance)表、 参数估计值(Parameter Estimate)表和 R 值(R Value)。类似地,我创建了一些输出方法,名称如下:
  • showSummaryTable()
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

Giteeページ静的なWebサイトの展開に失敗しました:単一のファイル404エラーをトラブルシューティングと解決する方法 Giteeページ静的なWebサイトの展開に失敗しました:単一のファイル404エラーをトラブルシューティングと解決する方法 Apr 04, 2025 pm 11:54 PM

GiteEpages静的Webサイトの展開が失敗しました:404エラーのトラブルシューティングと解像度Giteeを使用する

Avue-Crudの行編集モードでセルのOnblurイベントを手動でトリガーする方法は? Avue-Crudの行編集モードでセルのOnblurイベントを手動でトリガーする方法は? Apr 04, 2025 pm 02:00 PM

AvueコンポーネントライブラリでAvue-Crudの行編集を実装するOnblurイベントは、Avue-Crudコンポーネントを手動でトリガーします。便利なインライン編集機能を提供しますが、時にはする必要があります...

一致式(PHP 8)とそれがスイッチとどのように異なるかを説明します。 一致式(PHP 8)とそれがスイッチとどのように異なるかを説明します。 Apr 06, 2025 am 12:03 AM

PHP8では、一致式は、式の値に基づいて異なる結果を返す新しい制御構造です。 1)Switchステートメントに似ていますが、実行ステートメントブロックの代わりに値を返します。 2)一致式の式は厳密に比較され、セキュリティが向上します。 3)スイッチステートメントの脱落の可能性を回避し、コードのシンプルさと読みやすさを向上させます。

AIツールを使用して、React Viteプロジェクトでフォアグラウンドページをすばやく構築するにはどうすればよいですか? AIツールを使用して、React Viteプロジェクトでフォアグラウンドページをすばやく構築するにはどうすればよいですか? Apr 04, 2025 pm 01:45 PM

バックエンド開発でフロントエンドページをすばやく構築する方法は? 3年または4年の経験を持つバックエンド開発者として、彼は基本的なJavaScript、CSS、HTMLを習得しました...

PHP関数引数と配列の開梱で...(SPLAT)演算子の目的と使用について説明してください。 PHP関数引数と配列の開梱で...(SPLAT)演算子の目的と使用について説明してください。 Apr 06, 2025 am 12:07 AM

PHPの...(SPLAT)演算子は、機能パラメーターと配列を開梱するために使用され、コードのシンプルさと効率を向上させます。 1)関数パラメーター解放:アレイ要素をパラメーターとして関数に渡します。 2)配列の開梱:アレイを別の配列または関数パラメーターに解除します。

Chrome DevtoolsでリクエストされたCookieを効果的に変更および再生する方法は? Chrome DevtoolsでリクエストされたCookieを効果的に変更および再生する方法は? Apr 04, 2025 pm 05:48 PM

Chromeを使用してChromedevtoolsでリクエストされたCookieを効果的に変更および再生する方法...

NPMの代わりにPNPMでReactアプリケーションを作成する方法は? NPMの代わりにPNPMでReactアプリケーションを作成する方法は? Apr 04, 2025 pm 06:45 PM

NPMの代わりにPNPMを使用して、NPXを使用してReactアプリケーションを作成することについて...

See all articles