Доброе утро, стек. Я пытаюсь найти способ предсказать тенденции в данных. Мне интересно, есть ли лучший способ сделать это .. Есть ли какие-нибудь встроенные функции или библиотеки, на которые я могу посмотреть?
Вот что у меня есть 🙁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);
Алгоритм полностью нарушен, потому что он вычисляет среднее увеличение ключей массива (значения года, 1999, 2000 и т. Д.), А не значения массива (население), поэтому результат всегда равен 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);
}
В более общих чертах алгоритм чрезвычайно прост в том смысле, что он предсказывает постоянное увеличение / уменьшение.
Других решений пока нет …