この 2 部構成シリーズのパート 1 (「PHP における単純線形回帰」) では、数学ライブラリが PHP に役立つ理由を説明しました。また、実装言語として PHP を使用して、単純な線形回帰アルゴリズムのコア部分を開発および実装する方法も示しました。
この記事の目的は、パート 1 で説明した SimpleLinearRegression クラスを使用して重要なデータ調査ツールを構築する方法を示すことです。
簡単なレビュー: コンセプト
単純な線形回帰モデリングの背後にある基本的な目標は、X 値と Y 値のペア (つまり、X と Y の測定値) で構成される 2 次元平面から最適な直線を見つけることです。最小分散法を使用して線が見つかったら、さまざまな統計テストを実行して、その線が Y 値から観察された偏差にどの程度適合しているかを判断できます。
一次方程式 (y = mx + b) には、提供された X および Y データに基づいて推定する必要がある 2 つのパラメーターがあります。それらは、傾き (m) と y 切片 (b) です。これら 2 つのパラメーターが推定されると、観測値を線形方程式に入力し、方程式によって生成された Y 予測を観測できます。
最小分散法を使用して m および b パラメーターを推定するには、すべての X 値に対する Y の観測値と予測値が最小になるような m および b の推定値を見つける必要があります。観測値と予測値の差は誤差 (y i- (mx i+ b) ) と呼ばれ、各誤差値を 2 乗してこれらの残差を合計すると、結果は予測の 2 乗 Bad 数となります。最小分散法を使用して最適な適合を決定するには、予測分散を最小化する m と b の推定値を見つけることが含まれます。
最小分散法を満たす推定値 m と b を見つけるには、2 つの基本的な方法を使用できます。最初のアプローチでは、数値検索プロセスを使用して m と b の異なる値を設定し、それらを評価し、最終的に分散が最小になる推定値を決定します。 2 番目の方法は、微積分を使用して m と b を推定するための方程式を見つける方法です。これらの方程式の導出に関わる微積分には立ち入りませんが、SimpleLinearRegression クラスでこれらの分析方程式を使用して、m と b の最小二乗推定値を求めました (SimpleLinearRegression クラス メソッドの getSlope() と getYIntercept を参照)。
m と b の最小二乗推定値を見つけるために使用できる式がある場合でも、これらのパラメーターを一次方程式に代入すると、結果がデータによく適合する直線になるとは限りません。この単純な線形回帰プロセスの次のステップは、残りの予測分散が許容できるかどうかを判断することです。
統計的意思決定プロセスを使用して、直線がデータに適合するという対立仮説を棄却できます。このプロセスは、確率関数を使用してランダムに大きな観測値の確率を求める T 統計量の計算に基づいています。パート 1 で述べたように、SimpleLinearRegression クラスは多数の集計値を生成します。重要な集計値の 1 つは、線形方程式がデータにどの程度適合しているかを測定する T 統計量です。適合が良好な場合、T 統計量は大きな値になる傾向があります。T 値が小さい場合は、Y 値の平均が最良の予測子であると仮定するデフォルトのモデルに線形方程式を置き換える必要があります (なぜなら、一連の値の平均は、次の観測値を予測するのに役立つことが多いからです)。
T 統計量が、平均 Y 値を最良の予測因子として使用できないほど十分に大きいかどうかをテストするには、T 統計量をランダムに取得する確率を計算する必要があります。確率が低い場合は、平均が最良の予測子であるという帰無仮定を省くことができるため、単純な線形モデルがデータによく適合していると確信できます。 (T 統計の確率の計算の詳細については、パート 1 を参照してください。)
統計的な意思決定プロセスに戻りましょう。帰無仮説を採用すべきでない場合は教えてくれますが、対立仮説を受け入れるかどうかは教えてくれません。研究環境では、理論的および統計的パラメーターを通じて線形モデルの対立仮説を確立する必要があります。
これから構築するデータ調査ツールは、線形モデルの統計的意思決定プロセス (T 検定) を実装し、線形モデルの構築に必要な理論的および統計的パラメーターの構築に使用できる概要データを提供します。データ調査ツールは、ナレッジ ワーカーが小規模から中規模のデータ セットのパターンを研究するための意思決定支援ツールとして分類できます。
学習の観点から見ると、単純な線形回帰モデリングは、より高度な形式の統計モデリングを理解する唯一の方法であるため、研究する価値があります。たとえば、単純な線形回帰の多くの中心的な概念は、重回帰 (重回帰)、因子分析 (因子分析)、および時系列 (時系列) を理解するための優れた基礎を確立します。
単純な線形回帰も多用途のモデリング手法です。これを使用して、生データを変換する (通常は対数変換またはべき乗変換を使用) ことによって、曲線データをモデル化できます。これらの変換によりデータが線形化され、単純な線形回帰を使用してモデル化できるようになります。結果として得られる線形モデルは、変換された値に関連する線形式として表されます。
トップに戻る
確率関数
前の記事では、R に確率値の検索を依頼することで、PHP で確率関数を実装するという問題を回避しました。私はこの解決策に完全には満足できなかったので、「PHP に基づいて確率関数を開発するには何が必要か」という質問について調査を開始しました。
私はオンラインで情報とコードを探し始めました。両方のソースの 1 つは、書籍『C の数値レシピ』の確率関数です。いくつかの確率関数コード (gammln.c および betai.c 関数) を PHP で再実装しましたが、まだ結果に満足していません。他の実装よりもコードが少し多いようです。さらに、逆確率関数も必要です。
幸運なことに、私は John Pezullo の対話型統計計算に出会いました。 John の確率分布関数に関する Web サイトには、学習を容易にするために必要な関数がすべて JavaScript で実装されています。
Student T 関数と Fisher F 関数を PHP に移植しました。 Java 命名スタイルに準拠するように API を少し変更し、すべての関数を Distribution というクラスに埋め込みました。この実装の優れた機能は、このライブラリ内のすべての関数で再利用される doCommonMath メソッドです。わざわざ実装しなかった他のテスト (正規性テストとカイ 2 乗テスト) も doCommonMath メソッドを使用します。
この移植の別の側面も注目に値します。 JavaScript を使用すると、ユーザーは動的に決定された値を次のようなインスタンス変数に割り当てることができます:
var PiD2 = pi() / 2
PHP ではこれを行うことはできません。インスタンス変数には単純な定数値のみを割り当てることができます。この欠陥が PHP5 で解決されることを願っています。
リスト 1 のコードではインスタンス変数が定義されていないことに注意してください。これは、JavaScript バージョンでは値が動的に割り当てられるためです。
リスト 1. 確率関数の実装
doCommonMath($cth * $cth, 2, $df - 3, -1)) / (pi()/2); } else { return 1 - $sth * $this->doCommonMath($cth * $cth, 1, $df - 3, -1);関数 getInverseStudentT($p, $df) { $v = 0.5; $t = 0; while($dv > 1e-6) { $t = (1 / $v) - 1; = $dv / 2; if ( $this->getStudentT($t, $df) > $p) { $v = $v - $dv; } else { $v = $v + $dv; return $t; } function getFisherF($f, $n1, $n2) { // 実装されていますが、表示されていません } function getInverseFisherF($p, $n1, $n2) { // 実装されていますが、表示されていません } } ?>
グラフィック出力
これまでに実装した出力メソッドはすべて、HTML 形式で集計値を表示します。これらのデータの散布図や線図を GIF、JPEG、または PNG 形式で表示するのにも適しています。折れ線グラフと分布図を生成するコードを自分で書くよりも、JpGraph という PHP ベースのグラフィック ライブラリを使用する方が良いと思いました。 JpGraph は Johan Persson によって積極的に開発されており、彼のプロジェクト Web サイトでは次のように説明されています。
コーディングを最小限に抑えた「簡単で汚い」グラフでも、非常にきめ細かい制御が必要な複雑で専門的なグラフでも、JpGraph を使用すると簡単に描画できます。 JpGraph は、科学グラフにもビジネス タイプのグラフにも同様に適しています。
JpGraph ディストリビューションには、特定のニーズに合わせてカスタマイズできるサンプル スクリプトが多数含まれています。 JpGraph をデータ調査ツールとして使用するのは、必要なことと同様の処理を実行するサンプル スクリプトを見つけて、それを特定のニーズに合わせて調整するだけで簡単です。
リスト 3 のスクリプトは、サンプル データ探索ツール (explore.php) から抽出されたもので、ライブラリを呼び出して、Line クラスと Scatter クラスに SimpleLinearRegression 分析からのデータを設定する方法を示しています。このコードのコメントは、Johan Persson (JPGraph コードベースの文書化に優れた仕事をしています) によって書かれました。
リスト 3. サンプル データ調査ツール、explore.php の関数の詳細
SetScale("リンリン"); // タイトルを設定 $graph->title->Set("$title"); $graph->img->SetMargin(50,20,20,40); $graph->xaxis->SetTitle("$x_name","center"); $graph->yaxis->SetTitleMargin(30); $graph->yaxis->title->Set("$y_name"); $graph->title->SetFont(FF_FONT1,FS_BOLD); // X 軸が // デフォルトの位置である Y=0 だけでなく、常にプロットの一番下にあることを確認します $graph->xaxis->SetPos('min'); // 素敵な色で散布図を作成します $sp1 = new ScatterPlot($slr->Y, $slr->X); $sp1->mark->SetType(MARK_FILLEDCIRCLE); $sp1->mark->SetFillColor("red"); $sp1->SetColor("青"); $sp1->SetWeight(3); $sp1->mark->SetWidth(4); // 回帰直線を作成します $lplot = new LinePlot($slr->PredictedY, $slr->X); $lplot->SetWeight(2); $lplot->SetColor('navy'); // plto を行に追加 $graph->Add($sp1); $graph->Add($lplot); // ...そしてストローク $graph_name = "temp/test.png"; $graph->Stroke($graph_name); ?> ?>
回页首
データ研究脚本
このデータ調査ツールは単一のスクリプト (explore.php) で構成されており、このスクリプトは SimpleLinearRegressionHTML クラスと JpGraph パッケージのメソッドを使用しています。 このスクリプトは、単一の処理プロセスを使用しています。このスクリプトの最初の部分では、渡されたサンプルデータに対して基本的なテストが実行されます。
このスクリプトの 2 番目の部分に含まれるコードはデータの分析に使用され、結果が HTML および図形式で表示されます。清单 4.explore.php 的结构
$title"; $slr->showTablesummary($x_name, $y_name); echo "www.bkjia.com