답변:
유용한 기술 중 하나는 몬테 카를로 테스트입니다. 동일한 작업을 수행하는 두 개의 알고리즘이있는 경우 두 가지를 모두 구현하고 임의의 데이터를 먹이고 수치 적 퍼지에 대한 작은 허용 오차 내에서 동일한 대답을 생성하는지 확인하십시오. 전에 여러 번이 작업을 수행했습니다.
나는 켄달의 타우 B의 구현을 효율적이지만 구현하기가 어렵다고 썼다 . 이것을 테스트하기 위해 에서 실행되는 간단한 50 줄 구현을 작성했다 . O ( N 2 )
능선 회귀를 수행하는 코드를 작성했습니다. 이 작업을 수행하는 가장 좋은 알고리즘은 또는 경우에 따라 다르므로 두 가지 알고리즘이 필요했습니다. p > n
이 두 가지 경우 모두 D 프로그래밍 언어로 비교적 잘 알려진 기술을 구현하고 있었기 때문에 (구현이 없었 음) R에 대해서도 몇 가지 결과를 확인했습니다. 그럼에도 불구하고 몬테 카를로 테스트는 다른 방법으로는 결코 잡을 수 없었던 버그를 발견했습니다. .
또 다른 좋은 테스트는 주장 이다. 정확한 계산 결과가 무엇인지 정확히 알지 못할 수도 있지만, 계산의 여러 단계에서 온 전성 검사를 수행 할 수 없다는 의미는 아닙니다. 실제로 코드에 이것들이 많고 모두 통과하면 코드가 일반적입니다.
편집 : 세 번째 방법은 정확히 알지 못하더라도 적어도 정답이 무엇인지 알 수있는 알고리즘 데이터 (합성 또는 실제)를 제공하고 대답이 합리적인지 검사하여 확인하는 것입니다. 예를 들어, 모수의 추정치가 정확히 무엇인지는 모르지만 어느 것이 "큰"것으로 가정하고 어떤 것이 "작은"것으로 알고 있는지는 알고있을 것입니다.
이것이 귀하의 질문에 대한 답변인지 확실하지 않지만 적어도 접선 적으로 관련되어 있습니다.
Maple 에서 통계 패키지를 유지 관리합니다 . 코드를 테스트하기 어려운 흥미로운 예는 다른 분포에 따른 무작위 샘플 생성입니다. 오류가 생성되지 않았는지 테스트하는 것은 쉽지만 생성 된 샘플이 요청 된 분포를 "충분히"준수하는지 여부를 결정하는 것이 더 까다 롭습니다. 메이플에는 기호 기능과 숫자 기능이 모두 있으므로 일부 기호 기능을 사용하여 (순수 숫자) 샘플 생성을 테스트 할 수 있습니다.
우리는 몇 가지 유형의 통계적 가설 검정을 구현했습니다. 그 중 하나는 카이 제곱 적합 모형 검정 입니다. 주어진 확률 분포의 역 CDF에서 결정된 빈의 샘플 수에 대한 카이 제곱 검정입니다. 예를 들어, 코시 분포 샘플 생성을 테스트하기 위해
with(Statistics):
infolevel[Statistics] := 1:
distribution := CauchyDistribution(2, 3):
sample := Sample(distribution, 10^6):
ChiSquareSuitableModelTest(sample, distribution, 'bins' = 100, 'level' = 0.001);
원하는만큼 많은 샘플을 생성 할 수 있으므로 매우 작게 만들 수 있습니다 .
유한 모멘트를 갖는 분포의 경우, 한편으로는 많은 샘플 모멘트를 계산하고, 다른 한편으로는 해당 분포 모멘트와 표준 오차를 상징적으로 계산합니다. 예를 들어 베타 배포판 :
with(Statistics):
distribution := BetaDistribution(2, 3):
distributionMoments := Moment~(distribution, [seq(1 .. 10)]);
standardErrors := StandardError[10^6]~(Moment, distribution, [seq(1..10)]);
evalf(distributionMoments /~ standardErrors);
감소하는 숫자 목록을 표시하며 마지막 숫자는 255.1085766입니다. 따라서 10 번째 모멘트조차도 모멘트 값은 크기의 표본에 대한 표본 모멘트 표준 오차 값의 250 배 이상 입니다. 이것은 다음과 같이 어느 정도 실행되는 테스트를 구현할 수 있음을 의미합니다.
with(Statistics):
sample := Sample(BetaDistribution(2, 3), 10^6):
sampleMoments := map2(Moment, sample, [seq(1 .. 10)]);
distributionMoments := [2/5, 1/5, 4/35, 1/14, 1/21, 1/30, 4/165, 1/55, 2/143, 1/91];
standardErrors :=
[1/5000, 1/70000*154^(1/2), 1/210000*894^(1/2), 1/770000*7755^(1/2),
1/54600*26^(1/2), 1/210000*266^(1/2), 7/5610000*2771^(1/2),
1/1567500*7809^(1/2), 3/5005000*6685^(1/2), 1/9209200*157366^(1/2)];
deviations := abs~(sampleMoments - distributionMoments) /~ standardErrors;
숫자는에서 distributionMoments
와 standardErrors
위의 첫 번째 실행에서 왔습니다. 이제 샘플 생성이 올바른 경우 편차의 숫자는 상대적으로 작아야합니다. 나는 그것들이 대략 정규 분포되어 있다고 가정합니다. 4보다 큰-분포 모멘트에서 표준 오차를 4 배 이상 벗어난 표본 모멘트에 해당합니다. 샘플 생성이 양호하면 무작위로 발생할 가능성이 거의 없습니다. 다른 한편으로, 처음 10 개의 샘플 모멘트가 분포 모멘트를 0.5 % 미만으로 맞추면 분포의 근사치가 상당히 좋습니다.
이 두 가지 방법이 모두 작동하는 이유는 샘플 생성 코드와 기호 코드가 거의 완전히 분리되어 있다는 것입니다. 둘 사이에 겹침이 있으면 해당 겹침의 오류가 샘플 생성과 검증에서 모두 나타날 수 있으므로 포착되지 않습니다.