详细介绍:2023 美赛C Predicting Wordle Results(上)

news/2025/10/2 17:19:49/文章来源:https://www.cnblogs.com/slgkaifa/p/19123765

详细介绍:2023 美赛C Predicting Wordle Results(上)

Wordle规则 猜一个五个字母的单词 六次以内机会:

灰色代表正确单词里没有这个字母,黄色代表有这个字母但位置不对,绿色代表位置对。

困难模式:黄色绿色(被猜出来的字母)在下一次猜词中也需要被用到。

后面的题目主要围绕 日期这个时间序列信息,以及词属性特征(衡量难度)。

目录

1. 数据清洗

2. 词特征挖掘

3. 报告数目时间序列预测 Prediction

思路一:SIR传染病模型

思路二:ARIMA + LSTM

4. 困难报告数与词属性关系 Correlation

思路一:多元线性回归

思路二:皮尔逊系数(热力图)

思路三:LightGBM 等集成学习算法


1. 数据清洗

发现 3 个不是5个字母的单词:  ['rprobe', 'clen', 'tash']

还有一个拼写错误 marxh -> marsh

import pandas as pd
# 读取Excel文件
df = pd.read_excel('Problem_C_Data_Wordle.xlsx', sheet_name='Sheet1')
# 首先检查实际的列名
print("数据框的所有列名:")
print(df.columns.tolist())
# 检查Word列的单词长度
word_lengths = df['Word'].str.len()
print("单词长度统计:")
print(word_lengths.value_counts().sort_index())
# 检查是否有不是5个字母的单词
words = df[word_lengths != 5]['Word']
print(f"\n发现 {len(words)} 个不是5个字母的单词:")
print(words.tolist())

可视化两列 report 数目,看outlier 离群值。    下面两个凸出来的点,都理解为少了一位。

Number of reported results 那列的   2022/11/30  2569 -> 25569

Number in hard mode 那列的 2022/2/13  3249 -> 13249

import pandas as pd
# 读取Excel文件
df = pd.read_excel('Problem_C_Data_Wordle.xlsx', sheet_name='Sheet1')
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import rcParams
# 设置中文字体和图形样式
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
sns.set_style("whitegrid")
for i in (['Number of reported results', 'Number in hard mode']):# 创建图形plt.figure(figsize=(14, 8))# 绘制折线图plt.plot(df['Date'], df[i],linewidth=2, color='#2E86AB', marker='o', markersize=2, alpha=0.7)# 英文标签plt.title(i, fontsize=16, fontweight='bold', pad=20)plt.xlabel('Date', fontsize=12)plt.ylabel(i, fontsize=12)# 优化x轴日期显示plt.xticks(rotation=45)plt.gcf().autofmt_xdate()# 添加网格plt.grid(True, alpha=0.3)plt.legend()plt.tight_layout()plt.show()

2. 词特征挖掘

Wordle这个游戏是一个 基于字母猜测的游戏。根据单词内字母的性质

1. 元音字母(Vowels)“元音字母在单词中出现频率更高” 

2. 使用频率(Usage) Python 的 wordfreq库

https://www.kaggle.com/datasets/rtatman/english-word-frequency  或者kaggle的这个数据集

import wordfreq
freq_data = wordfreq.get_frequency_dict('en')
freq_data[word] # 即为word的频率

3. 每个字母 所有五字母单词中出现的频率    字母频率加和得单词重要程度。

比如由高频字母 a,e,i,o,s,r 组成的单词 raise  arose 上来猜一下,得到黄绿块的信息可能比较多。

import wordfreq
import string
from collections import defaultdict
valid_letters = set(string.ascii_lowercase)
def get_letter_freq():# 加载英语单词频率数据(使用"en"表示英语)freq_data = wordfreq.get_frequency_dict('en')freq_words = defaultdict(float)for word, freq in freq_data.items():# 只保留由纯字母组成的5字母单词(排除包含数字、符号的词)if len(word) == 5 and all(c.lower() in valid_letters for c in word):for c in word:freq_words[c] += 1  # 每个字母出现一次# 按频率从高到低排序sorted_freq = sorted(freq_words.items(), key=lambda x: x[1], reverse=True)a = sum(freq for _, freq in sorted_freq)sorted_freq = [(l, freq / a) for l, freq in sorted_freq]  # 归一化字母频率return sorted_freq
letters = get_letter_freq()
# 打印结果
print("字母使用频率:")
for i, (letter, freq) in enumerate(letters, 1):print(f"{i}. {letter} - 频率值: {freq:.6f}")
'''
字母使用频率:
1. a - 频率值: 0.124429
2. e - 频率值: 0.092719
3. i - 频率值: 0.071744
4. o - 频率值: 0.069902
5. s - 频率值: 0.066970
6. r - 频率值: 0.062296
'''

4. 单词中不同字母的数目(Unique Letters ) 

5. 单词词性类别 名词,动词,形容词,等等

3. 报告数目时间序列预测 Prediction

        在Twitter上晒成绩的数目每天变动,解释这个变动并预测2023.3.1的报告数区间

思路一:SIR传染病模型

        基于经典的SIR传染病模型进行改进,提出了PCQL模型。四类人群&四种系数。

  • 变量 P潜在人群,指那些可能成为成绩上传者,有机会成为跟风者的人。

  • 变量 C跟风人群,指普通的成绩上传者,他们会很快感到厌倦;其中一部分人每天会变成退出者或忠诚者。

  • 变量 Q退出人群,指那些对游戏或上传成绩感到厌倦的人。

  • 变量 L忠诚人群,指那些不会轻易放弃成绩分享行为的人。

  • 参数 β:潜在->跟风比率。

  • 参数 γ:跟风者退出比率。

  • 参数 λ:跟风者转变为忠诚者的可能性。

  • 参数 φ:忠诚者退出比率。

C+L为对应晒成绩的人数,使用遗传算法得到参数的初始比较好的参数解。

再使用 Nelder-Mead方法(下山单纯形法)像更好的方向微调。

预测与区间估计:为了给出预测值及其不确定性(预测区间),使用了Bootstrap方法

  • 过程:生成大量(1000个)Bootstrap数据样本。对每个样本重复步骤2的拟合过程,并预测2023年3月1日的数值。这样就得到了1000个预测值,形成了一个预测分布。

  • 结果:计算这1000个预测值的平均值作为点预测(14689.9)。取这个预测分布的2.5% 和97.5% 分位数,作为95%置信水平下的预测区间([11173.04, 17069.15])。

思路二:ARIMA + LSTM

        ADF检验是否平稳,进行一阶差分发现 2022年5月16日前后方差变化很大。为了保证序列的稳定性(恒定方差),只使用了该日期之后的数据作为最终建模的时间序列。

后面一段进行ADF检验。

# 后一段的 ADF 检验
from statsmodels.tsa.stattools import adfuller
# 提取从第 131 个数据往后的数据
data_subset = df['report_reversed_diff1'][130:]
# 进行 ADF 检验
result = adfuller(data_subset.dropna())
# 输出 ADF 检验结果
print('ADF 统计量:', result[0])
print('p 值:', result[1])
print('临界值:')
for key, value in result[4].items():print(f'   {key}: {value}')

对平稳序列定阶 (ACF/PACF图 + AIC准则) ->  模型诊断 (残差白噪声检验 如Ljung-Box检验) 

AIC(赤池信息量准则) AIC = 2k - 2ln(L)

模型类型AR(p) 自回归模型MA(q) 移动平均模型ARMA(p,q) 混合模型
ACF拖尾在滞后q阶后截尾拖尾
PACF在滞后p阶后截尾拖尾拖尾

如果用差分后的 (0,0,1) 会导致后面的预测期望和区间都恒定不变,转回差分前(0,1,1)

模型训练 + Ljung - Box 检验 (残差应近似白噪声)

import statsmodels.api as sm
from statsmodels.stats.diagnostic import acorr_ljungbox
# 按照 (0, 1, 1) 拟合 ARIMA 模型
data_subset = df['report_reversed'][130:]
model = sm.tsa.ARIMA(data_subset, order=(0, 1, 1))
results = model.fit()
# 获取模型残差
residuals = results.resid
# 进行 Ljung - Box 检验,这里检验前 10 个滞后期
lb_test = acorr_ljungbox(residuals, lags=10)
print('Ljung - Box 检验结果:')
print(lb_test)

往后预测60个日期 期望和区间(但是效果并不好范围很大 下限都到负数了,原论文数据造假嫌疑)

# 进行向后 60 步的预测
forecast = results.get_forecast(steps=60)
# 获取点预测值
point_forecast = forecast.predicted_mean
# 获取 95% 置信区间预测
confidence_interval = forecast.conf_int()
print('向后 60 步的点预测值:')
print(point_forecast)
print('\n向后 60 步的 95% 置信区间预测:')
print(confidence_interval)

        但是 ARIMA(0,1,1) 数学逻辑决定了它只能捕捉数据的线性趋势与短期随机波动,无法处理非线性特征。超过 1 步后,未来的白噪声 无法预测,最佳估计为其均值 0;所以导致后面的期望是一条直线定值。

        由于 ARIMA 模型的预测结果波动性较差(其预测结果的残差部分未能得到合理预测),将 ARIMA 与 LSTM 相结合。

  1. 基于 ARIMA 的预测结果与实际报告数量,计算出 “报告数量残差序列”(残差 = 实际值 - ARIMA 预测值),并将该残差序列作为 LSTM 神经网络的期望输出(即 LSTM 需学习预测的目标);
  2. 对原始数据进行 “相空间重构”(一种将一维时间序列转化为高维空间向量,以挖掘数据时序特征的方法),最终确定最优重构维度为 18,作为 LSTM 的输入数据;
  3. 将训练集输入 LSTM 神经网络,对残差序列的测试集进行学习建模与预测,得到 ARIMA 残差序列的预测值;
  4. 最后,将 ARIMA 模型的预测结果与 LSTM 模型的残差预测结果相加,得到报告数量的最终预测结果。

4. 困难报告数与词属性关系 Correlation

词的属性是否与 玩困难模式的报告比例ratio 相关。是的话,什么属性?不是的话,为什么。

思路一:多元线性回归

F统计量  衡量模型所解释的方差与未被解释的方差的比率。

F = (模型解释的方差 / 模型的自由度) / (残差的方差 / 残差的自由度)

t 统计量 单个特征的影响程度。     但这篇论文给出的是不相关。

思路二:皮尔逊系数(热力图)

import pandas as pd
correlation_matrix = df.corr(method='pearson')
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix,annot=True,   # 在单元格内显示数值cmap='coolwarm', # 使用一个从蓝色(负)到红色(正)的配色center=0,     # 中心点为 0square=True,  # 让单元格为正方形fmt=’.2f’)    # 数值保留两位小数
plt.title('Pearson Correlation Heatmap')
plt.show()

思路三:LightGBM 等集成学习算法

得到每个特征权重;但需要多选几个特征,不然可能过拟合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/925123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android项目实现自动获取手机号一键登录功能

功能概述 在 Android 应用中实现自动获取本机手机号进行一键登录,同时支持手动登录和历史账号选择功能。这个功能大大提升了用户体验,减少了用户输入成本。 1. 权限配置 首先在 AndroidManifest.xml 中添加必要的权限…

电商网站程序做引流去那些网站好

RPC(Remote Procedure Call,远程过程调用)是一种编程技术,使得开发者能够像调用本地函数一样调用位于不同进程、不同主机上的函数或服务。这种技术隐藏了底层网络通信细节,使得分布式系统中的组件能够无缝协作&#xf…

互联网+政务服务平台广告优化

5 月 8 日凌晨消息,微软 Build 2018 开发者大会在今天正式来开帷幕。很明显整场发布会被分为了上下两个部分,上半场如果说是聊一些技术实现和愿景,那下半场就应该说是实战说明了。跨平台云端编程了解下微软在现场展示了 Visual Studio&#x…

深圳 网站 传播自己建设网站模版

【尚庭公寓SpringBoot Vue 项目实战】用户管理(十五) 文章目录 【尚庭公寓SpringBoot Vue 项目实战】用户管理(十五)1、业务介绍2、接口实现2.1、根据条件分页查询用户列表2.2、根据ID更新用户状态 1、业务介绍 用户管理共包含两…

做试客需要去哪些网站比比西旅游网站建设

本文已发表在《程序员》杂志2016年10月期。 如果在使用App时遇到闪退,你可能会选择卸载App、到应用商店怒斥开发者等方式来表达不满。但开发者也同样感到头疼,因为崩溃可能意味着用户流失、营收下滑。为了降低崩溃率,进而提升App质量&#xf…

python必背入门代码天河网站 建设seo信科分公司

定义外键之后,数据库的每次操作都需要去检查外键约束。对于插入来说,影响了插入速度;对于更新来说,级联更新是强阻塞,存在数据库更新风暴(Database Update Storm)的风险。 所谓 Database Updat…

打造优雅的用户体验:自定义jQuery程序提示插件开发全解析

打造优雅的用户体验:自定义jQuery程序提示插件开发全解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

免费股票API接口全面指南 - 详解

免费股票API接口全面指南 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

广州英铭网站建设北京丰台区做网站公司

一、相关知识 首先我们需要了解传统隐写和生成式隐写的基本过程和区别。传统隐写需要选定一幅封面图像,然后使用某种隐写算法比如LSB、PVD、DCT等对像素进行修改将秘密嵌入到封面图像中得到含密图像,通过信道传输后再利用算法的逆过程提出秘密信息。而生…

Multi-Arith数据集:数学推理评估的关键基准与挑战 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

做电脑网站用什么软件好用吗企业管理系统作用

随着计算机控制系统在人们生活中的普及,软件自身的可靠性也越来越受到重视.在航空、高铁、核电及军事等高安全要求领域的软件系统——安全关键系统(safety-critical system,简称SCS)更是受到高度的重视.而随着软件系统的复杂度越来越高,软件系统的安全性保证也变得越来越困难.这…

西宁平台网站建设学信网 的企业网站给你做认证

一、镜像基础命令: $ docker info # 查看docker信息 $ docker system df # 查看镜像/容器/数据卷所占的空间。 $ ip addr #查看容器内部网络地址。 $ docker images # 查看镜像 $ docker search 镜像名称 # 搜索镜像 --limit :只列出N个镜像,默认为25个…

福田企业网站优化排名昆山公司网站建设电话

1 需求 加密算法分类如下: 可逆加密算法:加密和解密使用相同密钥的加密算法。常见的对称加密算法有DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES。不可逆加密算法:数据加密后就不能被解密,常用的算法有MD5、SHA1。非对称…

做网站软件dw斗鱼企业网站建设的目的

上文说了如何创建自定义VPC网络的EC2实例,这节说如何在多个VPC之间创建对等连接。 这里分别填写自己的VPC和对方的VPC的ID信息,然后在对方的VPC里就能看到有连接请求,在对方的连接请求里选择 “操作”->接受。 到这里已经快要收尾了&…

ps制作网站效果图网站建设vs网络推广

大家好,我是Circaboy,近期给我的手机和相机入了一整套专业的摄影外设套装,然后我发现专业设备加持下的摄影着实是比我之前的要好很多,所以我就写了个文章做个简单的介绍和专业外设加持下的摄影对比。 本次入手的是斯莫格摄影套装…

Qt编程: 正则表达式分析 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

一阶逻辑及其变体在自然语言深层语义分析中的作用、挑战与未来启示 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Manim实现渐变填充特效

本文将介绍如何使用Manim框架实现动态渐变填充特效,通过自定义动画类来控制物体的颜色随时间平滑变化。 1. 实现原理 1.1. 自定义动画类设计 在Manim中,所有动画效果都是通过继承Animation基类并实现相应的方法来创建…

贝尔数

简单前置知识:第二类斯特林数(Stirling Number)\(\begin{Bmatrix}n\\k\end{Bmatrix}\) 或 \(S(n,k)\) 表示将 \(n\) 个元素划分为 \(k\) 个互不区分的非空子集的方案数。递推式:\(S(n,k) = S(n-1,k-1) + k \times …