文档章节

一种使用随机抽样梯度下降算法来预估词汇量的方法

杨尚川
 杨尚川
发布于 2015/12/19 00:20
字数 1546
阅读 1394
收藏 24

我们经常可以看到各种各样的英语词汇量测试功能,你测试过吗?你觉得准吗?

我使用过有道词典的词汇量测试功能,我认为它最大的问题是,不管是谁不管测多少次,每次测的词都是固定不变的,这就好像高考,全国各地年复一年都考同一套题。

当然,它是怎么来评估词汇量,使用什么算法,那就更不知道了。

本文提出了一种使用随机抽样梯度下降算法来预估词汇量的方法,经大量用户反映,很准,你是不是心动了,想马上试一试呢?立马测试一下吧,使用中文定义使用英文定义

测完词汇量,我们就来看看如何使用随机抽样梯度下降算法来预估词汇量:

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);
}


A Java software library of stochastic streaming algorithms






© 著作权归作者所有

杨尚川

杨尚川

粉丝 1103
博文 220
码字总数 1624053
作品 12
东城
架构师
私信 提问
数据挖掘面试准备(1)|常见算法(logistic回归,随机森林,GBDT和xgboost)

先提一下奥卡姆剃刀:给定两个具有相同泛化误差的模型,较简单的模型比较复杂的模型更可取。以免模型过于复杂,出现过拟合的问题。 如果你想面数据挖掘岗必须先了解下面这部分的基本算法理论...

yabmarlboro
2018/07/10
0
0
随机梯度下降(SGD)和批量梯度下降(BGD)的区别

梯度下降(GD, gradient descent):梯度下降法是求解无约束最优化问题的一种常用方法,比较适用于控制变量较多,受控系统比较复杂,无法建立准确数学模型的最优化控制过程。是一种迭代算法,...

qq_39521554
2018/05/26
0
0
深度 | SGD过程中的噪声如何帮助避免局部极小值和鞍点?

  选自noahgolmant   作者:Noah Golmant   机器之心编译   参与:Geek AI、刘晓坤      来自 UC Berkeley RISELab 的本科研究员 Noah Golmant 发表博客,从理论的角度分析了损失...

机器之心
2018/05/13
0
0
机器学习系列(十六)——随机梯度下降Stochastic Gradient Descent

随机梯度下降法Stochastic Gradient Descent 在之前的梯度下降法解决线性回归问题中,梯度向量的每一项都要有所有样本参与运算,因此也称作批量梯度下降法Batch Gradient Descent。但这显然带...

Ice_spring
07/10
0
0
Logistic回归模型|算法实现

01 起 在这篇文章中,我们学习了逻辑斯谛回归模型的算法原理:统计学习方法|logistic回归 今天我们基于算法原理,给出利用随机梯度上升算法求解逻辑斯蒂回归模型参数的过程。 我们先来回顾一...

邓莎
2018/08/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

全面兼容IE6/IE7/IE8/FF的CSS HACK写法

浏览器市场的混乱,给设计师造成很大的麻烦,设计的页面兼容完这个浏览器还得兼容那个浏览器,本来ie6跟ff之间的兼容是很容易解决的。加上个ie7会麻烦点,ie8的出现就更头疼了,原来hack ie...

前端老手
15分钟前
3
0
常用快递电子面单批量打印api接口对接demo-JAVA示例

目前有三种方式对接电子面单: 1.快递公司:各家快递公司逐一对接接口 2.菜鸟:支持常用15家快递电子面单打印 3.快递鸟:仅对接一次,支持常用30多家主流快递电子面单打印 目前也是支持批量打...

程序的小猿
18分钟前
6
0
Yii 框架中rule规则必须搭配验证函数才能使用

public $store_id;public $user_id;public $page;public $limit;public $list;public $mch_list;public $cart_id;public $is_community;public $shop_id;public $cart_typ......

chenhongjiang
21分钟前
4
0
Flutter使用Rammus实现阿里云推送

前言: 最近新的Flutter项目有“阿里云推送通知”的需求,就是Flutter的App启动后检测到有新的通知,点击通知栏然后跳转到指定的页面。在这里我使用的是第三方插件Rammus来实现通知的推送,之...

EmilyWu
21分钟前
41
0
Knative 实战:三步走!基于 Knative Serverless 技术实现一个短网址服务

短网址顾名思义就是使用比较短的网址代替很长的网址。维基百科上面的解释是这样的: 短网址又称网址缩短、缩短网址、URL 缩短等,指的是一种互联网上的技术与服务,此服务可以提供一个非常短...

阿里巴巴云原生
36分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部