소개
Perl 및 Python과 같은 다른 오픈 소스 언어와 비교할 때 PHP 커뮤니티는 수학 라이브러리를 개발하려는 강력한 노력이 부족합니다.
그 이유 중 하나는 이미 성숙한 수학적 도구가 많이 있기 때문일 수 있으며, 이는 자체적으로 PHP 도구를 개발하려는 커뮤니티의 노력을 방해할 수 있습니다. 예를 들어, 저는 인상적인 통계 라이브러리 세트를 보유하고 데이터 세트를 분석하도록 특별히 설계되었으며 언어 설계로 1998년에 ACM Award를 수상한 강력한 도구인 S 시스템에 대해 작업했습니다. S 또는 그 오픈 소스 사촌인 R이 단지 exec_shell 호출일 뿐이라면 왜 PHP에서 동일한 통계 컴퓨팅 기능을 구현하는 데 어려움을 겪을까요? S 시스템, ACM Award 또는 R에 대한 자세한 내용은 관련 참조 자료를 참조하세요.
이건 개발자 에너지 낭비 아닌가요? PHP 수학 라이브러리를 개발하려는 동기가 개발자의 노력을 절약하고 작업에 가장 적합한 도구를 사용하는 것이라면 PHP의 현재 주제는 의미가 있습니다.
반면에 교육학적 동기는 PHP 수학 라이브러리의 개발을 장려할 수 있습니다. 약 10%의 사람들에게 수학은 탐구할 가치가 있는 흥미로운 과목입니다. PHP에도 능숙한 사람들의 경우, PHP 수학 라이브러리를 개발하면 수학 학습 과정을 향상시킬 수 있습니다. 즉, T-테스트에 관한 장을 읽는 것뿐만 아니라 해당 중간값을 계산할 수 있는 프로그램을 구현하는 것입니다. 값을 지정하고 해당 클래스를 표준 형식으로 표시합니다.
지도와 교육을 통해 PHP 수학 라이브러리를 개발하는 것이 어려운 작업이 아니며 흥미로운 기술 및 학습 과제가 될 수 있음을 보여주고 싶습니다. 이 기사에서는 PHP 수학 라이브러리를 개발하는 데 사용할 수 있는 일반적인 접근 방식을 보여주는 SimpleLinearRegression이라는 PHP 수학 라이브러리 예제를 제공합니다. SimpleLinearRegression 클래스를 개발하는 데 도움이 된 몇 가지 일반 원칙에 대해 논의하는 것부터 시작하겠습니다.
기본 원칙
저는 SimpleLinearRegression 클래스 개발을 안내하기 위해 6가지 일반 원칙을 사용했습니다.
각 분석 모델에 대한 클래스를 만듭니다.
클래스를 개발하려면 역방향 연결을 사용하세요.
많은 게터가 예상됩니다.
중간 결과를 저장합니다.
세부 API에 대한 기본 설정을 지정합니다.
완벽함은 목표가 아닙니다.
각 지침을 더 자세히 살펴보겠습니다.
각 분석 모델에 대한 클래스를 만듭니다.
각 주요 분석 테스트 또는 프로세스에는 테스트 또는 프로세스와 동일한 이름의 PHP 클래스가 있어야 합니다. 이 클래스에는 입력 함수, 중간 값 및 요약 값을 계산하는 함수, 출력 함수( 중간 값 대체) 값과 요약 값은 모두 텍스트 또는 그래픽 형식으로 화면에 표시됩니다.
역연쇄를 사용하여 클래스 개발
수학적 프로그래밍에서 코딩 대상은 일반적으로 분석 절차(예: MultipleRegression, TimeSeries 또는 ChiSquared)가 생성하려는 표준 출력 값입니다. 문제 해결의 관점에서 이는 역방향 연결을 사용하여 수학적 방법을 개발할 수 있음을 의미합니다.
예를 들어, 요약 출력 화면에는 하나 이상의 요약 통계 결과가 표시됩니다. 이러한 요약 통계 결과는 중간 통계 결과 계산에 의존하며 이러한 중간 통계 결과에는 더 깊은 중간 통계 결과 등이 포함될 수 있습니다. 이러한 백링크 기반 개발 접근 방식은 다음 원칙으로 이어집니다.
많은 수의 getter
수학 클래스가 필요합니다. 대부분의 클래스 개발 작업에는 중간 및 요약 값 계산이 포함됩니다. 실제로 이는 클래스에 중간 및 요약 값을 계산하는 getter 메소드가 많이 포함되어 있어도 놀라지 않아야 함을 의미합니다.
중간 결과 저장
중간 결과를 후속 계산의 입력으로 사용할 수 있도록 결과 개체 내에 중간 계산 결과를 저장합니다. 이 원칙은 S 언어 디자인에서 구현됩니다. 현재 상황에서는 계산된 중간 값과 요약 결과를 나타내는 인스턴스 변수를 선택하여 이 원칙을 구현합니다.
SimpleLinearRegression 클래스의 멤버 함수 및 인스턴스 변수에대한
이름 지정 체계를 개발할 때 멤버 함수 및 인스턴스 변수를 설명하기 위해 더 긴 이름( getYY2 대신 getSumSquaredError 등)을 사용하면 다음과 같은 결과가 발생한다는 사실을 발견했습니다. 함수의 동작 내용과 변수의 의미를 더 쉽게 이해할 수 있습니다.
축약형 이름을 완전히 버린 것은 아니지만 축약형 이름을 사용할 때는 이름의 의미를 충분히 설명하는 메모를 제공하려고 노력해야 합니다. 내 생각은 이렇습니다. 매우 축약된 명명 체계는 수학적 프로그래밍에서 일반적이지만 특정 수학적 루틴이 필요 이상으로 정확하다는 것을 이해하고 증명하는 것을 더 어렵게 만듭니다.
완벽함은 목표가 아닙니다.
이 코딩 연습의 목표는 반드시 고도로 최적화되고 엄격한 PHP용 수학 엔진을 개발하는 것이 아닙니다. 초기 단계에서는 의미 있는 분석 테스트를 구현하고 이 영역의 어려운 문제를 해결하는 방법을 배우는 데 중점을 두어야 합니다.
인스턴스 변수
통계 테스트나 프로세스를 모델링할 때 어떤 인스턴스 변수가 선언되는지 표시해야 합니다.
인스턴스 변수의 선택은 분석 과정에서 생성된 중간값과 요약값을 고려하여 결정될 수 있습니다. 각 중간 및 요약 값에는 해당 인스턴스 변수가 있을 수 있으며 변수 값은 개체 속성으로 사용됩니다.
나는 이 분석을 사용하여 목록 1의 SimpleLinearRegression 클래스에 대해 선언할 변수를 결정했습니다. MultipleRegression, ANOVA 또는 TimeSeries 프로시저에서도 유사한 분석을 수행할 수 있습니다.
목록 1. SimpleLinearRegression 클래스의 인스턴스 변수
<?php
// 저작권 2003, 폴 메거
// GPL에 따라 배포됨
클래스 SimpleLinearRegression {
var $n;
var $X = 배열();
var $Y = 배열();
var $ConfInt;
var $알파;
var $XMean;
var $YMean;
var $SumXX;
var $SumXY;
var $SumYY;
var $기울기;
var $YInt;
var $PredictedY = 배열();
var $Error = 배열();
var $SquaredError = 배열();
var $TotalError;
var $SumError;
var $SumSquaredError;
var $ErrorVariance;
var $StdErr;
var $SlopeStdErr;
var $SlopeVal; // 기울기의 T 값
var $YIntStdErr;
var $YIntTVal; // Y 절편의 T 값
var $R;
var $RSquared;
var $DF; // 자유도
var $SlopeProb; // 경사 추정 확률
var $YIntProb; // Y 절편 추정 확률
var $AlphaTVal; // 주어진 알파 설정에 대한 T 값
var $ConfIntOfSlope;
var $RPath = "/usr/local/bin/R"; // 경로는 여기에 있습니다.
var $format = "%01.2f" // 출력 형식 지정에 사용됩니다.
}
?>
생성자
SimpleLinearRegression 클래스의 생성자 메서드는 각각 동일한 수의 값을 갖는 X 및 Y 벡터를 허용합니다. 예상 Y 값에 대한 기본 95% 신뢰 구간을 설정할 수도 있습니다.
생성자 메서드는 데이터 형식이 처리에 적합한지 확인하는 것부터 시작됩니다. 입력 벡터가 "동일한 크기" 및 "1보다 큰 값" 테스트를 통과하면 알고리즘의 핵심 부분이 실행됩니다.
이 작업을 수행하려면 일련의 getter 메서드를 통해 통계 프로세스의 중간 및 요약 값을 계산해야 합니다. 각 메서드 호출의 반환 값을 클래스의 인스턴스 변수에 할당합니다. 이러한 방식으로 계산 결과를 저장하면 연결된 계산에서 루틴 호출에 중간 및 요약 값을 사용할 수 있습니다. 목록 2에 설명된 대로 이 클래스의 출력 메서드를 호출하여 이러한 결과를 표시할 수도 있습니다.
목록 2. 클래스 출력 메소드 호출
<?php
// 저작권 2003, 폴 메거
// GPL에 따라 배포됨
함수 SimpleLinearRegression($X, $Y, $ConfidenceInterval="95") {
$numX = 개수($X);
$numY = 개수($Y);
if ($numX != $numY) {
die("오류: X와 Y 벡터의 크기는 동일해야 합니다.");
}
if ($numX <= 1) {
die("오류: 입력 배열의 크기는 2 이상이어야 합니다.");
}
$this->n = $numX;
$this->X = $X;
$this->Y = $Y;
$this->ConfInt = $ConfidenceInterval;
$this->Alpha = (1 + ($this->ConfInt / 100) ) / 2;
$this->XMean = $this->getMean($this->X);
$this->YMean = $this->getMean($this->Y);
$this->SumXX = $this->getSumXX();
$this->SumYY = $this->getSumYY();
$this->SumXY = $this->getSumXY();
$this->Slope = $this->getSlope();
$this->YInt = $this->getYInt();
$this->예측Y = $this->getPredictedY();
$this->오류 = $this->getError();
$this->SquaredError = $this->getSquaredError();
$this->SumError = $this->getSumError();
$this->TotalError = $this->getTotalError();
$this->SumSquaredError = $this->getSumSquaredError();
$this->ErrorVariance = $this->getErrorVariance();
$this->StdErr = $this->getStdErr();
$this->SlopeStdErr = $this->getSlopeStdErr();
$this->YIntStdErr = $this->getYIntStdErr();
$this->SlopeTVal = $this->getSlopeTVal();
$this->YIntTVal = $this->getYIntTVal();
$this->R = $this->getR();
$this->RSquared = $this->getRSquared();
$this->DF = $this->getDF();
$this->SlopeProb = $this->getStudentProb($this->SlopeTVal, $this->DF);
$this->YIntProb = $this->getStudentProb($this->YIntTVal, $this->DF);
$this->AlphaTVal = $this->getInverseStudentProb($this->Alpha, $this->DF);
$this->ConfIntOfSlope = $this->getConfIntOfSlope();
사실을 반환;
}
?>
방법 이름과 순서는 백링크와 중간값 계산 방법을 단계별로 설명하는 학부생이 사용하는 통계 교과서 참조를 통해 파생되었습니다. 계산해야 하는 중간 값의 이름에는 "get"이라는 접두사가 붙으므로 메서드 이름이 파생됩니다.
데이터에 모델 맞추기
SimpleLinearRegression 프로시저는 데이터에 맞는 직선을 생성하는 데 사용됩니다. 여기서 선에는 다음 표준 방정식이 있습니다.
y = b + mx
이 방정식의 PHP 형식은 목록 3:
목록 3과 유사합니다. 모델을 데이터에 맞추기 PHP 방정식 일치
$PredictedY[$i] = $YIntercept + $Slope * $X[$i]
SimpleLinearRegression 클래스는 최소 제곱 기준을 사용하여 Y절편(Y Intercept) 및 기울기(Slope) 매개변수의 추정치를 도출합니다. 이러한 추정 매개변수는 X 값과 Y 값 사이의 관계를 모델링하는 선형 방정식(목록 3 참조)을 구성하는 데 사용됩니다.
도출된 선형 방정식을 사용하면 각 X 값에 대한 예측 Y 값을 얻을 수 있습니다. 선형 방정식이 데이터에 잘 맞는 경우 Y의 관측 값과 예측 값이 일치하는 경향이 있습니다.
적합한지 확인하는 방법
SimpleLinearRegression 클래스는 꽤 많은 요약 값을 생성합니다. 중요한 요약 값은 선형 방정식이 데이터에 얼마나 잘 맞는지 측정하는 T 통계입니다. 일치도가 매우 좋으면 T 통계량이 커지는 경향이 있습니다. T 통계량이 작은 경우 선형 방정식은 Y 값의 평균이 가장 좋은 예측 변수라고 가정하는 모델로 대체되어야 합니다(즉, 값 집합의 평균이 일반적으로 유용한 예측 변수임) 다음 관찰에서는 이를 기본 모델로 만듭니다).
T 통계량이 Y 값의 평균을 최상의 예측 변수로 간주하지 않을 만큼 큰지 여부를 테스트하려면 T 통계량을 얻을 수 있는 무작위 확률을 계산해야 합니다. T-통계량을 얻을 확률이 낮으면 평균이 가장 좋은 예측변수라는 귀무가설을 기각하고 따라서 단순 선형 모델이 데이터에 잘 부합한다고 확신할 수 있습니다.
그렇다면 T 통계값의 확률은 어떻게 계산하나요?
T-통계값의 확률 계산
PHP에는 T-통계값의 확률을 계산하는 수학적 루틴이 부족하기 때문에 이 작업을 통계 컴퓨팅 패키지 R(참고자료의 www.r-project.org 참조)에 맡기기로 결정했습니다. 필요한 값을 얻습니다. 또한 이 패키지에 주목하고 싶은 이유는 다음과 같습니다.
R은 PHP 개발자가 PHP 수학 라이브러리에서 에뮬레이트할 수 있는 많은 아이디어를 제공합니다.
R을 사용하면 PHP 수학 라이브러리에서 얻은 값이 무료로 제공되는 성숙한 오픈 소스 통계 패키지에서 얻은 값과 일치하는지 확인할 수 있습니다.
목록 4의 코드는 값을 얻기 위해 R에 맡기는 것이 얼마나 쉬운지 보여줍니다.
목록 4. R 통계 패키지로 처리하여 값 얻기
<?php
// 저작권 2003, 폴 메거
// GPL에 따라 배포됨
클래스 SimpleLinearRegression {
var $RPath = "/usr/local/bin/R"; // 경로는 여기에 있습니다.
함수 getStudentProb($T, $df) {
$확률 = 0.0;
$cmd = "echo 'dt($T, $df)' | $this->RPath --slave";
$결과 = shell_exec($cmd);
list($LineNumber, $Probability) = 폭발(" ", Trim($result));
$확률을 반환합니다.
}
함수 getInverseStudentProb($alpha, $df) {
$역확률 = 0.0;
$cmd = "echo 'qt($alpha, $df)' | $this->RPath --slave";
$결과 = shell_exec($cmd);
list($LineNumber, $InverseProbability) = 폭발(" ", 트림($result));
$InverseProbability를 반환합니다.
}
}
?>
R 실행 파일의 경로가 두 함수 모두에서 설정되고 사용되었다는 점에 유의하세요. 첫 번째 함수는 스튜던트의 T 분포를 기반으로 T 통계와 관련된 확률 값을 반환하는 반면, 두 번째 역함수는 지정된 알파 설정에 해당하는 T 통계를 계산합니다. getStudentProb 메소드는 선형 모델의 적합성을 평가하는 데 사용됩니다. getInverseStudentProb 메소드는 각 예측 Y 값에 대한 신뢰 구간을 계산하는 데 사용되는 중간 값을 반환합니다.
제한된 공간으로 인해 이 수업의 모든 기능을 하나씩 자세히 설명하는 것은 불가능하므로 단순 선형 회귀 분석에 관련된 용어 및 단계를 파악하려면 사용되는 통계 교과서를 참조하는 것이 좋습니다. 학부생에 의해.
번아웃 연구
이 수업을 사용하는 방법을 보여주기 위해 유틸리티의 번아웃 연구 데이터를 사용할 수 있습니다. Michael Leiter와 Kimberly Ann Meechan은 피로 지수라고 불리는 피로 지수와 집중력이라는 독립 변수 사이의 관계를 연구했습니다. 집중력은 작업 환경에서 발생하는 사람들의 사회적 접촉의 비율을 나타냅니다.
표본에 포함된 개인의 소비 지수 값과 농도 값 사이의 관계를 연구하려면 이러한 값을 적절하게 명명된 배열에 로드하고 이러한 배열 값으로 이 클래스를 인스턴스화합니다. 클래스를 인스턴스화한 후 클래스에서 생성된 일부 요약 값을 표시하여 선형 모델이 데이터에 얼마나 잘 맞는지 평가합니다.
Listing 5는 데이터를 로드하고 요약 값을 표시하는 스크립트를 보여줍니다.
Listing 5. 데이터를 로드하고 요약 값을 표시하는 스크립트
<?php
// BurnoutStudy.php
// 저작권 2003, 폴 메거
// GPL에 따라 배포됨
"SimpleLinearRegression.php"를 포함합니다.
// 번아웃 연구에서 데이터 로드
$집중 = 배열(20,60,38,88,79,87,
68,12,35,70,80,92,
77,86,83,79,75,81,
75,77,77,77,17,85,96);
$ExhaustionIndex = 배열(100,525,300,980,310,900,
410,296,120,501,920,810,
506,493,892,527,600,855,
709,791,718,684,141,400,970);
$slr = new SimpleLinearRegression($Concentration, $ExhaustionIndex);
$YInt = sprintf($slr->format, $slr->YInt);
$Slope = sprintf($slr->format, $slr->Slope);
$SlopeTVal = sprintf($slr->format, $slr->SlopeTVal);
$SlopeProb = sprintf("%01.6f", $slr->SlopeProb);
?>
<테이블 테두리='1' cellpadding='5'>
<tr>
<th align='right'>수식:</th>
<td></td>
</tr>
<tr>
<th align='right'>티:</th>
<td></td>
</tr>
<tr>
<th align='right'>문제 > T:</th>
<td><td>
</tr>
</table>
웹 브라우저를 통해 이 스크립트를 실행하면 다음과 같은 출력이 생성됩니다.
방정식: 소모 = -29.50 + (8.87 * 농도)
티: 6.03
Prob > T: 0.000005
이 표의 마지막 행은 이렇게 큰 T 값을 얻을 수 있는 무작위 확률이 매우 낮다는 것을 나타냅니다. 단순히 소비량의 평균을 이용하는 것보다 단순선형모델이 예측력이 더 좋다는 결론을 내릴 수 있다.
누군가의 직장에서 연결의 집중도를 아는 것은 그들이 소비할 수 있는 소진 수준을 예측하는 데 사용될 수 있습니다. 이 방정식은 농도 값이 1단위 증가할 때마다 사회 서비스 분야에 종사하는 개인의 소비 가치가 8단위 증가한다는 것을 알려줍니다. 이는 잠재적인 소진을 줄이기 위해 사회 복지 서비스에 종사하는 개인이 직장 밖에서 친구를 사귀는 것을 고려해야 한다는 추가 증거입니다.
이는 이러한 결과가 의미하는 바에 대한 대략적인 개요일 뿐입니다. 이 데이터 세트의 의미를 완전히 탐색하려면 데이터를 더 자세히 연구하여 이것이 올바른 해석인지 확인하는 것이 좋습니다. 다음 기사에서는 어떤 다른 분석을 수행해야 하는지에 대해 설명하겠습니다.
무엇을 배웠나요?
우선, 의미 있는 PHP 기반 수학 패키지를 개발하기 위해 로켓 과학자가 될 필요는 없습니다. 표준 객체 지향 기술을 준수하고 역연쇄 문제 해결 방법을 명시적으로 채택함으로써 PHP를 사용하여 보다 기본적인 통계 프로세스 중 일부를 구현하는 것이 상대적으로 쉽습니다.
가르치는 관점에서 볼 때, 이 연습은 더 높은 추상화 수준과 더 낮은 추상화 수준에서 통계 테스트나 루틴에 대해 생각해야 하기 때문에 매우 유용하다고 생각합니다. 즉, 통계적 테스트나 절차적 학습을 보완하는 가장 좋은 방법은 해당 절차를 알고리즘으로 구현하는 것입니다.
통계 테스트를 구현하려면 주어진 정보와 창의적인 문제 해결 및 발견 이상의 기능이 필요한 경우가 많습니다. 또한 주제에 대한 지식의 공백을 발견하는 좋은 방법이기도 합니다.
단점은 PHP에는 대부분의 통계 테스트를 구현하는 데 필요한 분포 샘플링을 위한 고유한 수단이 부족하다는 것입니다. 이러한 값을 얻으려면 R이 처리를 수행하도록 해야 하지만 R을 설치할 시간이나 관심이 없을 것 같습니다. 몇 가지 일반적인 확률 함수를 기본 PHP로 구현하면 이 문제를 해결할 수 있습니다.
또 다른 문제: 클래스는 많은 중간 및 요약 값을 생성하지만 요약 출력은 실제로 이를 활용하지 않습니다. 다루기 힘든 출력을 제공했지만 분석 결과를 적절하게 해석할 수 있을 만큼 충분하지도 않고 잘 구성되어 있지도 않습니다. 사실, 출력 방법을 이 클래스에 어떻게 통합할 수 있는지 전혀 모르겠습니다. 이 문제를 해결해야 합니다.
마지막으로, 데이터를 이해하려면 단순히 요약 값을 보는 것 이상이 필요합니다. 또한 개별 데이터 포인트가 어떻게 배포되는지 이해해야 합니다. 이를 수행하는 가장 좋은 방법 중 하나는 데이터를 그래프로 작성하는 것입니다. 다시 말하지만, 이것에 대해 잘 알지 못하지만 이 클래스를 사용하여 실제 데이터를 분석하려면 이 문제를 해결해야 합니다.