통계적 방법으로 컴퓨터 성능을 벤치마킹하려면 빅 데이터 , 우리는 무작위 데이터를 생성하고 그에 대한 성능을 측정 할 수 있습니다. 시뮬레이션 데이터가 실제 데이터와 동일하게 작용하지 않을 수도 있습니다. 알아 보자.
로지스틱 회귀
우리가 로지스틱 회귀를 벤치마킹한다고 가정 해보십시오. 그래서 우리는 임의의 유니폼으로 회귀 변수를 만들고 회귀 변수의 영향을받는 범주 형 응답을 만듭니다. 우리는 백만 행을 사용합니다. 다음은이를 수행하는 스크립트의 예입니다.
dt = newTable ( "BenchmarkLogistic.jmp");
dt <
dt <
dt <
dt <
dt <
(RandomUniform () <1 / (1 + Exp (- (: X1-X2 + X3))), "Y", "N"))));
이제 Fit Model을 다음과 같이 실행합니다. JMP 시간되다.
startTime = TickSeconds ();
모델에 맞춤 (
Y (: YCat),
효과 (: X1, : X2, : X3),
개성 (명목상의 물류),
실행 (우도 비율 테스트 (1), Wald 테스트 (0))
);
firstTime = TickSeconds () - startTime; 쇼 (firstTime);
내 컴퓨터에서 이것은 실행됩니다. 6.53 초 . 백만 줄에 나쁘지 않습니다.
이 데이터를 비교하기 위해이 데이터를 다른 시스템으로 전송하고 싶었지만 임의의 균일 한 숫자로 모든 소수 자릿수를 갖는 것은 불편했습니다. 소수점 이하를 반올림하면 벤치 마크가 제대로 작동하므로 Round 함수를 추가하여 데이터 생성기 스크립트를 변경했습니다.
dt = newTable ( "BenchmarkLogistic2.jmp");
dt <
dt <
dt <
dt <
dt <
(RandomUniform () <1 / (1 + Exp (- (: X1-X2 + X3))), "Y", "N"))));
이제는 모든 반올림을 제외하고는 동일한 로지스틱 회귀 분석을 실행합니다. 1 초 . 예, 실행 중입니다. 6 배 빨리 둥근 데이터를 사용하여!
기계가 더 많은 소수점 이하의 산술 연산을 수행해야합니까? 당연히 아니지. 십진법 연산을 사용하지 않습니다. 이것은 2 진수로 변환되며 비트는 둘러싸 지 않은 데이터까지 확장됩니다.
그래서 수수께끼의 원인은 무엇입니까?
음, 3 개의 X가 있기 때문에 각 X에 대해 11 개의 가능한 값만 있으면 3 개의 변수에 대해 1,331 개의 고유 한 조합 만 존재한다는 것을 알 수 있습니다. Logistic 플랫폼은 실제로 데이터의 모든 고유 한 조합을 파악합니다. 매치가 많으면 관찰을 결합하고 고유 한 조합을 반복 할 수 있습니다. 따라서 물류에있어서 대부분의 컴퓨팅은 1 백만 행 모두가 아니라 1,331 가지 조합으로 이루어졌습니다. 따라서, 6.53 초 대신에 단지 1 초.
Logistic을 사용하기위한 교훈은 무엇입니까? 많은 양의 데이터가 있더라도 행 수보다 많은 값의 고유 한 조합 수입니다.
그리고 시뮬레이션 된 데이터를 사용하기위한 교훈은 무엇입니까? 소수의 레벨을 예상하는 경우 변수가 연속적이라도 연속 임의 분포가 아닌 고유 한 값으로 시뮬레이트해야합니다.
이제는 회귀 자 수가 적으므로 고유 한 조합을 쉽게 활용할 수 있습니다. 하지만 회귀 변수의 수가 증가하면 데이터를 소수의 고유 한 조합으로 축소 할 가능성이 줄어 듭니다.
기타 피팅 플랫폼
다른 피팅 플랫폼이이 그룹화를 수행합니까? Least Squares 특성은 고유 한 조합도 찾지 만 계산 속도를 높이 지 않습니다. 그것은 적합 테스트의 부족에 대한 그들을 찾아야합니다. 하지만 수천만 개의 행이 있으면이 적합성 테스트가 제대로 수행되지 않을 수 있으며 테스트는 일반적으로 큰 경우에는 흥미롭지 않습니다. 그런 다음, 작업 속도를 높이기 위해 행 수가 2 만 개 이상인 경우 적합하지 않을 경우 기본값이 변경되므로 일반적으로 원하지 않는 작업을 수행하지는 않습니다.
결정 트리와 같은 다른 경우의 데이터는 어떻습니까? 시뮬레이션 된 데이터가 고유하거나 둥근 경우 차이가 있습니까? 네, 그렇습니다. X 값으로 정렬 할 때, 다시 비교할 필요가 없도록 옆으로 쳐서 관계를 취합니다. 따라서 값이 적을수록 정렬이 빠릅니다.
클러스터링
클러스터링은 어떻습니까? 속도 측정을 위해 데이터가 임의로 생성되는 방식이 중요합니까?
세부 사항이 달라지는 지 확인하기 위해 4 세트의 시뮬레이션 데이터를 생성하기로 결정했습니다. 순수하고 독립적이며 정상적인 무작위 데이터로 시작했습니다 : 10,000 행 50 열. 클러스터 시간은 28.83 초 .
이제 현실 세계에서 데이터는 독립적이지 않습니다. 상관 관계가 있습니다. 그래서 다음 실행은 같은 종류의 데이터 였지만 상관 관계가 높아졌습니다. 각 열은 .95의 상관 관계를가집니다. 클러스터하는 시간은 오직 4.18 초 - 6 배 빠른 속도 !
그게 왜 그랬을까요? 이러한 상관 관계를 통해 주 구성 요소를 사용하면 변형의 95 %가 첫 번째 주 구성 요소에 있음을 알 수 있습니다. 따라서 점 사이의 거리를보고 멀리 떨어진 거리 루프를 비교할 때 거리 루프를 짧게 자르면 대부분의 경우 알아야 할 첫 번째 요소 만 살펴 봐야합니다. 어떤 거리가 가장 작지 않다는 것을 계층 적 클러스터에서 우리는 항상 단일 값 분해 (SVD) 데이터를 클러스터하기 전에 알고리즘이 더 빠르게 실행되도록합니다. SVD는 일반적으로 계층 적 클러스터링보다 훨씬 저렴하므로 일반적으로 지불할만한 가격입니다.
그러나 현실 세계는 데이터가 덩어리로되어 있습니다. 그렇지 않으면 클러스터링을하지 않을 것입니다. 데이터가 공간 전체에 고르게 퍼지기보다는 자연스러운 클러스터에 있으면 더 빠릅니까? 상관 관계가없고 덩어리 인 일련의 데이터가 생성되었는데, 여기에는 각 덩어리마다 100 개의 잘린 덩어리가있었습니다. 클러스터하는 시간은 오직 2.83 초 . 데이터가 자연스럽게 클러스터링되면 주변을 더 잘 정리하기 때문에 가까운 이웃을 검색하는 것이 더 빠릅니다.
응집력과 높은 상관 관계를 결합하면 어떨까요? 이 경우, 시간은 0.98 초 , 29 배 빠른 비록 우리가 시작했을 때보 다 데이터가 동일한 크기와 한계 분포를 가지고 있었지만.
|
| 무관계 랜덤 |
|
28.833|
| 상관 무작위 |
|
4.183|
| 상관없는 덩어리 |
|
2.833|
| 상관 관계가있는 덩어리 |
|
0.983
이제 다른 클러스터링 프로그램에서 이와 동일한 벤치 마크를 수행하면 어떻습니까? 고전적인 계층 적 클러스터링 알고리즘은 느리고 항상 n ^ 3 * p 시간에 비례하는 것을 사용합니다. 하지만 JMP가 SVD를 사용하고 Ward의 방법에 매우 빠른 근접 버전을 사용하기 때문에 고전적인 방법보다 훨씬 빠릅니다. 비록 데이터의 속도에 따라 다르지만 고전적인 방법은 훨씬 일관성이 있으며 물론, 훨씬 느린.
// 무관계 랜덤
dtUncorr = asTable (J (10000,50, RandomNormal ()));
startTime = TickSeconds ();
dtUncorr <
timeUnCorr = TickSeconds () - startTime;
// 상관 관계가있는 임의
theCorr = .05 * 동일성 (50) +. 95 * J (50,50);
dtCorr = asTable (J (10000,50, RandomNormal ()) * Cholesky (theCorr)`);
startTime = TickSeconds ();
dtCorr <
timeCorr = TickSeconds () - startTime;
// Uncorrelated Clumped 무작위 100 덩어리, 덩어리 당 100 개
dtClumped =
AsTable (DirectProduct (J (100,50,20 * RandomUniform ()), J (100,1,1)) +. 1 * J (10000,50, RandomNormal ()));
startTime = TickSeconds ();
dtClumped <
timeClumped = TickSeconds () - startTime;
// Correlated Clumped 무작위 100 개의 덩어리, 덩어리 당 100 개
data = DirectProduct (J (100,50,20 * RandomUniform () - 10), J (100,1,1)) + .1 * J (10000,50, RandomNormal ());
dtClumpedCorr = AsTable (데이터 * 콜레 스키 (theCorr)`); 데이터 = 0;
startTime = TickSeconds ();
dtClumpedCorr <
timeClumpedCorr = TickSeconds () - startTime;
분류
JMP의 다른 장소는 어떻습니까? 데이터의 특성이 무엇인지는 중요합니까?
네, 그렇습니다. 일반적으로 카테고리가 너무 많지 않으면 카테고리별로 빠르게 처리됩니다. 범주의 수준이 5,000보다 적 으면 연관 배열 방법을 사용하여 범주를 만들고 다중 스레딩을 활용합니다. 그러나 5,000 개 이상의 레벨이 있고 특히 수백만 개의 레벨이있는 경우 메모리 할당 부담이 높아지며 정렬 방법이 대신 사용됩니다.
결론
시뮬레이션 된 데이터를 사용하여 메소드의 성능을 벤치마킹해야하는 경우 시뮬레이션 할 속성은 중요합니다. 결국 적용하려는 데이터의 속성을 복제하는 것이 가장 좋습니다.
요컨대, 그것은 달려있다. ; 세부 사항이 중요합니다.
JMP는 실제 데이터의 전형적인 특성을 이용하기 위해 노력합니다.
노트 : 이것은 John Sall의 블로그 게시물 Big Statistics 시리즈의 일부입니다. 그의 모든 것을 읽으십시오. 큰 통계 게시물 .