0

おはようございます、スタックです。データの傾向を予測する方法を見つけようとしています.これを行うためのより良い方法があるかどうか疑問に思っています..調べることができる組み込み関数またはライブラリはありますか?

ここに私が持っているものがあります: ( http://3v4l.org/RGU3i )

$PopulationOfTexas = array(
    1999 => 20.56, // in millions
    2000 => 21.56,
    2001 => 22.56,
    2002 => 23.56
);

//generate an array sohwing the difference in each year compared to the previous year
$differneces = array();
$lastyear = null;
foreach($PopulationOfTexas as $k=>$v){
    if(empty($lastyear)){$lastyear = $k; continue;}
    $differneces[$k] = $k - $lastyear;
    $lastyear = $k;

    //use this later
    $lastitem = array("year"=>$k, "data"=>$v);
}

//get the average difference per year
$count = 0;
$total = 0;
foreach($differneces as $k=>$v){
    $count++;
    $total += $v;
}

$average = number_format(($total/$count), 2);

//make a prediction
$predictions = array();
for($i=0;$i<5;$i++){
    $year = isset($year) ? $year+1 : $lastitem["year"]+1;
    $prediction = isset($prediction) ? $prediction+floatval($average) : $lastitem["data"]+floatval($average);
    $predictions[$year] = $prediction;
}

print_r($predictions);
4

1 に答える 1

1

配列値 (人口) ではなく、配列キー (年の値、1999 年、2000 年など) の平均増加を計算しているため、アルゴリズムは完全に壊れており、結果は常に 1 です。

これは、サンプル母集団データが常に 1 ずつ増加するという事実によって隠されています。さらにバリエーションを追加していれば、おそらくエラーを発見していたでしょう。修正するには:

foreach($PopulationOfTexas as $k=>$v){
    if(empty($lastyear)){$lastyear = $v; continue;}
    $differneces[$k] = $v - $lastyear;
    $lastyear = $v;

    //use this later
    $lastitem = array("year"=>$k, "data"=>$v);
}

より一般的に言えば、このアルゴリズムは非常に単純化されており、一定の増加/減少を予測します。

于 2015-07-29T15:08:54.147 に答える