【2023华中杯数学建模】B 题 小学数学应用题相似性度量及难度评估详细建模方案及实现代码

news2024/9/22 3:59:22

在这里插入图片描述

更新时间:2023-5-1 14:00

1 题目

B 题 小学数学应用题相似性度量及难度评估

某 MOOC 在线教育平台希望能够进行个性化教学,实现用户自主学习。在用户学习时,系统从题库中随机抽取若干道与例题同步的随堂测试题,记录、分析学生的学习和答题信息,并且课后会自动生成作业题(或练习题)。此外,系统还能够定期回溯学生的易错题所涉及的内容,自动推荐题型相似、难度有层次的其他题目供用户进行拓展练习。为实现这样的功能,如何度量题目之间的相似性,如何评估题目的难度,是该产品要解决的关键问题。以小学数学应用题 1 为例,度量题目之间相似性的依据主要有以下两种:

  1. 题干文字。这种方法一般只能找到与题干文字相近的题目作为相似题目。但是,有些题目的题干文字相似,而关键字词不同,题意差异较大;有些问题的背景可能毫无关联,题干文字也几乎不同,而题目的解题思路与方法技巧却完全相同。因此,这种方法效果有限。
  2. 事先标注题目的知识点等信息。这种方法的推荐效果取决于知识点的划分方式和粒度。知识点划分太粗,推荐结果可能与例题或用户的易错题差别太大;知识点划分太细, 推荐结果可能太单一。两种情况下都无法真正达到拓展练习的目的。

评估题目难度的常见做法主要有以下两种:

  1. 根据考试的类型确定。比如,数学竞赛的试题一般比某个小学期末考试题目难。

  2. 教师根据经验主观判断。

上述判断题目相似性和评估难度的做法都有明显的局限性。该公司聘请你们团队尝试解决这些问题。以小学数学应用题为例,具体任务如下:

  1. 设计刻画两道小学数学应用题之间相似性的度量方法。

  2. 建立评估小学数学应用题难度的数学模型。

  3. 附件1是一个示例题库,包含 100 道应用题。请将附件1中的题目,按相似性或难度分类(不限制某一道题目只能属于一个分类)。如果某道题目没有相似题目,可以单独成一类。评估算法的复杂度,能否适用于更大规模的题库。

  4. 附件2中包含10道题目,请使用上述模型或方法分析这些题目的难度,并对于其中的 每一道题目,在附件 1 中找出最相似的一道或若干道题目(没有相似题目可写“无)”。评估算法的复杂度,能否适用于更大规模的题库。

注 1:题目所述小学数学应用题,是指以四则运算为主要求解方法,有一定实际背景的问题。
注 2:教学中还有一种确定题目难度的常见做法,即根据题目的实际得分率来定义题目的难度。但是,题目的实际得分率不仅与学生考前的学习情况有关,还与很多“非技术”因素有关,比如题目所用的词语、句型、语态,甚至是题目在试卷中出现的先后顺序等等;实际的得分率也只能通过采集真实的试卷信息获得,工作量大。因此,本题所关心的是题目的“技术”难度,不考虑实际的得分率。附件说明:

  1. 附件 1 为 CSV 格式文件,无标题行,共 2 列 100 行。第一列为题目编号,形如“P001”、“P002”等。第二列为题目内容。

  2. 附件 2 为 CSV 格式文件,无标题行,共 2 列 10 行。第一列为题目编号,形如“Q001”、“Q002”等。第二列为题目内容。

附件2.csv部分内容,

P001将一批糖果分给幼儿园大班小朋友,如果每人分3颗,就余下21颗;如果每人分4颗,就余下6颗。幼儿园大班有小朋友多少人?这批糖果共有几粒?
P002姐妹俩从家出发去上学,姐姐每分钟走50米,妹妹每分钟走45米。如果妹妹比姐姐早走5分钟,那么姐妹俩可同时到达学校。问:家到学校有多远?
P003钢铁厂用两辆运输车从距工厂90千米的矿山运矿石回来。现有甲、乙两辆运输车,甲车自矿山、乙车自钢铁厂同时出发,相向而行,速度分别为每小时40千米和50千米,到达目的地后立即返回,如此反复进行多次。如果不计装卸时间,且两车不作任何停留,则两车在第三次相遇时,距矿山多少千米?

附件2.csv部分内容,

Q001一列客车长150米,每秒行30米;一列货车长200米,每秒行20米。两车相向而行。当错车而过时,客车司机多久可以看到货车通过?货车司机多久能看到客车通过?
Q002一批旅客决定分乘几辆大巴车,要使每辆车乘坐同样的人数。起先,每辆车坐22人,发现有一人坐不上车;若是开走一辆空车,那么所有的旅客刚好平均分乘余下的车。已知每辆车的容量不多于32人,问原有多少辆汽车?这些旅客有多少人?

2 数学模型

2.1 问题一

根据题目描述,我们需要设计一个算法来度量题目之间的相似性,并评估题目的难度。

首先,我们可以将每道题目转化为一个向量形式,该向量包含每个题目的关键信息(例如题目中的数字、关键词等),然后我们可以使用略。请下载完整文档来度量两个向量之间的相似性。具体地,设题目 a a a b b b 分别对应的向量是 a = ( a 1 , a 2 , … , a n ) \boldsymbol{a}=(a_{1},a_{2},\ldots,a_{n}) a=(a1,a2,,an) b = ( b 1 , b 2 , … , b n ) \boldsymbol{b}=(b_{1},b_{2},\ldots,b_{n}) b=(b1,b2,,bn),则两个题目的相似性可以表示为:

。。。。略,请下载完整文档

其中 a ⋅ b \boldsymbol{a}\cdot\boldsymbol{b} ab 表示向量 a \boldsymbol{a} a b \boldsymbol{b} b 的内积, ∥ a ∥ \|\boldsymbol{a}\| a ∥ b ∥ \|\boldsymbol{b}\| b 分别表示向量 a \boldsymbol{a} a b \boldsymbol{b} b 的范数。

但是,直接使用题目中的所有关键信息作为向量可能会导致相似度计算的误差。因此,我们需要对题目的关键信息进行筛选和加权,以提高相似性度量的准确性。具体实现步骤如下

。。。略

2.2 问题二

将题目将采用KMeans聚类算法分为三类,困难、中等、简单。先聚类,再对每个类别进行数据分析,分析出哪个类别具体属于哪个难度。
TF-IDF模型用于将每个题目描述表示为一个向量,向量中的每个元素表示该单词在该题目描述中的权重,以此来表示不同描述的相似度。K-Means聚类模型用于将题目描述向量进行聚类,将相似的题目归为同一类别。聚类模型的数量可以设置为需要进行分类的类别数目。每个题目将会被分为不同的类别。
因此,可以将以上Python代码用数学模型表示为:
设题目集合为 Q Q Q,其中题目数目为 N N N
TF-IDF模型:
定义词频矩阵 X ∈ R N × M \mathbf{X} \in \mathbb{R}^{N \times M} XRN×M,其中第 i i i 行第 j j j 列的元素 x i , j x_{i,j} xi,j 表示题目 i i i 中单词 j j j 的词频。
定义倒排文档频率(IDF)向量 i d f ∈ R M \mathbf{idf} \in \mathbb{R}^{M} idfRM,其中第 j j j 个元素 i d f j = log ⁡ N d f j idf_j = \log \frac{N}{df_j} idfj=logdfjN,其中 d f j df_j dfj 表示单词 j j j 在总题目数中出现的次数。
定义TF-IDF矩阵 W ∈ R N × M \mathbf{W} \in \mathbb{R}^{N \times M} WRN×M,其中第 i i i 行第 j j j 列的元素 w i , j w_{i,j} wi,j 表示通过TF-IDF模型计算的题目 i i i 中单词 j j j 的权重,即 w i , j = x i , j × i d f j w_{i,j} = x_{i,j} \times idf_j wi,j=xi,j×idfj
K-Means聚类模型:
定义聚类结果向量 c ∈ R N \mathbf{c} \in \mathbb{R}^{N} cRN,其中第 i i i 个元素 c i c_i ci 表示题目 i i i 所属的类别编号,范围为 [ 1 , k ] [1, k] [1,k],其中 k k k 表示聚类的类别数目。
定义聚类簇质心向量 μ ∈ R k × M \mathbf{\mu} \in \mathbb{R}^{k \times M} μRk×M,其中第 i i i μ i \mu_i μi 表示聚类中心向量,即属于第 i i i 类的题目描述向量的平均值。
定义样本距离度量 d i s t ( x i , μ j ) \mathrm{dist}(x_i,\mu_j) dist(xi,μj),其中 x i x_i xi 表示第 i i i 个题目描述向量, μ j \mu_j μj 表示第 j j j 个聚类中心向量。可以使用欧几里得距离(Euclidean distance)或余弦相似度(Cosine similarity)作为样本距离度量。
定义损失函数 J ( { μ j } 1 k , c , W ) \mathrm{J}(\{\mathbf{\mu}_j\}_1^k,\mathbf{c},\mathbf{W}) J({μj}1k,c,W),用于衡量聚类的准确性,可以使用误差平方和(SSE)或其它聚类指标。
聚类模型的目标是最小化损失函数 J \mathrm{J} J,并得到最优的聚类结果 c \mathbf{c} c 和聚类簇质心向量 μ \mathbf{\mu} μ

Kmeans聚类效果的评价指标一般有轮廓系数(Silhouette Coefficient)、Calinski-Harabasz Index和Davies-Bouldin Index等。其中轮廓系数是最常用的评价指标,计算公式为:

s ( i ) = b ( i ) − a ( i ) m a x { a ( i ) , b ( i ) } s(i)=\frac{b(i)-a(i)}{max\{a(i),b(i)\}} s(i)=max{a(i),b(i)}b(i)a(i)

其中, a ( i ) a(i) a(i)表示第 i i i个样本与同一簇内其他样本的平均距离, b ( i ) b(i) b(i)表示第 i i i个样本与距离最近的另一簇内所有样本的平均距离。

轮廓系数 s s s的取值范围在 [ − 1 , 1 ] [-1,1] [1,1]之间,值越大代表聚类效果越好。若某个样本的 s s s值为负数,说明该样本更应该划分到其他簇。

2.3 问题三

采用问题二的聚类算法,或者其他聚类算法。不指定聚类数量的聚类算法有以下几种:

  1. DBSCAN(Density-Based Spatial Clustering of Applications with Noise)
  2. OPTICS(Ordering Points To Identify the Clustering Structure)
  3. HDBSCAN(Hierarchical Density-Based Spatial Clustering of Applications with Noise)

其中,DBSCAN 比较常用,其主要思想是根据局部密度定义簇,具有对噪声数据点不敏感的特点。

注意,对于Kmeans算法,离散点对算法的影响巨大,可以首先对离散点剔除出来,单独做一个类别,或者采用DBSCAN算法。

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from pyecharts import Scatter

# 读取csv文件
df = pd.read_csv('附件1.csv',header=None)
# 将题目描述作为特征
tfidf = TfidfVectorizer()
features = tfidf.fit_transform(df[1])
# 聚类模型训练
kmeans = KMeans(n_clusters=3, random_state=0).fit(features)

# 评价聚类效果
score = silhouette_score(features, kmeans.labels_)
print('聚类效果评价指标(Silhouette Score):', score)

# 可视化聚类效果
。。。。略
# 打印聚类结果
for i in range(len(kmeans.labels_)):
    print('题目ID:{}, 题目描述:{}'.format(df[0][i], df[1][i]))
    print('题目类别:{}'.format(kmeans.labels_[i]))
    print('---------------------------')

在这里插入图片描述

可以看到聚类效果不是特别理想,还需要进一步改进。

在这里插入图片描述

2.4 问题四

用问题一的相似度计算方法。遍历附件1和附件2,依次去计算两个问题的相似度。

import pandas as pd
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# 读取csv文件
data = pd.read_csv('附件1.csv')
questions = data['题目']

# 定义一个处理题目的函数,该函数将题目转换为关键词列表,并对不同关键词进行加权,最终返回一个向量:

def process_question(question):
   。。。略
    return ' '.join(key_words)  # 返回空格分隔的关键字字符串

# 将所有题目转换为关键词向量:
vectorizer = TfidfVectorizer()
vectors = vectorizer.fit_transform([process_question(question) for question in questions])
# 最后,计算任意两个题目之间的相似度并输出结果:
for i in range(len(questions)):
    for j in range(i+1, len(questions)):
        similarity = cosine_similarity(vectors[i], vectors[j])[0][0]
        print(f"题目{i+1} 和 题目{j+1} 的相似度为: {similarity:.4f}")

在这里插入图片描述

3 完整下载

私信我,或者转到我知乎下载:https://zhuanlan.zhihu.com/p/626139128

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

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

相关文章

java的类加载浅析

类加载 类加载器 类加载器是Java虚拟机(JVM)的一个组成部分,它的主要任务是在运行时动态加载类和资源,以便程序能够使用它们。类加载器从文件系统、网络或其他来源中获取类的字节码,并将其转换为JVM可执行的形式&…

机器学习基础知识之交叉验证

文章目录 交叉验证定义1、随机子抽样验证2、K折交叉验证3、留一法交叉验证4、自助采样验证 交叉验证定义 在使用某一个数据集对模型进行训练时,模型的实际训练情况会受到数据集的直接影响,且其实际训练结果是难以确定的,极有可能出现欠拟合与…

【实验报告】实验四、彩色图像处理

一、实验目的 使用MatLab软件对图像进行彩色处理,熟悉使用MatLab软件进行图像彩 色处理的有关方法,并体会到图像彩色处理技术以及对图像处理的效果。 二、实验原理 (一)一幅RGB图像就是彩色像素的一个M x N x 3数组&#xff0…

视频搬砖项目【一个技术员是如何轻松利用视频搬运项目做到日入2000+】

无门槛人人可做副业项目,视频搬砖收益,实测一天2000! 今天给大家分享一个微信看一看 的项目,操作非常简单,小白也很容易上手,不需要像某音一样去卖货,只要发布作品就能够有收益。 第一个、项目…

vue项目无法运行报错 error:0308010C:digital envelope routines::unsupported

文章目录 问题原因解决方法方法一方法二 问题 运行vue项目,报错 error:0308010C:digital envelope routines::unsupported 原因 网上查了一下,大体原因就是node版本不对,node版本太高 也有说我没有使用 Node JS 的 LTS(长期支…

ROS2交叉编译操作

ROS2移植过程 在移植ROS2之前,先确认需要移植的版本以及其对应的依赖,这些信息可以在 ROS 2 Releases and Target Platforms 中有介绍,可依据自身需要使用的平台,参考该链接进行选择,下面以ROS2 Humble为例进行介绍ROS2移植操作。 ROS Humble依赖如下: 而ROS2的构建依赖…

sed进阶之保留空间和排除命令

shell脚本编程系列 保留空间 模式空间(pattern space)是一块活跃的缓冲区,在sed编辑器执行命令时保存着待检查的文本,但它并不是sed编辑器保存文本的唯一空间。sed编辑器还有另一块称作保留空间(hold space&#xff0…

【深度学习】BERT是什么?怎么玩的?

RNN 也是一种Seq2Seq网络 这种RNN就不能并行运算,且对于长句子会造成损失遗忘或者梯度爆炸 Transfomer Transformer由且仅由self-Attenion和Feed Forward Neural Network组成。一个基于Transformer的可训练的神经网络可以通过堆叠Transformer的形式进行搭建&…

美国大学特别重视的批判性思维,是如何培养出来的?

美国大学非常注重培养学生的批判性思维,爱因斯坦有一句名言:“大学教育的价值,不在于学习很多事实,而在于训练大脑会思考。” 批判性思维有两个典型特征:(1)批判性思维善于对通常被接受的结论提…

SpringMVC学习总结

SpringMVC简介 我们首先要了解MVC是什么 MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分 M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为实体类Bean&#xf…

oracle 19创建用户时出现“ORA-65096: invalid common user or role name”的错误

ORACLE 19命令 版本:Version 19.3.0.0.0 一、ORACLE 19创建用户命令 1、切换到oracle用户 [rootoracledb ~]# su - oracle Last login: Tue Jun 1 01:48:10 PDT 2021 on pts/5 2、以dba身份进入sql语句 [oracleoracledb ~]$ sqlplus "/as sysdba" …

2.rabbitMQ之交换机

1.交换机的作用 1.默认交换机会自动指定队列 2.之前一个信息必须被消费1次,现在的是一个消息可以被消费多次(发送到不同队列的前提下,正常情况下一个队列只能消费一次) 3.消息先发给交换机,然后交换机发给多个队列,可以达到多次消费的效果 如图mq3 2.交换机的类型 默认交换机…

【模块系列】DY-SV17F语音播放模块

前言 本文针对官方给的应用手册进行补充和加上个人理解。在官方的资料中已经介绍的很详细了,我就节选部分出来,基本认识模块就行了吧。本来还行自己介绍呢,没想到官方写这么详细了,也不知道介绍啥了,现在单纯的写为个人…

网络安全:钟馗之眼ZOOMEYE搜索引擎使用

网络安全:钟馗之眼ZOOMEYE搜索引擎 地址: 首页 - 网络空间测绘,网络安全,漏洞分析,动态测绘,钟馗之眼,时空测绘,赛博测绘 - ZoomEye("钟馗之眼")网络空间搜索引擎 zoomeye是针对互联网空间的搜索引擎,收录了互联网空间中的设备、…

103-Linux_I/O复用方法之epoll

I/O复用方法之epoll 一.epoll介绍二.epoll相关的函数1.epoll_create2.epoll_ctl3.epoll_wait 三.LT和ET模式1.LT模式2.ET模式 四.epoll实现TCP服务器1.代码(1)服务器端(2)客户端代码 2.运行结果截图 一.epoll介绍 epoll 是 Linux 特有的 I/O 复用函数。它在实现和使用上与 sel…

小程序swiper控件的使用

swiper实现左右滑动,以及tab点击,并且给swiper绑定下拉刷新事件 <view class"swiper-tab"><view class"start swiper-tab-list {{currentTab0 ? on : }}" data-current"0" catchtap"swichNav">私教课</view><vi…

sed进阶之创建sed实用工具

shell脚本编程系列 加倍行间距 sed $!G data2.txt保留空间的默认值是一个空行&#xff0c;通过G命令可以将保留空间内的内容附加到模式空间内容之后&#xff0c;但是最后一行不需要附加&#xff0c;所以通过排除命令!进行排除 对可能含有空行的文件加倍行间距 sed /^$/d;$!G …

c++11上篇

c11 1.C11简介2.列表初始化2.1 &#xff5b;&#xff5d;初始化2.2 std::initializer_list 3.变量类型推导3.1 auto3.2 decltype3.3 nullptr 4.范围for循环5.final与override6.智能指针7.新增加容器---静态数组array、forward_list以及unordered系列8.默认成员函数控制9.右值引…

C++——类和对象[中]

0.关注博主有更多知识 C知识合集 目录 1.类的默认成员函数 2.构造函数和析构函数基础 3.构造函数进阶 4.析构函数进阶 5.拷贝构造函数 6.运算符重载 7.日期类 7.1输入&输出&友元函数 8.赋值运算符重载 9.const成员函数 9.1日期类完整代码 10.取地址重载 …

pandas简介

pandas的两个主要数据结构是&#xff1a;Series&#xff08;一维数据&#xff09;、DataFrame&#xff08;二维数据&#xff09;。 Series Series是一种类似于NumPy中一维数组的对象&#xff0c;它由一组任意类型的数据以及一组与之相关的数据标签组成。 import pandas as pd…