我们经常可以看到各种各样的英语词汇量测试功能,你测试过吗?你觉得准吗?
我使用过有道词典的词汇量测试功能,我认为它最大的问题是,不管是谁不管测多少次,每次测的词都是固定不变的,这就好像高考,全国各地年复一年都考同一套题。
当然,它是怎么来评估词汇量,使用什么算法,那就更不知道了。
本文提出了一种使用随机抽样梯度下降算法来预估词汇量的方法,经大量用户反映,很准,你是不是心动了,想马上试一试呢?立马测试一下吧,使用中文定义 或 使用英文定义。
测完词汇量,我们就来看看如何使用随机抽样梯度下降算法来预估词汇量:
1、将词汇分成9个级别,难度是先递增然后平稳然后稍微有一点下降。
2、从这9个级别中,随机挑选总共100个单词,从第1级到第9级挑选的个数分别是:5、10、15、15、15、10、10、10、10。
3、之所以选择100个单词,是经过精心设计的。正常时间需要8分钟完成,如果高手来做题,应该会在5分钟内完成;如果菜鸟做题,一般会超过16分钟来完成;还有一种情况,就是如果有人闭着眼睛一直选A,这样他大概只要1分钟左右的时间。
4、因为这9个级别总体趋势是梯度上升的,在做题的时候,如果前面的梯度出现问题,那么说明基础不扎实,这虽然不会中断测试也不应该中断测试,但是会减少后面梯度的预估权重。
5、在词汇量预估模型中,使用固定值预估+梯度下降算法来计算。
6、给用户记时,用户答题完成后,计算每一个级别答对的问题数目,如: 1 -> 2,2 -> 3,… ,9 -> 3。
7、计算每一个级别答对的比率 = 每一个级别答对的题数 / 每一个级别总的题数。
8、遍历每一个答对的题,累加预估总词数。如果题目属于第一级, 则将第一级答对的比率乘以固定的预估值作为该题预估词数。如果题目不属于第一级, 则将上一级答对的比率和本级相乘,然后用这个比率乘以固定的预估值作为该题预估词数。如果上一级全部答错, 则将上一级的答对比率固定设置为0.1。
9、加入答题时间的影响。期望答题时间是8分钟。每提前一秒钟预估词数加20,最多加量不超过3600。每落后一秒钟预估词数减20, 最多减量不超过9600。假定做题最快时间不少于4分钟,如果少于四分钟,每少N秒预估词数就减去4800+N*20。
10、如果如上算法最后获得的预估词数是负数,则去除负号取绝对值。
算法实现如下:
1、使用如下代码构造quiz对象,这里我们不但支持中文词典还支持英文词典,进一步参考Quiz类的完整实现:
Dictionary dictionary = WordLinker.getValidDictionary(request.getParameter("dictionary")); Quiz quiz = Quiz.buildQuiz(dictionary);
2、获取quizItem,然后展现给用户,展现页面的JSP代码参考这里,进一步参考QuizItem类的完整实现:
QuizItem quizItem = quiz.getQuizItem();
quiz.step()指示当前测试到第几题了,quizItem.getMeanings()是提供给用户的选项,默认是4个。
3、获取用户答案,将用户答案保存到quiz对象中,返回值表示用户是否答对:
boolean right = quiz.answer(word, answer);
4、当quiz.getQuizItem()的返回值为null的时候,说明题已经答完了,那么就给用户显示结果,告知用户哪些题答对了,哪些题答错了。可通过quiz.getQuizItem()获得所有的题目,并通过quizItem.isRight()来判定是否正确,通过quizItem.getWord().getWord()来获得词,通过quizItem.getWord().getMeaning()来获得所有的选项,通过quizItem.getAnswer()来获取用户提交的答案。
5、调用quiz.getEvaluationCount()为用户计算预估词数,预估词数的代码实现如下:
public int getEvaluationCount(){ //答题完成时间 endQuizTime = System.currentTimeMillis(); //计算每一个级别答对的问题数目 //如: //1 -> 2 //2 -> 3 //... //9 -> 3 Map<Integer, AtomicInteger> levelRightCount = new HashMap<>(); quizItems.stream().forEach(quizItem -> { levelRightCount.putIfAbsent(quizItem.getLevel(), new AtomicInteger()); if(quizItem.isRight()) { levelRightCount.get(quizItem.getLevel()).incrementAndGet(); } }); //预估总词数 AtomicFloat count = new AtomicFloat(); quizItems.stream().filter(quizItem -> quizItem.isRight()).forEach(quizItem -> { //计算每一个级别答对的比率 = 每一个级别答对的题数 / 每一个级别总的题数 float rightRate = levelRightCount.get(quizItem.getLevel()).intValue() / (float)LEVEL_TO_TOTAL_COUNT.get(quizItem.getLevel()); //如果题目属于第一级, 则将第一级答对的比率乘以固定的预估值作为该题预估词数 if(quizItem.getLevel() > 1){ //如果题目不属于第一级, 则将上一级答对的比率和本级相乘 //然后用这个比率乘以固定的预估值作为该题预估词数 int lastLevel = quizItem.getLevel() - 1; float lastRightRate = levelRightCount.get(lastLevel).intValue() / (float)LEVEL_TO_TOTAL_COUNT.get(lastLevel); //如果上一级全部答错, 则将上一级的答对比率固定设置为0.1 if(lastRightRate == 0){ lastRightRate = 0.1f; } rightRate *= lastRightRate; } count.addAndGet(SCALE*rightRate); }); int cost = (480 - (int)(endQuizTime - startQuizTime)/1000) * 20; //期望答题时间是8分钟。每落后一秒钟预估词数减20, 最多减量不超过9600 if(cost < -9600){ cost = -9600; } //期望答题时间是8分钟。每提前一秒钟预估词数加20,最多加量不超过3600 if(cost > 3600){ cost = 3600; } //假定做题最快时间不少于4分钟,如果少于四分钟,每少N秒预估词数就减去4800+N*20 if(cost > 4800){ cost = -cost; } //返回预估值 if((count.intValue() + cost) > 0){ return count.intValue() + cost; } //如果如上算法最后获得的预估词数是负数,则去除负号取绝对值 return - (count.intValue() + cost); }
相关推荐
随机梯度下降(Stochastic Gradient Descent, SGD)是一种在机器学习和优化问题中广泛应用的迭代算法,尤其在处理大规模数据集时表现出高效性。它主要用于求解损失函数最小化的问题,例如在训练神经网络或者线性回归...
随机梯度下降算法是指使用随机采样的一部分数据来计算梯度的算法。这种算法的优点是计算复杂度低,但缺点是收敛性不稳定。 小批量梯度下降算法是指使用小批量数据来计算梯度的算法。这种算法的优点是计算复杂度低且...
这个资源提供了使用Python和随机梯度下降实现逻辑回归的实例,对于学习和理解这两种算法具有很高的价值。通过分析和运行`randomLogistic.py`,你可以深入理解逻辑回归和随机梯度下降的工作机制,并掌握如何在实际...
在机器学习领域,梯度下降算法是一种非常基础且重要的优化方法,主要用于求解函数的最小值,尤其是在训练神经网络和构建各种预测模型时。本文将深入探讨梯度下降的原理、实现过程以及它在实际应用中的重要性。 一、...
损失使用平方函数,简单的线性模型 y = theta1 + theta2 * x
梯度下降是一种广泛应用于机器学习和深度学习的优化算法,其主要目的是为了找到目标函数的极小值点。梯度下降算法通过迭代的方式更新模型参数,使得目标函数值不断下降,直至收敛。在介绍梯度下降算法的不同变种之前...
梯度下降算法是一种在机器学习和优化问题中广泛使用的迭代方法,用于求解函数的局部最小值。在本示例中,我们关注的是如何在MATLAB环境中实现这一算法。MATLAB是一款强大的数学计算软件,适合进行数值分析和算法开发...
随机梯度下降则仅使用一个样本来计算梯度,速度快但可能会频繁震荡;小批量梯度下降介于两者之间,平衡了速度和稳定性。 在实际应用中,学习率(Learning Rate)是梯度下降算法的重要超参数,它决定了每次参数更新...
c#实现梯度下降算法逻辑回归c#实现梯度下降算法逻辑回归c#实现梯度下降算法逻辑回归
随机梯度下降算法SDG的MATLAB实现,数据集可到UCI数据库里下载
随机梯度下降算法的主要思想是,在迭代过程中随机选择一个或几个样本的梯度来替代总体梯度,从而大大降低了计算复杂度。 随机梯度下降算法的优点在于,它可以处理大规模机器学习问题,并且可以与深度学习技术结合...
梯度下降算法是一种在机器学习和优化问题中广泛使用的迭代方法,主要用于求解函数的局部最小值。在本文中,我们将深入探讨梯度下降的概念、原理,并通过MATLAB实现进行详细解释。 首先,理解梯度的基本概念至关重要...
在机器学习领域,数据挖掘是探索大量数据以发现有价值信息的过程,而梯度下降算法是其中一种核心的优化方法,特别是在训练模型时调整参数。本文将深入探讨如何使用C++来实现梯度下降算法,以解决机器学习问题。 ...
下面是一个简单的代码示例,使用梯度下降算法来解决一个衣服估价问题。 ```c #include #include using namespace std; int main() { double matrix[4][2] = {{1, 4}, {2, 5}, {5, 1}, {4, 2}}; double result...
分布式随机方差消减梯度下降算法topkSVRG是一种针对大规模数据集的分布式训练问题而设计的优化方法。在机器学习中,通常需要通过优化一个目标函数来求解参数,而梯度下降是最常见的优化手段之一。随机梯度下降(SGD...
理论模拟仿真了基于变形镜与随机并行梯度下降(SPGD)算法的无波前探测自适应光学系统(AOS)。为提高基于SPGD算法的无波前探测AOS的收敛速度,在不降低精度的前提下,对SPGD算法中关键参数随机扰动幅值和增益系数的关系...
梯度下降算法是一种在机器学习和优化问题中广泛使用的迭代方法,主要用于求解函数的局部最小值。在本文中,我们将深入探讨梯度下降的基本概念、工作原理、数学基础,以及如何通过Matlab实现它。 一、梯度下降概述 ...
随机梯度下降则采取不同的策略,它在每次迭代时仅使用一个样本来计算梯度。这使得SGD的计算速度显著提高,特别适合大数据集。SGD的步骤如下: 1. 初始化模型参数。 2. 选择一个训练样本,计算其对应的损失函数关于...
在机器学习领域,梯度下降算法是一种非常基础且重要的优化方法,主要用于求解函数的最小值,尤其是在训练神经网络和解决线性回归等预测模型时。在这个“机器学习梯度下降算法js实现演示”中,我们将探讨如何使用...