統計的方法でコンピュータ性能をベンチマークするにはビッグデータランダムデータを生成してその上でパフォーマンスを測定することができます。まあ、シミュレートされたデータが実際のデータと同じように機能しない可能性があります。確認してみましょう。
ロジスティック回帰
ロジスティック回帰をベンチマークしているとしましょう。そのため、いくつかのリグレッサをランダムなユニフォームとして作成し、リグレッサの影響を受けるカテゴリカル応答を作成します。100万行を使用しています。これを行うためのスクリプトの例を次に示します。
dt = newTable( "BenchmarkLogistic.jmp");
dt <
dt <
dt <
dt <
dt <
(Random Uniform()<1 /(1 + Exp( - (:X 1 −X 2 + X 3)))、「Y」、「N」)))の場合。
今度はFit Modelを実行します。 JMP そしてそれを時間を計る。
startTime = TickSeconds();
モデルに合わせる(
Y(:YCat)
効果(:X1、:X2、:X3)、
性格(名義ロジスティック)、
実行(尤度比検定(1)、Wald検定(0))
;
firstTime = TickSeconds() - startTime。show(firstTime);
私のマシンでは、これはで実行されます 6.53秒 。百万行も悪くありません。
このデータを別のシステムに転送して比較したかったのですが、これらの小数点以下の桁数をすべてランダムな一様数にするのは厄介でした。ベンチマークは、小数点以下第2位を四捨五入しても同様に機能するはずです。そのため、Round関数を追加してデータジェネレータスクリプトを変更しました。
dt = newTable( "BenchmarkLogistic2.jmp");
dt <
dt <
dt <
dt <
dt <
(Random Uniform()<1 /(1 + Exp( - (:X 1 −X 2 + X 3)))、「Y」、「N」)))の場合。
今、私は丸めを除いてすべて同じことで同じロジスティック回帰を実行します、そしてそれはかかります 1秒 。はい、走ります 6倍の速さ丸めデータを使用して!
機械は、小数点以下の桁数を増やして算術演算を行うのが難しくなりますか?もちろん違います。それは10進演算さえ使用しません。これは2進数に変換され、ビットは非接地データと同じぐらいまで広がります。
それで、何が謎を説明しますか?
それは、各Xに11個の可能な値があるだけで、3つのXがあるので、3つの変数には1,331個の固有の組み合わせしかないことがわかります。 Logisticプラットフォームは、実際にはデータ内のすべての固有の組み合わせを見つけ出します。そして、たくさんの一致があるとき、それは観測を結合し、そして単にユニークな結合を通して反復することができます。そのため、ロジスティックでは、ほとんどのコンピューティングは100万行すべてではなく、1,331通りの組み合わせで行われました。したがって、6.53秒ではなく1秒だけです。
では、Logisticを使用するためのレッスンは何ですか?大量のデータがある場合でも、行数よりも多いのは、値の固有の組み合わせの数です。
そして、シミュレートされたデータを使うための教訓は何ですか?変数が連続的であっても、少数のレベルが予想される場合は、連続的なランダム分布ではなく、その少数の固有値でシミュレーションする必要があります。
今では少数のリグレッサーで、ユニークな組み合わせを利用するのは簡単です。ただし、リグレッサの数が増えるにつれて、データを少数の固有の組み合わせに縮小できる可能性はますます少なくなります。
その他のフィッティングプラットフォーム
他のフィッティングプラットフォームはこのグループ分けをしますか?Least Squaresパーソナリティはユニークな組み合わせも探しますが、計算をスピードアップするためではありません。それはフィットテストの欠如のためにそれらを見つける必要があります。 しかし、何千万もの行がある場合、この不適合テストに数秒かかることがあります。テストは、大規模なケースでは通常あまり面白くありません。そのため、処理を高速化するために、行数が20,000以上になると、デフォルトでは適合性の欠如がオフになるように変更されるため、通常は不要なことに時間を費やすことはありません。
決定木など、他の場合のデータについてはどうですか。シミュレートされたデータが一意であるか丸められているかによって違いが生じますか?はい、そうです。それらのX値でソートしているとき、それらを再び比較する必要がないようにそれらを横にずらすことによって関係を利用します - あなたが持っている値が少なければ少ないほど、ソートは速くなります。
クラスタリング
クラスタリングはどうですか?速度を測定するためにデータがランダムに生成される方法は重要ですか。
詳細が違いを生み出すかどうかを確認するために、4セットのシミュレーションデータを生成することにしました。 私は純粋で独立した通常のランダムデータから始めました:10,000行×50列。クラスタ化する時間は 28.83秒 。
今、現実の世界では、データは独立していません。それは相関しています。そのため、次の実行は同じ種類のデータでしたが、相関性が高いように変換されました。各列は他の列との相関が.95でした。 クラスタリングする時間はそれだけでした 4.18秒 - 6倍以上速い !
なぜそうなるのでしょうか。これらの相関関係では、主成分を取ると、変動の95%が最初の主成分にあることがわかります。したがって、ポイント間の距離を調べていて、比較している距離よりも長い距離になったときに距離ループをショートカットする場合は、ほとんどの場合、最初の要素だけを見ればわかります。いくらかの距離は最小ではありません。階層的クラスタでは、常に特異値分解アルゴリズムが高速に実行されるように、クラスタ化する前にデータの(SVD)を計算します。 SVDは一般的に階層的クラスタリングよりはるかに安価であるため、これは通常支払う価値があります。
しかし、現実の世界ではデータがまとまっています。そうでなければ、クラスタリングは行われません。データが空間全体に均等に広がっているのではなく、自然なクラスターになっていると速くなりますか。我々は一組の相関していないがまとまりのないデータを生成した。そこでは、各まとまりに100ポイントを有する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 = 0.05 * Identity(50)+ .95 * J(50,50)。
dtCorr = asTable(J(10000,50、RandomNormal())* Cholesky(theCorr) `);
startTime = TickSeconds();
dtCorr <
timeCorr = TickSeconds() - startTime;
// 100個のクランプ、1個のクランプにつき100個
dtClumped =
AsTable(DirectProduct(J(100,50,20 * RandomUniform())、J(100,1,1))+。1 * J(10000,50、RandomNormal()));
startTime = TickSeconds();
dtClumped <
timeClumped = TickSeconds() - startTime;
//相関付けられたランダムな100個の塊、塊ごとに100個
データ= DirectProduct(J(100,50,20 * Random Uniform() - 10)、J(100,1,1))+ 1 * J(10000,50、Random Normal());
dtClumpedCorr = AsTable(データ*コレスキー(theCorr) `);データ= 0。
startTime = TickSeconds();
dtClumpedCorr <
timeClumpedCorr = TickSeconds() - startTime;
分類する
JMPの他の場所はどうですか?データの特性はどうですか。
はい、そうです。一般的に、カテゴリの数がそれほど多くない場合は、カテゴリのほうが速くなります。カテゴリのレベルが5,000未満の場合は、連想配列メソッドを使用してカテゴリを作成し、マルチスレッドを利用します。ただし、5,000を超えるレベルがある場合、特に何百万ものレベルがある場合は、メモリ割り当ての負担が大きくなり、代わりにソート方法が使用されます。
結論
シミュレートしたデータを使用してメソッドのパフォーマンスをベンチマークする必要がある場合は、どのプロパティを使用してシミュレーションするかが重要です。最終的に適用したいデータのプロパティを複製することをお勧めします。
要するに、場合によります ;詳細が重要です。
JMPは実際のデータの典型的な特性をうまく利用しようとします。
注意: これはJohn Sallによるブログ記事のBig Statisticsシリーズの一部です。彼のすべてを読むビッグ統計の投稿 。