协程,又称微线程,纤程。英文名Coroutine

我们可以将协程理解为一个子程序/函数的特例。与子程序/函数不同的是,子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。

子程序与主程序是调用与被调用关系,而协程之间是平等的关系,先执行一个协程A,在适当的时候去执行另一个协程B,在适当的时候又返回协程A继续执行。协程在单线程中实现了类似多线程的效果,但因为协程始终属于一个线程,不同协程的执行只是一个线程在执行不同的“函数”而已,因此它省去了线程切换[……]

Read more

这两天仔细研究了一下SVM的底层数学原理,感觉大学基础数学没好好学,现在看起来真的很吃力啊~~
整理了几篇关于SVM原理的文章,大家有兴趣可以看看。
1. jasper的SVM入门教程,总共有9篇,作者文笔了得,深入浅出,将很复杂抽象的概念都能讲解的特别清楚,非常值得一看。
2.July、pluskid的支持向量机通俗导论(理解SVM的三层境界),讲得十分详细,很多细节都做了推导。
3.勿在浮砂筑高台【机器学习详解】SVM解二分类,多分类,及后验概率输出以及【机器学习详解】SMO算法剖析

由于编辑公式很繁琐,我在纸上进行了推导。主要参考了勿在浮砂筑高台的推导过程!

[……]

Read more

现在博客正式从aws上迁移到malash的服务器上。嘻嘻,以后再也不用花钱啦~~
然后malash跟我强行装了“用两句Haskell实现快排”的逼。确实感觉到函数式编程无限的想象力。
Haskell如何写,具体忘了,下面是Python的实现,原理类似。

def sort(arr):
    if len(arr) == 0:
        return []
    x = arr.pop(0)
    return sort(filter(lambda a : a < x ,arr)) + [x] + sort(filter( lambda a : a > x, arr))

整个世界清净了,这确实是快排~~

下面是一个不怎么”函数式”的实现,代码还是很简单,并且很直观!

def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) / 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quicksort(left) + middle + quicksort(right)

最近在看周志明的《深入理解Java虚拟机-JVM高级特性与最佳实战》,要学习JVM,最好还是自己先能编译一遍。书中给出了在Mac上编译openjdk7的教程,但距离今天太过久远,书中的方法并不能奏效。只能自己上网一点点来了。

最开始打算是在我的Mac上编译,我的OSX系统是macOS sierra(10.12.2),从此我算是开始了噩梦般的一天。各种网上有的,或者没有的Error简直把我折磨得要奔溃。期间光JDK都不知道装了多少个,现在想起来还是心累。正好我桌子底下还有一台机子装着ubuntu14.04,那索性就弃了Unix的坑,用Linux来编译吧。

总得来说在Linux上编译,[……]

Read more

题目描述:
如果两个字符串中的字符一样,出现次数也一样,只是出现的顺序的顺序不一样,则认为这两个字符串是兄弟字符串,或称变位词。例如”bad”和”adb”即为兄弟字符串。现提供一个字符串,请问如何在字典中迅速找到它的兄弟字符串。例如待查找的字符串是”apple”,字典是{“appl”,”paal”,”aplep”,”bb”,”leapp”,”hello”},则输出的单词应为:”aplep”, “leapp”。

题目描述:《编程之法》、《编程珠玑》
原理比较简单,但是要完整地实现起来,需要很多基础的小算法,如排序,搜索等。应该,用这个题顺便来练习一下基本算法,还是挺有意义的。

解[……]

Read more

问题描述:输入具有n个浮点数的向量x,输出向量x中任何连续子向量中的最大和。例如:
如果x={1,2,3},则output=6
如果x={1,-2,3},则output=3
如果x={31,-41,59,26,-53,58,97,-93,-23,84},则output=187
当所有输入为负数时,最大连续子向量为空向量,输出为0

问题来源:《编程珠玑 第2版》第8章

对于该问题,平方算法书中给出了两种,都比较直观。

作者提出了一种O(nlogn)的算法,主要利用分治和递归。将原向量从中间分开,分为左向量和右向量。递归寻找左向量,右向量,以及以分开点为起点的向左最大向量[……]

Read more

1)首先,能够获得大家一致认可的是,不论一个servlet保存多长时间,它的生存周期肯定会短于容器的生存期,servlet实例在容器被移除之前被销毁,即所谓的“皮之不存,毛何附焉”;
(2)servlet生存期的定义,包括加载、实例化、初始化、处理客户端请求以及如何被移除。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。
(3)重点是:servlet采用的是单实例,多线程模式,即在同一时刻,容器中只存在某servlet的一个实例;同时,多请求(用户)会获得多个线程来运行同一个实例;
(4)在容器生命周期内,不同时间段会生存se[……]

Read more

scipy是python下的一个数值计算工具包,sklearn依赖于这个包。当我调用sklearn的CountVectorizer时,提示没有发现包scipy,直接安装又总是失败。
问题就在于 scipy的安装需要依赖很多别的包,在windows这个蛋疼的平台下极有可能安装失败。并且在windows上scipy的安装依赖于mkl+numpy这个包。这个包官方并没有提供,而在http://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy这里面有提供。

我的python是3.5,64位。 所以我选择numpy-1.12.0b1+mkl-cp35-cp35m[……]

Read more

在文本分类中有这样一个场景,当我们已经分好词,并构造出词频向量后,这个向量会很大,经常会多达几万维,甚至十几万维。这种规模的模型如果要用SVM等较高级的机器学习进行训练的话,那简直是慢的要死,深度学习就再别谈了。为了较少向量维度,我们可以采用一些方法,比如在词向量中过滤掉词频小于N的词,这个N可以自己定,但一般取值比较小。采用这种方法能有效降低向量维度,但是还是不够。我们不能为了降低向量维度到一定的程度而不断地增大N值,因为这种过滤掉低频次的方法,对向量维度的减少是随着N的增大而逐步降低的,比如说:将N=1,你可以过滤掉10000个单词;接着N=2,你过滤掉了15000个单词;N=3,过滤掉1[……]

Read more

最近在看nodejs,感觉它的异步编程思想确实有些不习惯。但好在ES6以后支持async、await特性,会慢慢让代码更加好看。也学了下node中最流行的框架express,以及它的下一代版本叫做koa。给我的感觉就是简练,跟ruby的rails,php中的laravel,还有python的django这些大框架比起来真的是太简练了。这些大框架给你封装了太多东西,只要学会了基本的使用方法就能满足绝大部分业务需求。而express以及koa是真正轻量级框架,真的十分简练。并且它们是类似于组件(在它们中叫做中间件)拼合的开发方式。需要用到什么功能,就引入相应的包就行了。能让开发者在更加底层的视角学[……]

Read more