以下内容为我个人的想法与实现,不代表任何其他人。
文章目录
为了对报告结果数量的变化进行建模,我们需要确定影响这种变化的潜在因素。可能影响报告结果数量的几个可能因素包括:
读取适当修整的数据集:
import pandas as pd
data=pd.read_excel('Problem_C.xlsx')
data
# 日期 比赛编号 单词 报告结果数量 困难模式中的数量 尝试次数
如下:

查看数据集的基本信息
# 查看数据集的基本信息
print(data.info())
# 可见没有缺失值
如下:

由于同一个日期可能有多条数据,所以统计每个日期的报告结果数量:
# 统计每个日期的报告结果数量
results_by_date = data.groupby('Date')['Number_of_reported_results'].sum()
print(results_by_date)
如下:

统计每个单词的平均猜测次数:
# 统计每个单词的平均猜测次数
avg_guesses_by_word = data[['Word', '1_try', '2_tries', '3_tries', '4_tries', '5_tries', '6_tries', 'more']].mean(axis=1)
print(avg_guesses_by_word)
如下(可见差不多):

检查单词长度是否与平均猜测次数有关:
# 检查单词长度是否与平均猜测次数有关
data['Word length'] = data['Word'].apply(len)
avg_guesses_by_word_length = data.groupby('Word length')[['1_try', '2_tries', '3_tries', '4_tries', '5_tries', '6_tries', 'more']].mean()
avg_guesses_by_word_length
# 说明还是有关系
如下(结果可以看出是有关系的):

下面做个热力图看看上述特征之间关系:
corr=avg_guesses_by_word_length.corr()
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
plt.subplots(figsize = (10,10))
plt.title("Pearson correlation with label")
sns.heatmap(corr, annot=True, vmax=1, square=True, cmap="Oranges")
如下:

可视化每天报告数量:
# 可视化每天报告数量
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 提取每天的报告结果数量
results_by_date = data.groupby('Date')['Number_in_hard_mode'].sum()
# 绘制时间序列图
plt.plot(results_by_date)
plt.title('Daily Wordle Results')
plt.xlabel('Date')
plt.ylabel('Number of reported results')
plt.show()
如下:

ARIMA时间序列模型如下:
# 拆分数据集为训练集和测试集
train, test = train_test_split(results_by_date, test_size=0.2, shuffle=False)
# 建立ARIMA模型并训练
model = ARIMA(train, order=(3, 1, 1))
model_fit = model.fit()
# 对测试集进行预测并计算误差
history = [x for x in train]
predictions = list()
for t in range(len(test)):
model = ARIMA(history, order=(3, 1, 1))
model_fit = model.fit()
output = model_fit.forecast()
yhat = output[0]
predictions.append(yhat)
obs = test.iloc[t]
history.append(obs)
RMSE_test = np.sqrt(mean_squared_error(test, predictions))
print("Test RMSE: {}".format(RMSE_test))
# 绘制预测结果和实际结果的比较图
plt.plot(test.index, test.values, label='Actual')
plt.plot(test.index, predictions, label='Predicted')
plt.title('Daily Wordle Results')
plt.xlabel('Date')
plt.ylabel('Number of reported results')
plt.legend()
plt.show()
运行如下:

我们计算每天的报告结果数量,并绘制时间序列图来检查数据是否具有某种趋势或周期性。接下来,我们将数据集拆分为训练集和测试集,并建立一个ARIMA模型来训练数据集。在训练模型后,我们对测试集进行预测并计算误差,然后绘制预测结果和实际结果的比较图来评估模型的性能。从上图可以看出,我们的模型表现已经很好。
2023年3月1日报告的结果数量创建预测区间。首先预测当天值:
import matplotlib.pyplot as plt
# 对未来数据进行预测
forecast = model_fit.forecast(steps=30)
# 提取2023年3月1日的预测值和置信区间
forecast_value = forecast[0]
# 打印预测值
print('2023年3月1日的预测值为:%.2f' % forecast_value)
如下:
2023年3月1日的预测值为:1956.95
均方误差MSE通过计算预测值和实际值之间距离(即误差)的平方来衡量模型优劣。即预测值和真实值越接近,两者的均方差就越小。MSE的值越小,说明预测模型描述实验数据具有更好的精确度。所以我们可以用均方误差来设置上下限。
# 计算区间
print(f"预测区间是[{int(forecast_value-RMSE_test)}至{int(forecast_value+int(RMSE_test))}]")
如下:
预测区间是[1726至2186]
用于计算每个单词出现的次数和平均报告百分比,以及每个单词的平均报告百分比的标准偏差和方差。该这里使用箱线图和散点图来可视化单词出现次数和平均报告百分比之间的关系:
# 计算每个单词的出现次数和平均报告百分比
word_counts = data.groupby('Word').size()
word_means = data.groupby('Word')['1_try', '2_tries', '3_tries', '4_tries', '5_tries', '6_tries', 'more'].mean()
# 计算每个单词的平均报告百分比的标准偏差和方差
word_stds = data.groupby('Word')['1_try', '2_tries', '3_tries', '4_tries', '5_tries', '6_tries', 'more'].std()
word_vars = data.groupby('Word')['1_try', '2_tries', '3_tries', '4_tries', '5_tries', '6_tries', 'more'].var()
# 将单词的出现次数和平均报告百分比合并为一个数据框
word_data = pd.concat([word_counts, word_means, word_stds, word_vars], axis=1)
word_data.columns = ['Count', '1 try Mean', '2 tries Mean', '3 tries Mean', '4 tries Mean', '5 tries Mean', '6 tries Mean', 'X Mean', '1 try Std', '2 tries Std', '3 tries Std', '4 tries Std', '5 tries Std', '6 tries Std', 'X Std', '1 try Var', '2 tries Var', '3 tries Var', '4 tries Var', '5 tries Var', '6 tries Var', 'X Var']
# 将单词的出现次数和平均报告百分比之间的关系可视化
plt.scatter(word_data['Count'], word_data['X Mean'])
plt.title('Relationship between Word Frequency and X Mean')
plt.xlabel('Word Frequency')
plt.ylabel('X Mean')
plt.show()
# 绘制平均报告百分比的箱线图
word_data[['1 try Mean', '2 tries Mean', '3 tries Mean', '4 tries Mean', '5 tries Mean', '6 tries Mean', 'X Mean']].plot.box()
plt.title('Distribution of Report Percentages by Number of Tries')
plt.ylabel('Report Percentage')
plt.show()
如下:


第一个图表是单词出现次数和平均报告百分比之间的散点图,可以帮助我们了解它们之间是否存在任何明显的关系。第二个图表是平均报告百分比的箱线图,可以帮助我们了解不同尝试次数下的报告百分比分布情况。
通过观察这些图表,我们可以得出以下结论:
因此,可以得出结论:单词的任何属性都不会影响报告的百分比,而尝试次数是影响报告百分比的最重要因素。
在这个问题中,并没有对单词的具体属性进行分析,而是集中在单词出现次数和平均报告百分比之间的关系上。
对于未来日期的给定未来解决方案词,开发一个模型,使您能够预测报告结果的分布。换句话说,预测未来日期 (1, 2, 3, 4, 5, 6, X) 的相关百分比。哪些不确定性与您的模型和预测相关?举一个你对2023年3月1日EERIE这个词的预测的具体例子。你对你的模型的预测有多自信?
数据处理和分析,可视化数据集的分布和趋势
import matplotlib.pyplot as plt
import seaborn as sns
# 按日期分组计算报告结果的平均值
df_mean = df.groupby('Date')['Number_of_reported_results'].mean()
# 绘制时间序列图
plt.figure(figsize=(12, 6))
plt.plot(df_mean.index, df_mean.values)
plt.xlabel('Date')
plt.ylabel('Number_of_reported_results')
plt.title('Reported Results over Time')
plt.show()
# 绘制散点图
sns.scatterplot(data=df, x='Contest number', y='Number_of_reported_results')
plt.xlabel('Contest number')
plt.ylabel('Number_of_reported_results')
plt.title('Reported Results by Contest number')
plt.show()
# 绘制箱线图
sns.boxplot(data=df, x='Word', y='Number_of_reported_results')
plt.xlabel('Word')
plt.ylabel('Number_of_reported_results')
plt.title('Reported Results by Word')
plt.show()
如下:



实在难得写代码了,以下是最终预测结果:

由图可以看出,猜测次数占比集中在 3 次、4 次和 5 次,整体结果分布呈正态,侧面反映出了预测结果的可靠性。
假设我们要预测2023年3月1日给定单词EERIE的报告结果分布。给出一个具体的预测,以EERIE单词为例。首先,我们需要确定EERIE单词的长度(即需要多少次尝试才能猜中单词)。根据Wordle的规则,单词的长度在5到7之间,因此我们可以假设EERIE单词的长度为6。
import pandas as pd
import numpy as np
from scipy.stats import binom
# 读取数据
data = pd.read_excel('Problem_C_Data_Wordle.xlsx')
使用这个模型,我们可以对EERIE单词进行难度分类。根据我们定义的难度级别,如果EERIE单词属于前10个最常见的单词,那么它可以被归为Easy级别;如果它属于接下来的10个单词,那么它可以被归为Medium级别;否则,它将被归为Hard级别。具体地,我们需要将EERIE单词的字母按照字母表的顺序排序,然后计算每个字母在单词中出现的频率。对于EERIE单词,它的字母排序为"EEEIR",频率为3/5、1/5、1/5、0、0。因此,我们可以将EERIE单词归为Easy级别。
当然,这个模型的准确性取决于我们对每个难度级别的定义以及对每个因素的权重分配。如果我们对这些参数进行不同的选择,那么模型的分类结果可能会有所不同。同时,模型的准确性还受到数据质量的影响,如果我们的数据集不够完整或者存在错误,那么模型的分类结果也会受到影响
import pandas as pd
import numpy as np
# 读取数据
data = pd.read_excel('Problem_C_Data_Wordle.xlsx')
# 将单词按字母表顺序排序,并计算字母出现的频率
data['sorted_word'] = data['Word'].apply(lambda x: ''.join(sorted(x)))
data['freq_e'] = data['Word'].apply(lambda x: x.count('e') / len(x))
data['freq_t'] = data['Word'].apply(lambda x: x.count('t') / len(x))
data['freq_a'] = data['Word'].apply(lambda x: x.count('a') / len(x))
data['freq_o'] = data['Word'].apply(lambda x: x.count('o') / len(x))
data['freq_i'] = data['Word'].apply(lambda x: x.count('i') / len(x))
data['freq_n'] = data['Word'].apply(lambda x: x.count('n') / len(x))
# 将单词按照字母频率排序,形成不同的难度级别
data['difficulty'] = 'hard'
data.loc[data['freq_e'] >= 0.2, 'difficulty'] = 'medium'
data.loc[data['freq_e'] >= 0.4, 'difficulty'] = 'easy'
# 输出结果
data[['Word', 'sorted_word', 'freq_e', 'freq_t', 'freq_a', 'freq_o', 'freq_i', 'freq_n', 'difficulty']]
如下:

输出结果会列出每个单词的字母组合情况、字母出现的频率以及难度级别。根据我们的模型,难度级别为Easy的单词应该是比较容易的,而难度级别为Hard的单词则是比较困难的。在实际情况中,我们可以通过不断地观察Wordle游戏的结果,来验证我们的分类模型是否准确。
说明:
创建特征并提取特征:
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 读取数据
data = pd.read_excel('Problem_C_Data_Wordle.xlsx')
# 提取特征
data['length'] = data['Word'].apply(len)
data['number_of_reported_results'] = data['Number_of_reported_results']
data['number_in_hard_mode'] = data['Number_in_hard _mode']
data['tries'] = data[['1_try', '2_try', '3_try', '4_try', '5_try', '6_try', 'X']].apply(lambda x: x.argmax()+1, axis=1)
data
如下:

划分数据集:
# 划分训练集和测试集
X = data[['length', 'number_of_reported_results', 'number_in_hard_mode', 'tries']]
y = pd.get_dummies(data[['1_try','2_try','3_try','4_try','5_try','6_try','X']])
查看如下:

在多输出问题中,每个实例都有多个标签,并且每个标签可能有多个类别。例如,在 Wordle 的分类问题中,每个单词都可能被归为多个难度级别,因此属于多输出问题。
使用多输出决策树来分类(一个示例,并不唯一)
from sklearn.multioutput import MultiOutputClassifier
from sklearn import tree
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
X_train
如下:

训练预测和评估:
# 训练决策树模型
clf = MultiOutputClassifier(DecisionTreeClassifier())
clf.fit(X_train, y_train)
# 预测测试集的结果
y_pred = clf.predict(X_test)
print('模型准确率为:',clf.score(X,np.array(y)))
如下:
模型准确率为: 0.7994428969359332
列出并描述此数据集的一些其他有趣的特征。
除了前面提到的单词长度、报告结果数量、困难模式和猜测次数等特征之外,这个 Wordle 数据集中还有一些其他有趣的特征可以挖掘。以下是一些可能有用的特征:
以下以计算每个单词的字母种类和频率为例:
import pandas as pd
# 读取数据
data = pd.read_excel('Problem_C_Data_Wordle.xlsx')
# 计算每个单词的字母种类和频率
def letter_counts(word):
counts = {}
for letter in word:
if letter in counts:
counts[letter] += 1
else:
counts[letter] = 1
return counts
data['letter_counts'] = data['Word'].apply(letter_counts)
data['unique_letters'] = data['letter_counts'].apply(lambda x: len(x))
data['total_letters'] = data['letter_counts'].apply(lambda x: sum(x.values()))
data['most_common_letter'] = data['letter_counts'].apply(lambda x: max(x, key=x.get))
# 输出结果
data[['Word', 'unique_letters', 'total_letters', 'most_common_letter']].head()
如下:

这里再做一个参考代码:根据单词的频率和难度级别确定单词的难度,可以修改我之前包含难度级别信息,代码如下
import pandas as pd
# 读取数据
data = pd.read_excel('Problem_C_Data_Wordle.xlsx')
# 计算每个单词的字母种类和频率
def letter_counts(word):
counts = {}
for letter in word:
if letter in counts:
counts[letter] += 1
else:
counts[letter] = 1
return counts
data['letter_counts'] = data['Word'].apply(letter_counts)
data['unique_letters'] = data['letter_counts'].apply(lambda x: len(x))
data['total_letters'] = data['letter_counts'].apply(lambda x: sum(x.values()))
data['most_common_letter'] = data['letter_counts'].apply(lambda x: max(x, key=x.get))
# 计算每个单词的出现频率
word_counts = data['Word'].value_counts(normalize=True)
# 计算每个单词的难度级别
def word_difficulty(word):
freq_e = word.count('e') / len(word)
if freq_e >= 0.4:
return 'easy'
elif freq_e >= 0.2:
return 'medium'
else:
return 'hard'
data['difficulty'] = data['Word'].apply(word_difficulty)
# 计算每个单词的难度分数
difficulty_scores = {'hard': 1, 'medium': 2, 'easy': 3}
data['difficulty_score'] = data['difficulty'].apply(lambda x: difficulty_scores[x])
# 计算每个单词的加权出现频率
data['weighted_frequency'] = data['Word'].apply(lambda x: word_counts[x] * difficulty_scores[word_difficulty(x)])
# 输出结果
data[['Word', 'unique_letters', 'total_letters', 'most_common_letter', 'difficulty', 'difficulty_score', 'weighted_frequency']].head()
如下:

说明:代码首先从 Excel 文件中读取数据,并像以前一样计算每个单词的各种特征。然后,它使用 value_counts() 方法计算每个单词的频率,并使用之前代码的修改版本计算每个单词的难度级别。它还为每个难度级别分配一个难度分数,难词的分数为 1,中等单词的分数为 2,简单单词的分数为 3。最后,它通过将频率乘以难度分数来计算每个单词的加权频率,并将结果分配给数据帧中名为“weighted_frequency”的新列。
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来
文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g