教育用のウェブサイトの場合、生徒にバリューシリーズとそのコラボレーションを少しでも見てもらうことが私の目的です。たとえば、学生は相関が計算される2つの配列を入力できます。
$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は次のように回答しました(fomulasのLaTeXフォーマットはstackoverflowで機能しないようであるため、画像として挿入されています)。
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);
}