如何在PhP中计算不同大小数组的协方差?

如何在PhP中计算不同大小数组的协方差?,php,statistics,covariance,quantitative-finance,Php,Statistics,Covariance,Quantitative Finance,此函数计算相同大小的两个数组的协方差(例如,$countA=$countB=20) 如何为不同大小的阵列扩展它?(例如,要根据较小数组的大小进行计算,如果$countA=10和$countB=12?较小数组的大小可能有多小,并且仍然有统计意义?) 万分感谢 M 函数获取协方差($valuesA,$valuesB){ $countA=计数($valuesA); $countB=计数($valuesB); 如果($countA!=$countB){ 触发器_错误('大小不同的数组:countA='.

此函数计算相同大小的两个数组的协方差(例如,
$countA=$countB=20

如何为不同大小的阵列扩展它?(例如,要根据较小数组的大小进行计算,如果
$countA=10
$countB=12
?较小数组的大小可能有多小,并且仍然有统计意义?)

万分感谢

M

函数获取协方差($valuesA,$valuesB){
$countA=计数($valuesA);
$countB=计数($valuesB);
如果($countA!=$countB){
触发器_错误('大小不同的数组:countA='.$countA',countB='.$countB,E_用户_警告);
返回false;
}
如果($countA<0){
触发错误('空数组',E_用户警告);
返回false;
}
//如果可用,请使用库函数
如果(函数_存在('stats_协方差')){
返回统计和协方差($valuesA,$valuesB);
}
$meanA=数组总和($valuesA)/floatval($countA);
$meanB=数组和($valuesB)/floatval($countB);
$add=0.0;
对于($pos=0;$pos<$countA;$pos++){
$valueA=$valuesA[$pos];
如果(!是数值($valueA)){
触发器错误(“$pos.”位置处数组A中的非数值,值=”。$valueA,E_用户警告);
返回false;
}
$valueB=$valuesB[$pos];
如果(!是数值($valueB)){
触发器错误(“$pos.”位置的数组B中不是数值,值=”。$valueB,E_用户警告);
返回false;
}
$difA=$valueA-$meanA;
$difB=$valueB-$meanB;
$add+=($difA*$difB);
}
返回$add/floatval($countA);
}
使用min()查找哪个数组的项最少,并按该数量对它们进行切片

function getCovariance($valuesA, $valuesB){
  // sizing both arrays the same, if different sizes, @Andreas @stackoverflow
  $no_keys = min(count($valuesA), count($valuesB));
  $valuesA = array_slice($valuesA, 0, $no_keys);
  $valuesB = array_slice($valuesB, 0, $no_keys);

  // if size of arrays is too small
  if($no_keys<2){return 0.0000000000001;}

  // Use library function if available
  if(function_exists('stats_covariance')){return stats_covariance($valuesA, $valuesB);}

  $meanA=array_sum($valuesA)/$no_keys;
  $meanB=array_sum($valuesB)/$no_keys;
  $add=0.0;

  for ($pos=0; $pos < $no_keys; $pos++){
    $valueA=$valuesA[ $pos ];
    if(!is_numeric($valueA)){
      trigger_error('Not numerical value in array A at position '. $pos .', value='. $valueA, E_USER_WARNING);
      return false;
    }

    $valueB=$valuesB[ $pos ];
    if(!is_numeric($valueB)){
      trigger_error('Not numerical value in array B at position '. $pos .', value='. $valueB, E_USER_WARNING);
      return false;
    }

    $difA=$valueA - $meanA;
    $difB=$valueB - $meanB;
    $add += ($difA * $difB);
  }

  return $add/$no_keys;
}
函数获取协方差($valuesA,$valuesB){
//调整两个数组的大小相同,如果大小不同,@Andreas@stackoverflow
$no_key=min(count($valuesA),count($valuesB));
$valuesA=array_slice($valuesA,0,$no_键);
$valuesB=array\u slice($valuesB,0,$no\u键);
//如果数组的大小太小

如果($no_键因此,如果一个数组有10个,另一个数组有12个,您想使用两个数组的前10项吗?@Emma没问题。请澄清,因为我们使数组计数相同,所以不需要您的代码来检查数组的计数是否相同。$countA和$countB都相同,它们都与$no_键相同。意思是你可以用$no_键替换所有$countA/B。然后
$meanA=array\u sum($valuesA)/floatval($countA);
$countA来自count(),它返回一个整数,为什么要floatval呢?
function getCovariance($valuesA, $valuesB){
  // sizing both arrays the same, if different sizes, @Andreas @stackoverflow
  $no_keys = min(count($valuesA), count($valuesB));
  $valuesA = array_slice($valuesA, 0, $no_keys);
  $valuesB = array_slice($valuesB, 0, $no_keys);

  // if size of arrays is too small
  if($no_keys<2){return 0.0000000000001;}

  // Use library function if available
  if(function_exists('stats_covariance')){return stats_covariance($valuesA, $valuesB);}

  $meanA=array_sum($valuesA)/$no_keys;
  $meanB=array_sum($valuesB)/$no_keys;
  $add=0.0;

  for ($pos=0; $pos < $no_keys; $pos++){
    $valueA=$valuesA[ $pos ];
    if(!is_numeric($valueA)){
      trigger_error('Not numerical value in array A at position '. $pos .', value='. $valueA, E_USER_WARNING);
      return false;
    }

    $valueB=$valuesB[ $pos ];
    if(!is_numeric($valueB)){
      trigger_error('Not numerical value in array B at position '. $pos .', value='. $valueB, E_USER_WARNING);
      return false;
    }

    $difA=$valueA - $meanA;
    $difB=$valueB - $meanB;
    $add += ($difA * $difB);
  }

  return $add/$no_keys;
}