罗兰在MATLAB的艺术

把想法变成MATLAB

请注意

罗兰在MATLAB的艺术已经存档,不会被更新。

相似(或不)——第二个Wordle跳动

今天的嘉宾是马特•Tearle工作团队,创建我们的在线培训内容,如我们的不同 斜坡弯道课程 开始在MATLAB仿真软件和应用程序。金宝app马特写了几个博客在过去,通常是因为一个谜,今天也不例外。

树桩(v:造成损失;挡板)

Wordle。它吸引了我们所有人。当 亚当写他的文章 使用MATLAB解决Wordle拼图,我一直想做同样的事情。(在过去,我写代码来作弊 和《纽约时报》 拼字比赛 谜题。)我看到其他朋友篇关于信分布。我想这就是书呆子。
当我读到亚当的帖子,我知道我必须看看我可以做的更好。我的第一想法是什么读者彼得·威滕伯格建议:权重概率的信,他们发生在这个词。然后我尝试了接近另一个读者,TallBrian,建议,通过得分词根据他们减少多少的可能性在未来。我也尝试了如何选择新字母最多的词。
但是毫无效果。我不能做出任何重大改进亚当的94%的成功率。他指出,有一些单词在官方Wordle佳能没有设置用于开发的算法。我开始怀疑了。我的data-senses刺痛。

检查(v:考试或调查;查询)

根据信中概率,有害物质是一个伟大的开放的猜测。但是我觉得我没有看到太多的以s结尾的单词,当我玩Wordle作为一个人类。也许是时间比较两个词集。在这里我只是再利用亚当的代码的两个单词列表。(称为字典单词 经常 在亚当的代码)的字符串数组 trainwords 。实际Wordle(称为列表 mystery_words 在亚当的代码) testwords
[trainwords, testwords] = getdictionaries;
类属性名称大小字节testwords 2315 x1 125106弦trainwords 4581 x1 247470弦
变量名称显示我的偏见:我现在思考这个问题就像一个机器学习的问题。一组词被用来训练算法——在这种情况下,没有一个标准的机器学习方法,但是一个定制算法基于统计数据。另一个是测试集,机器学习,任何人都知道您的模型的质量主要取决于您的数据的质量。具体地说,你需要训练数据来准确地代表实际的数据模型将被用于。
这封信怎么分布的“训练”和“测试”数据集比较?首先,我需要计算每个字母的表象的数量在每个位置(两组词):
%列出所有的大写字母(a - z)
阿兹=字符串(char ((65:90) '));
%计算分布的信件
lprobTrain = letterdistribution (trainwords, AZ);
lprobTest = letterdistribution (testwords, AZ);
名字大小字节字符串类属性AZ 26 x1 1500 lprobTest 26 1040双lprobTrain 26 x5 1040双testwords 2315 x5 x1 125106弦trainwords 4581 x1 247470字符串
我现在有两个26-by-5矩阵的每个字母的频率在每一个位置。首先,让我们看看总体布局:
%的平均在5个字母的位置
distTrain =意味着(lprobTrain, 2);
dist =意味着(lprobTest, 2);
%的阴谋
栏([distTrain,经销])
xticks(1点)
xticklabels (AZ)
xtickangle (0)
传奇(“培训”,“测试”)
ylabel (“使用比例”)
标题(“总字母分布”)
哇,将要发生的事情,果然,有一个大区别使用两个单词列表。还有比在实际的训练集的Ds Wordle集。与此同时,更多的使用有几个字母先比普通词典——最明显的是,R, T, Y。
现在我更加怀疑以s结尾的单词。让我们看看使用字母和单词的全貌的位置。如果你做任何数据分析,你可能会遇到这种情况要可视化两个离散变量的函数值。过去,你可能会使用 显示亮度图像 为此,这当然是一个可靠的老主力。但是如果你不虔诚地阅读发布说明,你可能没有意识到一些新的数据分析图表功能,如 的热图 (引入R2017a)。
热图(1:5,AZ, lprobTrain)
标题(“训练数据信分布”)
热图(1:5,AZ, lprobTest)
标题(“信分布测试数据”)
啊,甜蜜的辩护!果然,这句话我们建立我们的战略有不同的分布,常用字母在实际Wordle的话。特别注意Wordle是更有可能开始与年代比最后一个词。Es出现的分布是不同的,太。这些类型的比较,它可能更容易想象两者的区别的热图:
%的差异分布
δ= lprobTrain-lprobTest;
%找到最大的,对称设置颜色限制
dl = max (abs(δ(:)));
%可视化
嗯=热图(1:5,AZ,三角洲,“ColorLimits”,dl * [1],“Colormap”、涡轮);
标题([“信分布差异”,“红色= prevalance训练集高”,“蓝=更高的prevalance测试集”])
注意,我设置颜色限制,0是一个“中性”绿色,而蓝色或红色显示不同的方向。- s字出现明显的缺乏,也从- e - - e的末尾的单词。在一起,这意味着更少的复数(如词)和更少——动词形式(如“亚当喜欢玩Wordle”)在Wordle列表中。
有一些其他细节,但他们难以看到,因为一切都是由s字的差异。让我们手动狭窄的色彩范围来看到更多的细节。这将显示- s比它是不那么重要,但没关系,我们知道了。
嗯。ColorLimits = (-0.1 - 0.1);
现在我们可以看到一些有趣的趋势:更多的是单词(大概形容词如“这是一个愚蠢的主题博客”),以及更多- R - t,少- d字(也许是连接过去时态像“直到亚当的帖子,马特·爱玩Wordle”),更少的元音的实例作为第二封信,和R和S开关位置1 & 2。
使用这个的热图,您还可以看到,有害物质更符合培训(字典)比测试(先):每一个字母都有积极价值的热图。当字母都是高概率总体而言,这对训练集具体安排是特别好的和坏的测试集,一个简单的重排盯着逆转局势。

除了(n:一个评论或讨论,不直接与正在讨论的主题)

我注意到我的代码之间自由跳跃 字符串 , 识字课 , 分类 。你可以看到一些代码,但我先解决更自由的使用不同的类型。看似不好的编程的证据——“选择一个数据类型了!”,you cry - but I'm claiming that this is actually a good practice: MATLAB gives you lots of great data types; use them! With the introduction of strings (R2016b), we get questions like "so should we just use strings now?" and "is there any point in char instead of string?". If you're confused about this, here's a simple principle: the unit of a char is a single character, the unit of a string is text of any length. Wordle is all about words... but also all about the letters! That's why it's useful to use both string (for studying words) and char (for letters).
同时,我们专门的开发团队给我们一大堆 方便的文本功能 随着字符串。但是这些功能并不是字符串——像许多MATLAB函数,他们接受不同类型的输入。这些人接受任何形式的文本,并允许你做基本没有正则表达式的文本处理。例如,我推测,先不使用——和连接动词形式。让我们看看这些单词,末梢在每个列表:
ESDendings = @(字)字(endsWith(话说,[“西文”,“ED”)));
ESDtrain = ESDendings (trainwords) '
ESDtrain = 1×619字符串
“abb”“痛”“疼”“极致”“亩”“行为”“添加”“扁斧”“辅助”“助手”“病”“目标”“播出”“沉香”“漫谈”“什么”“aps”“弯曲”“武装”“烧成灰烬”“骨灰”“问”“驴”“轴”“基于”“宝贝”“烤”“烤”“打包”“包”
ESDtest = ESDendings (testwords) '
ESDtest = 1×23字符串
”,还是“流血”、“品种”“用”“给”“信条”“哭了”“干”“嵌入”“自由”“炸”“贪婪”“揉捏”“招摇撞骗”“探究”“不”“速度”“发现了”“马”“过”“粗花呢”“得不到支持的”“未婚”
100 *元素个数(ESDtrain) /元素个数(trainwords)
ans = 13.5123
100 *元素个数(ESDtest) /元素个数(testwords)
ans = 0.9935
手巧的 endsWith 函数做它表明,发现这句话用给定的结局。果然,训练数据字典有很多双,和连接动词,如疼痛和疼痛(13.5%的整个列表)。但Wordle几乎没有话说,是由简单的附加连接或——效率动词。因此,连接和——单词患病率低得多(只有1%)。

后来的:未来在后续的时间或阶段)

在确认信中分布确实是不同的,我被建筑能够挽救我的骄傲我的各种解决方案算法先列表,然后测试他们。现在我能够成功解决谜题99%的时间。太好了。但也有点不满意。任何数据科学家知道,训练和测试使用相同的数据集是作弊,不是一个好的测量的算法将执行新的数据。
但是…嗯,有 没有新的数据。先设置单词列表。这仍然是一个有效的问题:鉴于官方Wordle列表,解决这个问题的最好办法是什么?
不幸的是,读者指出一些细节与亚当所做的事(我)。怀疑我的“解决方案”。金宝搏官方网站所以,现在我需要继续修改。如果 纽约时报没有隐藏Wordle收费 我算出来的时候,我马上就回来。我甚至可能有足够的勇气进入internet-argument-of-the-day:最好的开始是什么单词?

回复(v:给一个答案在单词或写作;回应)

亚当的读者有一些聪明的想法如何击败这个上瘾的游戏。你们有保证打开一个单词?秘密策略,你会发现用户只有19.95美元?你是怎么找到你的,是什么让它如此伟大?让我们知道的 评论
函数(经常,mystery_words) = getdictionaries
从亚当F %复制
%的单词列表读入一个字符串数组
r = readline (“https://gist.githubusercontent.com/wchargin/8927565/raw/d9783627c731268fb2935a731a618aa8e95cf465/words”);
%替代变音符号从附录中使用自定义函数
rs = removediacritics (r);
%只保留条目以小写字母开始
rs = rs (startsWith (rs, characterListPattern (“一个”,“z”)));
%去掉撇号的条目,如收缩
rs = rs(~包含(rs,“”));
% Wordle使用所有大写字母
rs =上(rs);
%获得独特的五个字母单词的列表
经常=独特(rs (strlength (rs) = = 5));
mystery_id =“1-M0RIVVZqbeh0mZacdAsJyBrLuEmhKUhNaVAI-7pr2Y”;%来自上面的表的URL链接
mystery_url = sprintf (“https://docs.google.com/spreadsheets/d/%s/gviz/tq?tqx=out: csv”,mystery_id);
mystery_words = readline (mystery_url);
%有一组额外的包括双引号,那么让我们带出来
mystery_words =擦掉(mystery_words,”“”“);
%我们使用大写
mystery_words =上(mystery_words);
结束
函数lprob = letterdistribution(话说,AZ)
%我们的话分割成各自的信件
信=分裂(话说,”“);
%,这也创造了前导和尾随空白字符串,删除它们
字母=字母(:2:end-1);
%计算每个单词字母的分布位置
k = 1:5
lcount (:, k) = histcounts(分类(字母(:,k), AZ));
结束
lprob = lcount. /笔(lcount);%正常化
结束
%也从亚当
%的引用:吉姆·古道尔,2020年。堆栈溢出,可以在:https://stackoverflow.com/a/60181033
函数[clean_s] = removediacritics (s)
% REMOVEDIACRITICS删除从文本变音符号。
%这个函数从字符串,删除许多常见变音符号等
%——急性口音
%——严重的口音
%——弯曲的口音
% u -分音符,trema或者元音变音
% n -波浪号
% c -变音符号
%——环或中。bolle
%ø——削减或固相,或短斜线
%大写
= regexprep(年代,‘(?:| | | | |一个)的,“一个”);
= regexprep(年代,“(?:Æ)”,“AE”);
= regexprep(年代,“(?:ß)”,“党卫军”);
= regexprep(年代,“(?:C)”,“C”);
= regexprep(年代,“(?:Ð)”,' D ');
= regexprep(年代,”(?:E E E | | | E)”,“E”);
= regexprep(年代,”(?:我| | |我)”,“我”);
= regexprep(年代,“(?:N)”,“N”);
= regexprep(年代,”(?:O O O O O | | | | |Ø)”,“O”);
= regexprep(年代,“(?:œ)”,“OE”);
= regexprep(年代,”(?:U | | | U)”,“U”);
= regexprep(年代,”(?:Y |ÿ)',“Y”);
%小写
= regexprep(年代,‘(?:| | | | |一个)的,“一个”);
= regexprep(年代,“(?:æ)”,“ae”);
= regexprep(年代,“(?:c)”,“c”);
= regexprep(年代,“(?:ð)”,' d ');
= regexprep(年代,”(?:e e e | | | e)”,“e”);
= regexprep(年代,”(?:我| | |我)”,“我”);
= regexprep(年代,“(?:n)”,“n”);
= regexprep(年代,”(?:o o o o o | | | | |ø)”,“o”);
= regexprep(年代,“(?:œ)”,“oe”);
= regexprep(年代,”(?:u | | | u)”,“u”);
= regexprep(年代,(:| y)的,“y”);
%返回清洗字符串
clean_s = s;
结束

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。