第 1 項
第 1 項中具有挑戰性的部分挑戰 10不是代碼,而是圍繞分位數定義的複雜性。 首先,讓我們保持事物分佈的獨立性,並直接處理值的排名順序,而不是直接處理值。 也就是說,我們按升序對值進行排序,並根據它們在該順序中出現的位置對其進行編號。 我們需要決定如何處理關係。 我們可以繼續按順序對它們進行排序或賦予它們相同的值。 前者的缺點是我們可能在多個組中出現相同的值。 後一種方法的缺點是每組的項目數量可能不太平衡。 這兩種方法對應於排行和排名並列JSL 函數。 我們還沒有討論在第二種方法中賦予關係什麼價值。 我們可以給他們所有的下一個順序排名順序值。 或者,我們可以平均順序排列的值。 在這兩種情況下,我們可能希望為下一個連續的非綁定值賦予它在沒有綁定的情況下會收到的排名。 排名並列平均排名,為了簡單起見,我們將使用它。
下一個問題是如何劃分組。 我們可以嘗試盡可能平均地劃分它們。 一個簡單的方法是按順序排列至少地面( N / G ) 每組中的項目(其中N它是項目的總數和G是分位數組的數量)。 我們必須決定把N —— G *地面( N / G ) < G附加值。 下面的代碼簡單而整潔地處理了所有這些:
天花板(Ranking(inVec)/(N Row(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行列)作為頻率多變的。 這避免了從原始表更新值的需要,該值可能相當大。 代碼可以在聚合組. 除了計數(等級)的向量等級順序之外,匯總中的原始組值列表還存儲在全局變量組中。 移動滑塊運行聚合低計數函數,其中請求組數( nGroups ) 根據滑塊的位置傳遞。 組的數量可以很容易地從秩向量中選擇。 例如,如果需要總共 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 是值得的。 我用來測試這兩種方法的代碼在Loc 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
);
如果我想處理更一般、更大的事情,比如為 Les Misérables 的英文翻譯中出現的所有單詞建立一個字典,該怎麼辦? 讓我們首先假設一個單詞僅由字母字符組成,可能包括標準 ASCII 字符集之外的字母(例如,帶有變音符號的字母)。 其他一切都是分隔符。 這裡的挑戰是我們不確定我們可能會遇到哪些分隔字符。 由於我們知道單詞由哪些字符組成,我們可以假設它不在列表中,它是一個分隔符。
模式匹配有完美的工具來查找我們將用來構建字典的單詞:帕特跨度和帕特休息.我們可以用字,但是我們必須檢查每個項目是否有嵌入的分隔符。 使用模式匹配讓我們一步完成所有事情。 代碼如下。 整個過程耗時 8 到 9 秒。 要將代碼應用於不同的文本,可能需要進行一些微調,例如包含附加字符並將文件保存為不同的編碼(我使用 utf-16 來捕獲擴展的 ASCII 字符)。 我虧欠@Craige_Hales在我努力讓它工作之後幫助我解決這個問題。 Les Misérables 的文本文件是從古騰堡計劃. 你可以找到它這裡.
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>
好的! 這嘗試() 用於關聯數組的構造插入()可能比首先測試現有元素更快。
當我還年輕到可以進入閱讀圈時,我的一個經常旅行的朋友必須閱讀帶有這個詞的段落優勝美地,這是我從未遇到過的。 我記得被他的四音節發音嚇了一跳,注意到老師驚喜。
多年後,有人告訴我我可以說跛腳是羅布並獲得足夠正確的戲劇名稱以避免引起注意。