Perl や Python などの他のオープンソース言語と比較して、PHP コミュニティは数学ライブラリを開発するための強力な努力が不足しています。
この状況の理由の 1 つは、すでに成熟した数学ツールが多数存在しており、コミュニティが独自に PHP ツールを開発するのを妨げている可能性があることです。たとえば、私は S System という強力なツールに取り組みました。このツールには印象的な統計ライブラリのセットがあり、データ セットを分析するために特別に設計されており、その言語設計で 1998 年に ACM 賞を受賞しました。 S またはそのオープンソースの R が単なる exec_shell 呼び出しである場合、なぜわざわざ同じ統計計算機能を PHP に実装するのでしょうか? S システム、その ACM Award、または R の詳細については、関連参考資料を参照してください。
これは開発者のエネルギーの無駄ではないでしょうか? PHP 数学ライブラリを開発する動機が、開発者の労力を節約し、その仕事に最適なツールを使用することだった場合、PHP の現在のトピックは理にかなっています。
一方で、教育的な動機がPHP数学ライブラリの開発を促す可能性もあります。約 10% の人にとって、数学は探求する興味深い主題です。 PHP にも習熟している人にとって、PHP 数学ライブラリの開発は数学の学習プロセスを強化することができます。言い換えれば、T テストに関する章を読むだけでなく、対応する中間結果を計算できるプログラムを実装することもできます。値を取得し、それらを標準形式で表示します。
コーチングとトレーニングを通じて、PHP 数学ライブラリの開発は難しい作業ではなく、技術的および学習上の興味深い課題となる可能性があることを実証したいと考えています。この記事では、PHP 数学ライブラリの開発に使用できる一般的なアプローチを示す、SimpleLinearRegression と呼ばれる PHP 数学ライブラリの例を紹介します。まず、この SimpleLinearRegression クラスの開発の指針となったいくつかの一般原則について説明します。
指導原則
SimpleLinearRegression クラスの開発をガイドするために、6 つの一般原則を使用しました。
解析モデルごとにクラスを作成します。
逆リンクを使用してクラスを開発します。
大量のゲッターが期待されます。
中間結果を保存します。
詳細な API の設定を行います。
完璧は目標ではありません。
これらのガイドラインをそれぞれ詳しく見てみましょう。
解析モデルごとにクラスを作成します
各主要な分析テストまたはプロシージャには、テストまたはプロシージャと同じ名前の PHP クラスが必要です。このクラスには、入力関数、中間値と要約値を計算するための関数、および出力関数 (中間値と要約値にはテキストを使用します。またはグラフィックを使用します) が含まれます。画面に表示されるすべてのフォーマットを設定します)。
逆リンクを使用してクラスを開発する
数理計画法では、コーディングのターゲットは通常、分析手順 ( MultipleRegression 、 TimeSeries 、 ChiSquared など) が生成したい標準出力値です。問題解決の観点から見ると、これは、逆方向連鎖を使用して数学的な手法を開発できることを意味します。
例えば、概要出力画面には、1つ以上の概要統計結果が表示されます。これらの要約統計結果は中間統計結果の計算に依存しており、これらの中間統計結果にはさらに深い中間統計結果などが含まれる場合があります。このバックリンクベースの開発アプローチは、次の原則につながります。
多数のゲッターが期待されます
数学の授業展開のほとんどは、中間値や集計値の計算です。実際には、これは、クラスに中間値と集計値を計算するゲッター メソッドが多数含まれていても驚かないことを意味します。
中間結果の保存
中間計算結果を結果オブジェクト内に保存して、中間結果を後続の計算の入力として使用できるようにします。この原則は S 言語設計に実装されています。現在のコンテキストでは、この原則は、計算された中間値と要約結果を表すインスタンス変数を選択することによって実装されます。
詳細な API の環境設定を行う
SimpleLinearRegression クラスのメンバー関数とインスタンス変数の命名スキームを開発するときに、メンバー関数とインスタンス変数を記述するために長い名前 (getYY2 の代わりに getSumSquaredError のようなもの) を使用すると、より簡単になることがわかりました。関数の演算内容や変数の意味が分かりやすくなります。
私は短縮名を完全に放棄したわけではありません。ただし、名前の短縮形を使用する場合は、名前の意味を完全に説明するコメントを提供する方法を見つける必要があります。私の見解は次のとおりです。高度に省略された命名スキームは数学的プログラミングでは一般的ですが、特定の数学的ルーチンを理解し、正しいことを証明することが必要以上に困難になります。
完璧は目標ではありません
このコーディング演習の目標は、必ずしも PHP 用に高度に最適化された厳密な数学エンジンを開発することではありません。初期段階では、有意義な分析テストの実装方法を学び、この分野の困難な問題を解決することに重点を置く必要があります。
インスタンス変数
統計テストやプロセスをモデル化する場合、どのインスタンス変数が宣言されているかを示す必要があります。
インスタンス変数の選択は、分析プロセスによって生成される中間値と要約値を考慮して決定できます。各中間値と要約値は、変数の値をオブジェクト プロパティとして持つ、対応するインスタンス変数を持つことができます。
この分析を使用して、リスト 1 の SimpleLinearRegression クラスに対して宣言する変数を決定しました。同様の分析は、MultipleRegression、ANOVA、または TimeSeries プロシージャでも実行できます。
リスト1. SimpleLinearRegressionクラスのインスタンス変数
// 著作権 2003、Paul Meagher
// GPL に基づいて配布されます
クラス SimpleLinearRegression {
変数 $n;
var $X = 配列();
var $Y = 配列();
var $ConfInt;
var $Alpha
var $XMean
var $Y意味
var $SumXX
var $SumXY
var $SumYY
var $傾き
var $YInt;
var $PredictedY = 配列();
var $Error = 配列();
var $SquaredError = 配列();
var $TotalError
var $SumError
var $SquaredError
var $ErrorVariance
var $StdErr;
var $SlopeStdErr;
var $SlopeVal // 傾きの T 値
変数 $YIntStdErr;
var $YIntTVal // Y 切片の T 値
変数$R;
変数 $RSquared
var $DF; // 自由度
var $SlopeProb; // 傾斜推定の確率
var $YIntProb; // Y 切片推定の確率
var $AlphaTVal; // 指定されたアルファ設定の T 値
var $ConfIntOfSlope;
var $RPath = "/usr/local/bin/R" // ここにパスを入力します
;
var $format = "%01.2f" // 出力のフォーマットに使用されます
;
}
?>
コンストラクター
SimpleLinearRegression クラスのコンストラクター メソッドは、それぞれ同じ数の値を持つ X ベクトルと Y ベクトルを受け入れます。予想される Y 値のデフォルトの 95% 信頼区間を設定することもできます。
コンストラクターメソッドは、データ形式が処理に適しているかどうかを検証することから始まります。入力ベクトルが「等しいサイズ」テストと「1 より大きい値」テストに合格すると、アルゴリズムのコア部分が実行されます。
このタスクの実行には、一連のゲッター メソッドによる統計プロセスの中間値と要約値の計算が含まれます。各メソッド呼び出しの戻り値をクラスのインスタンス変数に代入します。この方法で計算結果を保存すると、連鎖計算の呼び出しルーチンで中間値と要約値を確実に利用できるようになります。リスト 2 で説明されているように、クラスの出力メソッドを呼び出してこれらの結果を表示することもできます。
リスト2. クラスの出力メソッドの呼び出し
// 著作権 2003、Paul Meagher
// GPL に基づいて配布
function SimpleLinearRegression($X, $Y, $ConfidenceInterval="95") {
$numX = カウント($X);
$numY = カウント($Y);
if ($numX != $numY) {
die("エラー: X ベクトルと Y ベクトルのサイズは同じでなければなりません。");
}
if ($numX <= 1) {
die("エラー: 入力配列のサイズは少なくとも 2 である必要があります。");
}
$this->n = $numX;
$this->X = $X;
$this->Y = $Y;
$this->ConfInt = $ConfidenceInterval;
$this->Alpha = (1 + ($this->ConfInt / 100) ) / 2;
$this->XMean = $this->getMean($this->X);
$this->YMean = $this->getMean($this->Y);
$this->SumXX = $this->getSumXX();
$this->SumYY = $this->getSumYY();
$this->SumXY = $this->getSumXY();
$this->gt;Slope = $this->getSlope();
$this->YInt = $this->getYInt();
$this->gt;PredictedY = $this->getPredictedY();
$this->gt;エラー = $this->getError();
$this->gt;SquaredError = $this->getSquaredError();
$this->SumError = $this->getSumError();
$this->TotalError = $this->getTotalError();
$this->SumSquaredError = $this->getSumSquaredError();
$this->ErrorVariance = $this->getErrorVariance();
$this->StdErr = $this->getStdErr();
$this->gt;SlopeStdErr = $this->getSlopeStdErr();
$this->YIntStdErr = $this->getYIntStdErr();
$this->gt;SlopeTVal = $this->getSlopeTVal();
$this->YIntTVal = $this->getYIntTVal();
$this->R = $this->getR();
$this->RSquared = $this->getRSquared();
$this->DF = $this->getDF();
$this->SlopeProb = $this->getStudentProb($this->SlopeTVal, $this->DF);
$this->YIntProb = $this->getStudentProb($this->YIntTVal, $this->DF);
$this->AlphaTVal = $this->getInverseStudentProb($this->Alpha, $this->DF);
$this->ConfIntOfSlope = $this->getConfIntOfSlope();
true を返します。
}
?>
メソッド名とそのシーケンスは、バックリンクと、中間値の計算方法を段階的に説明する学部生が使用する統計学の教科書への参照を組み合わせて導き出されました。計算する必要がある中間値の名前には「get」という接頭辞が付けられ、メソッド名が導出されます。
モデルをデータに適合させる
SimpleLinearRegression プロシージャは、データに適合する直線を生成するために使用されます。直線には次の標準方程式が含まれます。
y = b + mxこの方程式の PHP 形式はリスト 3 のようになります。
リスト 3. モデルをデータに適合させるための PHP 方程式
$PredictedY[$i] = $YIntercept + $Slope * $X[$i]
導出された一次方程式を使用すると、各 X 値に対応する予測 Y 値を取得できます。線形方程式がデータによく適合する場合、Y の観測値と予測値は一致する傾向があります。
相性が良いかどうかの判断方法
SimpleLinearRegression クラスは、かなりの数の集計値を生成します。重要な要約値は、線形方程式がデータにどの程度適合しているかを測定する T 統計です。一致が非常に良好な場合、T 統計量は大きくなる傾向があります。 T 統計量が小さい場合は、線形方程式を、Y 値の平均が最良の予測子であると仮定するモデルに置き換える必要があります (つまり、一連の値の平均は通常、有用な予測子です)次の観測の場合は、それをデフォルトのモデルにします)。
T 統計量が Y 値の平均を最良の予測因子として考慮しないほど十分に大きいかどうかをテストするには、T 統計量を取得するランダム確率を計算する必要があります。 T 統計を取得する確率が低い場合は、平均が最良の予測子であるという帰無仮説を棄却できるため、単純な線形モデルがデータによく適合すると確信できます。
では、T統計値の確率はどのように計算するのでしょうか?
T統計値の確率を計算する
PHP には T 統計値の確率を計算するための数学的ルーチンが欠けているため、このタスクを統計計算パッケージ R (「リソース」の www.r-project.org を参照) に任せて必要な値を取得することにしました。また、このバッグに皆さんの注目を集めたい理由は次のとおりです:
R は、PHP 開発者が PHP 数学ライブラリでエミュレートできる多くのアイデアを提供します。
R を使用すると、PHP 数学ライブラリから取得した値が、成熟した無料で利用できるオープンソース統計パッケージから取得した値と一致しているかどうかを判断できます。
リスト 4 のコードは、R に任せて値を取得することがいかに簡単であるかを示しています。
// 著作権 2003、Paul Meagher
// GPL に基づいて配布されます
クラス SimpleLinearRegression {
var $RPath = "/usr/local/bin/R" // ここにパスを入力します
;
関数 getStudentProb($T, $df) {
$確率 = 0.0;
$cmd = "エコー 'dt($T, $df)' | $this->RPath --slave";
$result = シェル_exec($cmd);
list($LineNumber, $Probability) =explode(" ", トリム($result));
$確率を返します
}
関数 getInverseStudentProb($alpha, $df) {
$InverseProbability = 0.0;
$cmd = "エコー 'qt($alpha, $df)' | $this->RPath --slave";
$result = シェル_exec($cmd);
list($LineNumber, $InverseProbability) =explode(" ", trim($result));
$InverseProbability を返します。
}
}
?>
R 実行可能ファイルへのパスが設定され、両方の関数で使用されていることに注意してください。最初の関数はスチューデントの T 分布に基づいて T 統計量に関連付けられた確率値を返し、2 番目の逆関数は指定されたアルファ設定に対応する T 統計量を計算します。 getStudentProb メソッドは線形モデルの適合性を評価するために使用され、getInverseStudentProb メソッドは中間値を返し、これを使用して各予測 Y 値の信頼区間を計算します。
スペースに限りがあるため、このクラスのすべての関数を 1 つずつ詳細に説明することは不可能です。そのため、単純な線形回帰分析に含まれる用語と手順を理解したい場合は、統計学の教科書を参照することをお勧めします。学部生が利用します。
燃費調査
このクラスの使用方法を示すために、公益事業における燃え尽き症候群の研究からのデータを使用できます。 Michael Leiter と Kimberly Ann Meechan は、疲労指数と呼ばれる燃え尽き症候群の尺度と集中力と呼ばれる独立変数の間の関係を研究しました。集中力とは、人々の職場環境から得られる社会的接触の割合を指します。
サンプル中の個人の消費指数値と濃度値の関係を調べるには、これらの値を適切な名前の配列にロードし、これらの配列値を使用してこのクラスをインスタンス化します。クラスをインスタンス化した後、クラスによって生成されたいくつかの要約値を表示して、線形モデルがデータにどの程度適合しているかを評価します。
リスト 5 は、データをロードして集計値を表示するスクリプトを示しています。
リスト 5. データをロードして集計値を表示するスクリプト
// BurnoutStudy.php
// 著作権 2003、Paul Meagher
// GPL に基づいて配布されます
「SimpleLinearRegression.php」をインクルードします。
// バーンアウト研究からデータをロードします
$濃度 = 配列(20,60,38,88,79,87,
)
$ExhaustionIndex = array(100,525,300,980,310,900,
410,296,120,501,920,810,
506,493,892,527,600,855、
に
$slr = 新しい SimpleLinearRegression($Concentration, $ExhaustionIndex);
$YInt = sprintf($slr->format, $slr->YInt);
$Slope = sprintf($slr->format, $slr->Slope);
$SlopeTVal = sprintf($slr->format, $slr->SlopeTVal);
$SlopeProb = sprintf("%01.6f", $slr->SlopeProb);
?>
<テーブルボーダー='1'セルパディング='5'>
これは、これらの結果が何を意味するのかについての大まかな説明にすぎません。このデータセットの意味を完全に調査するには、データをより詳細に調査して、これが正しい解釈であることを確認する必要があるかもしれません。次の記事では、他にどのような分析を実行する必要があるかについて説明します。
何を学びましたか?
まず、意味のある PHP ベースの数学パッケージを開発するのにロケット科学者である必要はありません。標準のオブジェクト指向技術を遵守し、バックリンクの問題解決アプローチを明示的に採用することにより、いくつかの比較的基本的な統計手順を PHP で比較的簡単に実装できます。
教えるという観点から見ると、この演習は、より高い抽象レベルとより低い抽象レベルで統計テストやルーチンについて考える必要があるという理由だけで、非常に役立つと思います。言い換えれば、統計テストや手続き型学習を補うための優れた方法は、手続きをアルゴリズムとして実装することです。
統計的テストを実装するには、通常、与えられた情報の範囲を超えて、創造的に問題を解決し、発見する必要があります。また、主題に関する知識のギャップを発見する良い方法です。
欠点としては、PHP には、ほとんどの統計テストの実装に必要なサンプリング分布のための固有の手段が欠けていることがわかります。これらの値を取得するには R に処理を行わせる必要がありますが、残念ながら R をインストールする時間や関心はありません。いくつかの一般的な確率関数のネイティブ PHP 実装は、この問題を解決できます。
もう 1 つの問題: このクラスは多くの中間値と要約値を生成しますが、要約出力は実際にはこれを利用しません。扱いにくい出力をいくつか提供しましたが、分析結果を適切に解釈できるほど十分ではなく、十分に整理されていません。実際のところ、出力メソッドをこのクラスに統合する方法がまったくわかりません。これに対処する必要があります。
最後に、データを理解するには、単に集計値を見ればよいわけではありません。また、個々のデータ ポイントがどのように分散されるかを理解する必要があります。これを行うための最良の方法の 1 つは、データをグラフ化することです。繰り返しになりますが、これについてはあまり知りませんが、このクラスを使用して実際のデータを分析したい場合は、この問題を解決する必要があります。