第 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>
好的! 这尝试() 用于关联数组的构造插入()可能比首先测试现有元素更快。
当我还年轻到可以进入阅读圈时,我的一个经常旅行的朋友必须阅读带有这个词的段落优胜美地,这是我从未遇到过的。 我记得被他的四音节发音吓了一跳,注意到老师惊喜。
多年后,有人告诉我我可以说跛脚是罗布并获得足够正确的戏剧名称以避免引起注意。