Как рассчитать случайный ряд значений (B), которые имеют заданную корреляцию с заданным рядом (A)

Для образовательного веб-сайта моя цель состоит в том, чтобы дать учащимся немного поиграться с рядами значений и их сопоставлением. Например, учащиеся могут ввести два массива, для которых рассчитывается корреляция:

$array_x = array(5,3,6,7,4,2,9,5);
$array_y = array(4,3,4,8,3,2,10,5);

echo Correlation($array_x, $array_y); // 0.93439982209434

Код для этого отлично работает, и его можно найти внизу этой статьи. Однако сейчас я столкнулся с проблемой. Я хочу следующее:

  • учащийся вводит $array_x (5,3,6,7,4,2,9,5)
  • учащийся вводит корреляцию (0.9)
  • учащийся вводит границы $array_y (например, от 1 до 10 или от 50 до 80)
  • скрипт возвращает случайный массив (например: 4,3,4,8,3,2,10,5), который имеет (около) заданной корреляции

Таким образом, другими словами, код должен работать так:

$array_x = array(5,3,6,7,4,2,9,5);
$boundaries = array(1, 10);
$correlation = 0.9;

echo ySeries($array_x, $boundaries, $correlation); // array(4,3,4,8,3,2,10,5)

На форуме Stackexchange Math @ilya ответил (вставлен как изображение, поскольку латексное форматирование формул, похоже, не работает на переполнение стека):

enter image description here

PS Код, используемый для расчета корреляции:

function Correlation($arr1, $arr2) {        
  $correlation = 0;  
  $k = SumProductMeanDeviation($arr1, $arr2);
  $ssmd1 = SumSquareMeanDeviation($arr1);
  $ssmd2 = SumSquareMeanDeviation($arr2);
  $product = $ssmd1 * $ssmd2;
  $res = sqrt($product);
  $correlation = $k / $res;

  return $correlation;
}

function SumProductMeanDeviation($arr1, $arr2) {
  $sum = 0;
  $num = count($arr1);
  for($i=0; $i < $num; $i++) {
    $sum = $sum + ProductMeanDeviation($arr1, $arr2, $i);
  }
  return $sum;
}

function ProductMeanDeviation($arr1, $arr2, $item) {
  return (MeanDeviation($arr1, $item) * MeanDeviation($arr2, $item));
}

function SumSquareMeanDeviation($arr) {
  $sum = 0;
  $num = count($arr);
  for($i = 0; $i < $num; $i++) {
    $sum = $sum + SquareMeanDeviation($arr, $i);
  }
  return $sum;
}

function SquareMeanDeviation($arr, $item) {
  return MeanDeviation($arr, $item) * MeanDeviation($arr, $item);
}

function SumMeanDeviation($arr) {
  $sum = 0;
  $num = count($arr);
  for($i = 0; $i < $num; $i++) {
    $sum = $sum + MeanDeviation($arr, $i);
  }
  return $sum;
}

function MeanDeviation($arr, $item) {
  $average = Average($arr);
  return $arr[$item] - $average;
}    

function Average($arr) {
  $sum = Sum($arr);
  $num = count($arr);
  return $sum/$num;
}

function Sum($arr) {
  return array_sum($arr);
}
6
задан Pr0no 15 May 2012 в 17:32
поделиться