項目 1
ここの項目 1 の難しい部分は、チャレンジ 10問題はコードではなく、分位数の定義に関する複雑さです。 まず、分散を独立させて、値を直接扱うのではなく、値の順位を操作してみましょう。 つまり、値を昇順に並べ替え、その順序で出現する場所に応じて番号を付けます。 絆をどうするかを決める必要がある。 それらを順番にランク付けし続けることも、同じ値を与えることもできます。 前者の欠点は、同じ値が複数のグループに現れる可能性があることです。 後者のアプローチの欠点は、グループごとの項目数のバランスが崩れる可能性があることです。 これら 2 つのアプローチは、ランキングと順位タイJSL関数。 2 番目のアプローチでネクタイにどのような値を与えるかについてはまだ話していません。 すべてに次の連続した順位の値を与えることができます。 あるいは、連続してランク付けされた値を平均することもできます。 どちらの場合も、おそらく、次の連続する非同値の値に、同点がなかった場合に受け取られるであろうランクを与える必要があるでしょう。 順位タイはランクを平均します。簡単にするためにこれを使用します。
次の問題は、グループをどのように分けるかです。 それらをできるだけ均等に分割するように努めることができます。 これを行う簡単な方法は、少なくとも床( N / g ) 各グループ内の項目 (ここで、 Nそれはアイテムの総数であり、 gは分位グループの数です)。 どこに置くかを決めなければなりませんN – g *床( N / g )< g追加の値。 以下のコードは、これらすべてを簡単かつ適切に処理します。
天井(ランキング(inVec)/(N列(inVec)/quant))
どこインベックは入力 (列) ベクトルであり、量的分位グループの数。
上記のコードにより、結合された値がグループ間で分割される可能性があります。 これを避けるために、次のように置き換えることができますランキングと順位タイ。 完全な関数の例を以下に示します。
quantileGroup = Function({inVec,quant=10,method=1},{outVec,sumTblRef,ranks},
inVec = Shape(inVec,N Row(invec)*N Col(inVec),1);
If(method ==1,
outVec = Ceiling(Ranking(inVec)/(N Row(inVec)/quant)),
outVec = Ceiling(Ranking Tie(inVec)/(N Row(inVec)/quant))
);
outVec;
);
項目 2
低カウントのグループを集計するには、さまざまな方法があります。観測値の絶対数、観測値の相対数 (最大グループの 10% 未満のカウントを持つグループなど)、グループの総数の固定などです。には長所と短所があります。 柔軟なソリューションを提供するために、私はインタラクティブかつ視覚的なアプローチを採用し、スライダーを使用して調整可能な棒グラフで管理することにしました。 こうすることで、適切に見えるグループの分布が見つかるまでスライダーを前後に動かすことができます。 難しかったのは、グループの数が多い場合に高速なコードを思いつくことでした。 わかりやすくするために、データ テーブルの操作とプラットフォーム (自動再計算オン)。 以下は、その前後でどのようになるかを示す例です。
前

後

一般に、このコードは、グループから要約テーブルを作成し、グループ数 ( N 行列)として周波数変数。 これにより、かなり大きくなる可能性がある元のテーブルから値を更新する必要がなくなります。 コードは次の場所にあります集約グループ.JSL 。 カウント (ランク) のベクトル順位に加えて、サマリーからの元のグループ値のリストがグローバル変数グループに保存されます。 スライダーを動かすと、集計低カウントグループの数を要求する関数 ( nグループ) はスライダーの位置に基づいて渡されます。 グループの数はランクベクトルから簡単に選択できます。 たとえば、合計 10 のグループが必要な場合、ランク 10 以上の元のグループの値が集約グループ値 (たとえば、「その他」) に設定され、他のすべてのグループは同じままになります。 テーブルはソートされているため、行 10 以降の値を変更するだけで済みます。
項目3 / 項目4
この項目に対する私の動機は、項目 4 の前身としてのものでした。 連想配列 (AA) 内で何かを見つけるのは、を使用するよりもはるかに高速です。ロック。 の 209,405 語を使用して AA を構築する単語リスト.JMP私のコンピュータでは 12 秒弱かかりました。 以下の表は、次のいずれかを使用してテーブルからランダムな単語のリストを見つけるのにかかる時間を示しています。ロックまたはAA。
Nワード
|
ロック (秒)
|
連想配列 (秒)
|
1
|
0.19
|
0.000045
|
5
|
0.91
|
0.000127
|
10
|
1.78
|
0.000244
|
25
|
4.51
|
0.000592
|
50
|
9.11
|
0.001019
|
70
|
12.47
|
0.001454
|
100
|
17.82
|
0.002155
|
70 単語を超えるリストの場合は、AA を構築する価値があります。 これら 2 つのアプローチをテストするために使用したコードは次のとおりです。ロック vs AA.JSL 。
AA を検索可能なデータ構造として使用することには利点と欠点があります。 プラスの面としては、他の AA を含む任意の値を AA キーに関連付けることができます。 欠点は、キーが一意である必要があること (私の選択肢では大したことはありません)、そしてさらに重要なことに、検索値がキーのリストにない場合は検索プロセスを拡張する必要があることです。 つまり、考えられるすべての検索値が事前にわかっている場合は実装が比較的簡単ですが、そうでない場合は少し難しくなります。 これは、それらを使用できないという意味ではありません。もう少し巧妙になる必要があるだけです。 以下のコードのようなものは機能します項目 3 でタグ付けされた投稿で言及されているケース。 少し面倒で、場合によっては遅くなる可能性がありますが、非常に柔軟です。 連想配列の内容を変更するだけで、検索辞書が変更される状況に簡単に適応できます。
aaMap = Associative Array(
{"1","2","3","4","5","6","7","8","9","0","M","K"},
{"1","2","3","4","5","6","7","8","9","0","e6","e3"}
);
findAndReplace = Function({inList,aaMap},
outNums = Transform Each({nextString},inList,Output("Matrix"),
nextChars = Items(nextString,"");
Num(Concat Items(Transform Each({nextChar},nextChars,aaMap[nextChar]),""));
);
outNums
);
レ・ミゼラブルの英語訳に登場するすべての単語の辞書を作成するなど、もう少し一般的で大きなことに取り組みたい場合はどうすればよいでしょうか? まず、単語がアルファベット文字のみで構成されており、これには標準 ASCII 文字セット以外の文字 (発音記号が付いているものなど) も含まれる可能性があります。 それ以外はすべて区切り文字です。 ここでの課題は、どのような区切り文字が発生するかわからないことです。 どの文字が単語を構成するかはわかっているので、リストにない文字は区切り文字であると推測できます。
パターン マッチングには、辞書の作成に使用する単語を見つけるための完璧なツールが備わっています。パット・スパンとパットブレイク。使えます言葉, しかし、その場合、各項目に埋め込まれた区切り文字をチェックする必要があります。 パターン マッチングを使用すると、すべてを 1 ステップで実行できます。 コードは以下の通りです。 プロセス全体には 8 ~ 9 秒かかりました。 コードを別のテキストに適用するには、追加の文字を含めたり、ファイルを別のエンコーディングで保存したりするなど、いくつかの微調整が必要になる場合があります (拡張 ASCII 文字をキャプチャするために utf-16 を使用しました)。 お世話になっております@Craige_Hales私がこれを機能させるのに苦労した後、これを手伝ってくれてありがとう。 レ ミゼラブルのテキスト ファイルは、次の場所からダウンロードされました。プロジェクト・グーテンベルク。 見つけられますよここ。
bigText = Load Text File("Les Misérables.txt");
aaLookup = Associative Array();
letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZé´É";
wordLoc = 0;
Pat Match(bigText,
Pat Repeat(
(
Pat Pos() >> nextLoc
+ Pat Span( letters ) >> nextWord
+ Pat Test(
Try(
Insert Into(aaLookup[Lowercase(nextWord)],nextLoc),
aaLookup<<INSERT></INSERT>
良い! の試す() 連想配列に使用している構造体() に挿入最初に既存の要素をテストするよりも高速な場合があります。
私が読書サークルに参加できるほど若かったとき、よく旅をした友人の一人が、この言葉が含まれる一節を読むことになりました。ヨセミテ、私は遭遇したことがありませんでした。 彼の 4 音節の発音にびっくりし、先生がうれしそうに驚いていたのを覚えています。
数年後、誰かが私にこう言ってもいいと言ったラメはロブですそして、注意を逃れられる程度に正確な劇名を付けてください。