2018年3月26日 下午11:35













滑动窗口可以更容易的看出整体的变化趋势,如果是单日的话容易起伏比较大
滑动窗口有点理解成是卷积核

RNN实在CNN的基础上增加了本层神经元之间的联系
站在A的角度,他有两个输入,一个输出









五讲:Python机器学习(2)
2018年3月26日 下午11:33





























Bagging的关键是有放回的选取
随机森林=bagging+boosting




算法(2018)
各个题目的简略总结
机器学习的核心步骤
2018年3月21日 下午11:23
这里面最关键的一个认识:模型==数学公式
总的态度
2018年3月20日 下午4:22
最关键:
自己提出问题,并且提出问题的质量。
前序
做算法题的思路和做项目的思路是不同的,首先要找两个题热身,将思维转过去
正文:
- 算法其实并不是啥高端的东西,就像我们生活中各种各样小的技巧一样,对待这些小的技巧的态度应该是好玩。
- 难是因为你要从0开始想问题,所以,我们一定不要从0开始思考算法,而是借助所有的知识、方法作为工具
- 并且,设计算法我们不要从创建数据开始思考,我们完成的就是一个已经给定参数,然后给出特定的返回就行。
- 其实算法的这些题,知道方法之后也就不难了。关键是你要积累这些方法
【思考】,其实就是问自己问题。但是问题的好坏就决定了你的思路,最关键
【分析】,先从简单的一个两个开始具体的思考,发现规律,人的脑子大家都一样,直接来个复杂的谁都受不了。分析出唯一的一个核心规律/总结
【算法思路】,要画出具体的程序运行一连窜步骤图,在每一步的图中都标明变量的值。
前两节重点是连接链表和堆栈的属性,他们的属性是帮助我们解决特定问题的工具
递归是一种函数代码格式,回溯是一种算法/思维。但是,他们都可以看成我们解决问题的tool之一,和链表栈等都是工具而已,我们做的事情就是在分析清楚问题之后,拿上合适的工具,然后干活
debug操作:
2018年3月11日 上午11:18
- 注意这时要用debug模式运行,而不是run,因为我们要打断点进行联调
- 在debug模式,我们的断点在更改之后,立即在下一次访问生效,不用重新启动tomcat
- 在debug模式,即使断点已经到来,我们依然可以在当前断点的后面增加断点,同样也是立即生效
- debug 放慢程序执行速度,观察瞬间的操作
- Debug 临时设置变量的值,而不是修改之后重启动tomcat
- Debug 在tomcat集群中,我们可以只留一个tomcat执行,其他的全部打断点停止,观察单个tomcat的执行情况
redis分布式锁
2018年3月10日 下午12:10
这个代码对应于tack/CloseOrderTask.java类,我这里就先不分析代码了!
- 我的通俗理解:小明和小王逛街累了抢一个椅子,当然是谁先抢上谁坐,说明椅子有主了。但是如果一个人坐在那里好多个小时,他始终不离开椅子,自己玩手机,另一个人就得一直等着他。等上一个小时,站着的哪个就火了,直接踹开那家伙,自己就坐了上去。
- 离开椅子的标志是:在redis中删除了CLOSE_ORDER_TASK_LOCK这个变量。
- 抢上椅子的标志为:在redis中设置了CLOSE_ORDER_TASK_LOCK这个变量
- 其实expire就可以起到防止死锁的作用,让50秒以后redis就会自动删除这个键。我理解这是一个双重保险。
版本一:
- 第一个版本:不使用redis,只是使用Spring Schedule使关单程序周期执行。但是由于我们是tomcat集群,这个关单程序会在两个tomcat同时执行,并且同时操作数据库。
- 一定会带来的问题:定时任务同时执行,对数据库的访问造成数据混乱
版本二:
- 第二个版本:使用redis做为分布式的锁,即使这个关单程序会在两个tomcat同时执行,但是会由于有这个锁的存在,使他们走不同的分支,只有其中一个分支可以执行关单程序业务流程,去操作数据库。如下图,这样就不会造成数据库的访问造成数据混乱。
- 极端条件下可能出现的问题:当我们setnx将“锁”放入redis之后,此时停止tomcat,那么原先放入的“锁”就会一直存在reids中,不会删除,以后由于这个“锁”的存在,永远不会执行真正的业务。最终造成死锁。
- 关键:
- 使用了setnx这个原子性的操作,这就保证了即使同时执行,也会有一个先来后到,一个走左分支,一个走右分支

- 使用了setnx这个原子性的操作,这就保证了即使同时执行,也会有一个先来后到,一个走左分支,一个走右分支
版本三:
- 第三个版本:假设,当我们setnx将“锁”放入redis之后,此时停止tomcat。那么此时两个tomcat中的同时执行的程序,永远都会走到“获取锁失败”的分支。那么我们就需要在执行了“获取锁失败”的分支中解决这个问题,在redis中这个“死锁”条件存在的情况下,也可以执行相关业务
- 关键:
- 在setnx时,我们的的“锁”key-value值要设置这个锁的超时时间,当然这个只是一个字符串的类型,是看的,而不是他自动会起作用的。
- 第一种情况:
- 还没有超过了这个“死锁”的超时时间
- 我们规定此时已然不能执行业务,必须等待这个“死锁”的时间到了
- 第二种情况:
- 已经超过了这个“死锁”的超时时间,我们此时就可以进行业务操作了,但是此时同样还是两个tomcat都要请求执行,那给谁呢?这不是回到了一开始的情况了吗
- 关键:
- 在第二个版本中我们使用原子操作setnx,来确定到底是哪个tomcat执行业务,在这里我们使用另一原子操作getset来区分。
- 总结:
- 对于判断一来说,两个tomcat要true都true,要false都false
- 对于判断二来说,一个tomcat是true一个tomcat是false

总结:
- redis 两个原子性操作是实现的关键
- Redis的中setnx的值,就是”锁”
- 一个锁,有两个时间
- 一个是setnx时的字符串value
- 一个是redis本身可以对单个数据设置的超时时间





























