用統計方法對計算機性能進行基準測試大數據 ,我們可以生成隨機數據並測量性能,對嗎?嗯,模擬數據可能與真實數據的行為不同。讓我們來看看。
Logistic回歸
假設我們正在對邏輯回歸進行基準測試。因此,我們將一些回歸量創建為隨機均勻,並創建受回歸量影響的分類響應。我們使用了一百萬行。以下是執行此操作的腳本示例:
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秒 。是的,它運行六倍的速度通過使用舍入數據!
機器是否必須更加努力地使用更多的小數位進行算術運算?當然不是。它甚至不使用十進制算術。它被轉換為二進制,並且位擴展到與未接地數據一樣遠。
那麼神秘的原因是什麼呢?
好吧,事實證明,每個X只有11個可能的值,因為有三個X,這三個變量只有1,331個唯一組合。 Logistic平台實際上計算出數據中的所有獨特組合。當有很多匹配時,它能夠組合觀察並只是迭代獨特的組合。所以對於物流來說,大多數計算是在1,331種組合上完成的,而不是所有100萬行。因此,只有一秒而不是6.53秒。
那麼使用Logistic的教訓是什麼?即使您擁有大量數據,也只是值的唯一組合數量超過行數。
使用模擬數據的教訓是什麼?如果您期望少量級別,即使變量是連續的,您也應該使用少量唯一值進行模擬,而不是連續隨機分佈。
現在只需少量回歸量,就可以輕鬆利用這些獨特的組合。但隨著回歸量的增加,將數據折疊成少量獨特組合的可能性越來越小。
其他配件平台
其他擬合平台是否進行此分組?最小二乘的個性也尋找獨特的組合,但不是為了加速計算。它需要找到它們缺乏適合性測試。 但事實證明,如果你有數千萬行,它可能花費幾秒鐘來完成這種缺乏擬合測試,並且測試對於大型案例通常並不常見。那麼,為了加快速度,當行數為20,000或更多時,它會更改缺少擬合的默認值,以便它不會花費所有時間來做一些通常不需要的事情。
那些其他情況下的數據如決策樹呢?如果模擬數據是唯一的或舍入的,它會有所不同嗎?是的,它確實。當它按這些X值進行排序時,它會利用關係將它們放在一邊,這樣它們就不需要再次進行比較 - 所以你擁有的值越少,排序就越快。
聚類
集群怎麼樣?數據如何隨機生成以測量速度是否重要?
我決定生成四組模擬數據,看看細節是否有所不同。 我從純粹,獨立,正常,隨機的數據開始:10,000行乘50列。集群的時間是 28.83秒 。
現在,在現實世界中,數據並不是獨立的。它是相關的。所以下一次運行是相同類型的數據,但轉換為高度相關;每列與其他列的相關性為.95。 集群的時間只是 4.18秒 - 快了六倍多 !
那為什麼會這樣呢?事實證明,使用這些相關性,如果你採用主成分,95%的變化是在第一個主成分中。因此,如果您正在查看點之間的距離 - 並且當您獲得的距離超過您所比較的距離時縮短距離循環 - 那麼大部分時間,它只需要查看第一個元素以便知道有些距離不是最小的。在分層集群中,我們總是做一個奇異值分解 (SVD)數據在我們聚類之前使算法運行得更快。 SVD通常比層次聚類便宜很多,所以這通常是值得付出的代價。
但現實世界的數據是叢集,否則我們就不會進行聚類。如果數據是在自然集群中而不是在整個空間中更均勻地傳播,它會更快嗎?我們生成了一組不相關但結塊的數據,其中有100個分離良好的團塊,每個團塊中有100個點。集群的時間只是 2.83秒 。當數據自然聚集時,對鄰近鄰居的搜索更快,因為它更好地組織了空間。
如果你結合了clumpiness和高相關性怎麼辦?在那種情況下,時間會減少到 0.98秒 ,快了29倍比起我們開始時,即使數據具有相同的大小和邊際分佈。
|
| 不相關的隨機 |
|
28.833|
| 相關隨機 |
|
4.183|
| 不相關的叢生 |
|
2.833|
| 相關的Clumpy |
|
0.983
現在,如果您在不同的群集程序中執行這些相同的基準測試,該怎麼辦?經典的分層聚類算法很慢,總是採用與n ^ 3 * p時間成比例的東西。但是由於JMP使用SVD和非常快速的近鄰版Ward方法,它比經典方法快得多 - 雖然它取決於數據的速度有多快,而經典方法更加一致,當然,慢得多。
//不相關的隨機數
dtUncorr = asTable(J(10000,50,RandomNormal()));
startTime = TickSeconds();
dtUncorr <
timeUnCorr = TickSeconds() - startTime;
//相關隨機
theCorr = .05 * Identity(50)+。95 * J(50,50);
dtCorr = asTable(J(10000,50,RandomNormal())* Cholesky(theCorr)`);
startTime = TickSeconds();
dtCorr <
timeCorr = TickSeconds() - startTime;
//不相關的叢生隨機100個團塊,每叢100個
dtClumped =
非穩態(DirectProduct(j(100,50,20 * RandomUniform()),J(100,1,1))+ 1 *∫(10000,50,RandomNormal())。);
startTime = TickSeconds();
dtClumped <
timeClumped = TickSeconds() - startTime;
//相關的叢生隨機100個團塊,每叢100個
data = DirectProduct(J(100,50,20 * RandomUniform() - 10),J(100,1,1))+。1 * J(10000,50,RandomNormal());
dtClumpedCorr = AsTable(data * Cholesky(theCorr)`); data = 0;
startTime = TickSeconds();
dtClumpedCorr <
timeClumpedCorr = TickSeconds() - startTime;
分類
那麼JMP的其他地方呢?數據的特徵是什麼重要嗎?
是的,它確實。一般來說,如果沒有太多的類別,事情會更快。如果類別的級別少於5,000,則它使用關聯數組方法來創建類別,並且還利用多線程。但是,如果有超過5,000個級別,特別是如果有數百萬級別,則內存分配負擔會變得昂貴,而是使用排序方法。
結論
如果您需要使用模擬數據對方法的性能進行基準測試,那麼您要模擬的屬性很重要 - 最好嘗試複製要最終應用它的數據的屬性。
簡而言之,這取決於 ;細節很重要。
JMP很難利用實際數據的典型屬性。
注意: 這是John Sall撰寫的Big Statistics系列博客文章的一部分。讀完他的全部內容大統計帖子 。