2010-05-05
天使
天使的眼睛闪烁着
星星的光芒
它来到我身边
不声不响
大人们都不再相信有天使
我却看到它折断的翅膀
远山
黄昏里的远山温柔的注视着我
连绵的山脊如一幅活动的国画
我愿只做那山里的一只小虫
用一生的时间来将它看护
候鸟与风筝
候鸟并非一意孤行
它飞去北方,飞去更远的北方
它也会飞回来,飞去更南的南方
它遇到过很多漂亮风筝
在每年的春天
风筝像花儿一般在风中绽放
清明
淅淅沥沥的晨雨
把山里刚长出来的绿叶打得湿漉漉的
青烟悠悠 有肉有酒
明年 谁还在雨中放牛
布
总是在那块美妙的布上翻滚
总是以为能找到最初的纯真
春天
一颗枯死的老树要怎样才能发出新芽
一口干涸的深井要怎样才能冒出清泉
一个故事的结尾要怎样才可以延续
一颗孤独的心要怎样才可以重新开花
每一个春天
都是沧海桑田
2009-11-27
失去的东西永不复归
叶赛宁
我无法召回那凉爽之夜,
我无法重见女友的倩影,
我无法听到那只夜莺
在花园里唱出快乐的歌声。
那迷人的春夜飞逝而去
你无法叫它再度降临。
萧瑟的秋天已经来到,
愁雨绵绵,无止无境。
坟墓中的女友正在酣睡,
把爱情的火焰埋葬在内心,
秋天的暴雨惊不醒她的梦幻,
也无法使她的血液重新沸腾。
那支夜莺的歌儿已经沉寂,
因为夜莺已经飞向海外,
响彻在清凉夜空的动听的歌声,
也已永远地平静了下来。
昔日在生活中体验的欢欣,
早就已经不冀而飞,
心中只剩下冷却的感情,
失去的东西.永不复归。
明明知道,不能再如此下去,可我还在下坠的漩涡里,闭眼享受。晕了,早就已经晕了。
论文还未发表,教研室的同学早就弄完了,老师明明在催,自己却一直在逃避。好想回到很久以前的小学,一个寒假的作业,留着最后那么几天赶呢。可现在已经不是小学,时间积累的东西越来越多,自己越来越懒得弄。以为一闭眼就可以到明天,明天一闭眼就毕业。没有多少时间浪费了,现在细细一算,离毕业的时间也就那么6,7个月,还包括过年的时间。研究生生活就是一个悲剧,学到的东西忘记,新学的东西还没开始,我还是没有学会如何学习,掌控自己的时间。
一天对着电脑,时间在一个页面一个页面的翻过,完全不知道消耗在了哪里。唰,一天,唰,又一天。OMG,上帝也救不了我。
说了太多的计划,也说了太多的借口,累积累积,像一座山,该如何是好啊。
2009-11-19
看到还有人在博客上放羊的,嗯,好大一群,叫做寂寞的羊啊。
听说你又辞职了,听说你姐姐生了第二个女儿,听说你要去厦门了。厦门,应该是温暖如春的吧。多久以前,说好要去看海,可你在海边待了这么多年,我却没有去看过海,没看过你。多年以后我在山坡上放羊,闻着春风从海边卷着你的气息深入内陆,羊群像白云一样分散在青草堆里,我躺着抓住天空的一朵朵云,再放开,它们也像我的羊一样,将被我放到这个世界上有你的角落里。
你姐姐的女儿真是很乖,真是像你。你以后也会有女儿,和她的爸爸。我这里真的很冷,把博客的界面换成暖色调,看起来温暖一些。脚很凉,据说前天晚上还下了雪,可是我在屋子里,没有看到。成都这样一个城市,下雪可真不是件小事情,前年下雪的时候我刚要离开成都,纷纷的雪花就从我头上飘下来,很多人都在笑,雪,在你那边更难见到了吧,很多时候,我们选择了地点,那风景也同时被选择,还有生活。
有多久没有仰望天空,那么静静的,听风吹过。我们不过是浩瀚宇宙的一颗微尘,被风吹起,然后陨落。不过是划过天空的一颗流星,在夜空偶尔被你看见,或者在白天和你错面。不过是天空里飘来的几朵白云,山坡上吃草的几只羊。为什么,在这么小的地球上,你总在你的海边看海,看我放过去的白云,我总在我的盆地听风,听你耳语的声音。
2009-06-12
维护也太久了。
2009-04-20
因为走路慢了一点,思考快了一点。银杏树的叶子长出来了,翠玉一般,却在风里摇来摇去。最喜欢现在这个时候,不冷不热,有风有雨,也有阳光。坐在随便哪一条凳子上歇一歇吧,听听风声,听听阳光打在树叶上的声音,仿佛有碎玉落在身上。
因为走路慢了一点,路人快了一点。看他们一个一个超过自己,匆匆不知作何而去。朋友们啊,歇一歇吧,坐在随便哪一条凳子上哪棵树下,闭着眼睛,听听自然的喃喃密语,想想你忘记很久的芳香。
2009-04-16
最近一次看见你是在梦里,我牵着你的手,看着她的眼睛。
我喜欢做梦。我总是在梦里见到你。
想一想,一二三,我们有三年没见了。起初的两年我没有想你,拒绝一切属于你的消息。大量的时间在枯燥而充实的读书和喝酒度过。只有在深夜的时候,我偶尔希望你过得开心。很多人问我, 为什么这么多年的感情一下就全无音信。我没有回答。我和冬冬聊天,也从来不问你,她问我想不想知道你的消息,我也没有回答。好像沉默是唯一的回答,是我心虚的借口。我们一直没聊你,怕听到任何关于你的好的坏的。我想你是我的,从十多年前第一次见你,你就一直是我的。
我总梦见你,在梦里和你说 了很多,不知道你晓不晓得。而那两年唯一一次联系是在你和姐姐闹翻之后,你说准备自己出去找工作。我什么也没说,还违心的说要你控制情绪。你一个人到了海 口,钱包掉了,身上就几十块钱。这都是冬冬后来和我说的,我听了之后”哦”了一声。一时语塞。如果,像你前几天问我的一样,当时你来成都找我,结局是不是会不一样,我给你回的”什么时候”一定让你伤了心。你一直是我的,像十一年前你嘟起的小嘴,像陪你走过的路,黑暗里,没有尽头。
后来你到了广州,和你的男友。你和我说,你那么爱喝可乐,多喝点可口可乐的吧,他在可口可乐。我喜欢喝百事,现在寝室堆了一堆可口可乐的瓶子。冬冬总问我后不后悔,我后悔的是,没有在我能够的时候让你更幸福。
最近和你聊很多,在我有了新女友之后。我忘了我什么时候知道你有男友的,去年的夏天,冬天,我的举止疯狂而又疲倦。我不否认我在她的眼角看到了你的温柔,但是她不是你,这对她不公平。我和冬冬说,我累了想找一个女朋友,一个有你的名字,一个有你的影子。冬冬说我疯了。
你的工作似乎很闲,生活很有规律。下午5点准时下班,回家做饭。我们聊了很多。第一次你说,
你常常梦到高考,说也许你心底里希望还有机会高考,有机会选择自己的大学, 有机会能够大学时能离我离成都近一点。
我当时就哭了,为你的眼泪一涌而出。我极力埋着头不让对面师兄看到。几分钟我没有说话,后来我对你说我哭的很伤心,再后来我说我其实去了WC。
你说但事实常常不能有这么多如果,也无法让你重新选择 。你还说,希望结婚之前能够见我一面,我说”抓紧”,我是要你抓紧来见我还是抓紧结婚呢。
我又在梦里见到你了,我牵着你的手,一转头却看到她的眼睛。我们站在水里。
我想你是我的,一直是我的,在水里。那片蓝色的海洋。
2009-04-14
我梦到你。
你活着的时候我梦到你死了,我哭着醒了。
你死了我梦到你活着,对我说话,我也哭着醒了。
去年,我坐在火车上,无言,伤心。回家看到你,你突然老了。眼睛藏在眼镜后,浮肿的厉害。他们说她陪你那么久,现在走了,你也不久了。我记得她在早晨被埋下黄土里,我记得嘈杂的乐声里你掩面而泣。
过年回家,刚好是表哥的婚礼,我吃了酒就去看你。冬日的暖阳,端坐在椅子上看报纸的你睡得安详。我蹲在不远的田埂上拿相机照你,风吹歪你的白胡子,我听见时间淌过的声音。我给你看我照的表哥孩子的照片,还有你的照片。你笑。你一定是很久没有看镜子,你说眼镜看起来歪了点。
我应该和你多待一点时间,却总来去匆匆。可你怎么可能会不在呢,我记事你就一直在啊,像一颗树,我坐在你的椅子上想。你是不是坐在这里也想过我,在你看到报纸里有关大学的新闻,在你翻过一张报纸的瞬间,在你偶尔疲倦打盹的时候,你是不是也会梦到我。
你总是为我自豪的。我却不知道自己哪点值得你自豪。我没有去过缅甸打过鬼子,也没有认真做过一件有点意义的事情。你做了几十年,也没跟我说过。
早上突然下起小雨,送你走的队伍打着花花绿绿的雨伞。沿途的鞭炮噼里啪啦的响,我躲在湿了的白布下没有哭。黄土填了一层一层,压紧。你睡在下面安详,不做声。我抱着湿了的白布往回走,小叔叔端着你的画像走在前面。我们没说话,顺着原路回了家。
2009-03-31
从 SVM的那几张图可以看出来,SVM是一种典型的两类分类器,即它只回答属于正类还是负类的问题。而现实中要解决的问题,往往是多类的问题(少部分例外,例如垃圾邮件过滤,就只需要确定“是”还是“不是”垃圾邮件),比如文本分类,比如数字识别。如何由两类分类器得到多类分类器,就是一个值得研究的问题。
还以文本分类为例,现成的方法有很多,其中一种一劳永逸的方法,就是真的一次性考虑所有样本,并求解一个多目标函数的优化问题,一次性得到多个分类面,就像下图这样:

多个超平面把空间划分为多个区域,每个区域对应一个类别,给一篇文章,看它落在哪个区域就知道了它的分类。
看起来很美对不对?只可惜这种算法还基本停留在纸面上,因为一次性求解的方法计算量实在太大,大到无法实用的地步。
稍稍退一步,我们就会想到所谓“一类对其余”的方法,就是每次仍然解一个两类分类的问题。比如我们有5个类别,第一次就把类别1的样本定为正样本,其余2,3,4,5的样本合起来定为负样本,这样得到一个两类分类器,它能够指出一篇文章是还是不是第1类的;第二次我们把类别2 的样本定为正样本,把1,3,4,5的样本合起来定为负样本,得到一个分类器,如此下去,我们可以得到5个这样的两类分类器(总是和类别的数目一致)。到了有文章需要分类的时候,我们就拿着这篇文章挨个分类器的问:是属于你的么?是属于你的么?哪个分类器点头说是了,文章的类别就确定了。这种方法的好处是每个优化问题的规模比较小,而且分类的时候速度很快(只需要调用5个分类器就知道了结果)。但有时也会出现两种很尴尬的情况,例如拿一篇文章问了一圈,每一个分类器都说它是属于它那一类的,或者每一个分类器都说它不是它那一类的,前者叫分类重叠现象,后者叫不可分类现象。分类重叠倒还好办,随便选一个结果都不至于太离谱,或者看看这篇文章到各个超平面的距离,哪个远就判给哪个。不可分类现象就着实难办了,只能把它分给第6个类别了……更要命的是,本来各个类别的样本数目是差不多的,但“其余”的那一类样本数总是要数倍于正类(因为它是除正类以外其他类别的样本之和嘛),这就人为的造成了上一节所说的“数据集偏斜”问题。
因此我们还得再退一步,还是解两类分类问题,还是每次选一个类的样本作正类样本,而负类样本则变成只选一个类(称为“一对一单挑”的方法,哦,不对,没有单挑,就是“一对一”的方法,呵呵),这就避免了偏斜。因此过程就是算出这样一些分类器,第一个只回答“是第1类还是第2类”,第二个只回答“是第1类还是第3类”,第三个只回答“是第1类还是第4类”,如此下去,你也可以马上得出,这样的分类器应该有5 X 4/2=10个(通式是,如果有k个类别,则总的两类分类器数目为k(k-1)/2)。虽然分类器的数目多了,但是在训练阶段(也就是算出这些分类器的分类平面时)所用的总时间却比“一类对其余”方法少很多,在真正用来分类的时候,把一篇文章扔给所有分类器,第一个分类器会投票说它是“1”或者“2”,第二个会说它是“1”或者“3”,让每一个都投上自己的一票,最后统计票数,如果类别“1”得票最多,就判这篇文章属于第1类。这种方法显然也会有分类重叠的现象,但不会有不可分类现象,因为总不可能所有类别的票数都是0。看起来够好么?其实不然,想想分类一篇文章,我们调用了多少个分类器?10个,这还是类别数为5的时候,类别数如果是1000,要调用的分类器数目会上升至约500,000个(类别数的平方量级)。这如何是好?
看来我们必须再退一步,在分类的时候下功夫,我们还是像一对一方法那样来训练,只是在对一篇文章进行分类之前,我们先按照下面图的样子来组织分类器(如你所见,这是一个有向无环图,因此这种方法也叫做DAG SVM)

这样在分类时,我们就可以先问分类器“1对5”(意思是它能够回答“是第1类还是第5类”),如果它回答5,我们就往左走,再问“2对5”这个分类器,如果它还说是“5”,我们就继续往左走,这样一直问下去,就可以得到分类结果。好处在哪?我们其实只调用了4个分类器(如果类别数是k,则只调用k-1个),分类速度飞快,且没有分类重叠和不可分类现象!缺点在哪?假如最一开始的分类器回答错误(明明是类别1的文章,它说成了5),那么后面的分类器是无论如何也无法纠正它的错误的(因为后面的分类器压根没有出现“1”这个类别标签),其实对下面每一层的分类器都存在这种错误向下累积的现象。。
不过不要被DAG方法的错误累积吓倒,错误累积在一对其余和一对一方法中也都存在,DAG方法好于它们的地方就在于,累积的上限,不管是大是小,总是有定论的,有理论证明。而一对其余和一对一方法中,尽管每一个两类分类器的泛化误差限是知道的,但是合起来做多类分类的时候,误差上界是多少,没人知道,这意味着准确率低到0也是有可能的,这多让人郁闷。
而且现在DAG方法根节点的选取(也就是如何选第一个参与分类的分类器),也有一些方法可以改善整体效果,我们总希望根节点少犯错误为好,因此参与第一次分类的两个类别,最好是差别特别特别大,大到以至于不太可能把他们分错;或者我们就总取在两类分类中正确率最高的那个分类器作根节点,或者我们让两类分类器在分类的时候,不光输出类别的标签,还输出一个类似“置信度”的东东,当它对自己的结果不太自信的时候,我们就不光按照它的输出走,把它旁边的那条路也走一走,等等。
大Tips:SVM的计算复杂度
使用SVM进行分类的时候,实际上是训练和分类两个完全不同的过程,因而讨论复杂度就不能一概而论,我们这里所说的主要是训练阶段的复杂度,即解那个二次规划问题的复杂度。对这个问题的解,基本上要划分为两大块,解析解和数值解。
解析解就是理论上的解,它的形式是表达式,因此它是精确的,一个问题只要有解(无解的问题还跟着掺和什么呀,哈哈),那它的解析解是一定存在的。当然存在是一回事,能够解出来,或者可以在可以承受的时间范围内解出来,就是另一回事了。对SVM来说,求得解析解的时间复杂度最坏可以达到O(Nsv3),其中Nsv是支持向量的个数,而虽然没有固定的比例,但支持向量的个数多少也和训练集的大小有关。
数值解就是可以使用的解,是一个一个的数,往往都是近似解。求数值解的过程非常像穷举法,从一个数开始,试一试它当解效果怎样,不满足一定条件(叫做停机条件,就是满足这个以后就认为解足够精确了,不需要继续算下去了)就试下一个,当然下一个数不是乱选的,也有一定章法可循。有的算法,每次只尝试一个数,有的就尝试多个,而且找下一个数字(或下一组数)的方法也各不相同,停机条件也各不相同,最终得到的解精度也各不相同,可见对求数值解的复杂度的讨论不能脱开具体的算法。
一个具体的算法,Bunch-Kaufman训练算法,典型的时间复杂度在O(Nsv3+LNsv2+dLNsv)和O(dL2)之间,其中Nsv是支持向量的个数,L是训练集样本的个数,d是每个样本的维数(原始的维数,没有经过向高维空间映射之前的维数)。复杂度会有变化,是因为它不光跟输入问题的规模有关(不光和样本的数量,维数有关),也和问题最终的解有关(即支持向量有关),如果支持向量比较少,过程会快很多,如果支持向量很多,接近于样本的数量,就会产生O(dL2)这个十分糟糕的结果(给10,000个样本,每个样本1000维,基本就不用算了,算不出来,呵呵,而这种输入规模对文本分类来说太正常了)。
这样再回头看就会明白为什么一对一方法尽管要训练的两类分类器数量多,但总时间实际上比一对其余方法要少了,因为一对其余方法每次训练都考虑了所有样本(只是每次把不同的部分划分为正类或者负类而已),自然慢上很多。
2009-03-26
前文提到过,除了开方检验(CHI)以外,信息增益(IG,Information Gain)也是很有效的特征选择方法。但凡是特征选择,总是在将特征的重要程度量化之后再进行选择,而如何量化特征的重要性,就成了各种方法间最大的不同。开方检验中使用特征与类别间的关联性来进行这个量化,关联性越强,特征得分越高,该特征越应该被保留。
在信息增益中,重要性的衡量标准就是看特征能够为分类系统带来多少信息,带来的信息越多,该特征越重要。
因此先回忆一下信息论中有关信息量(就是“熵”)的定义。说有这么一个变量X,它可能的取值有n多种,分别是x1,x2,……,xn,每一种取到的概率分别是P1,P2,……,Pn,那么X的熵就定义为:

意思就是一个变量可能的变化越多(反而跟变量具体的取值没有任何关系,只和值的种类多少以及发生概率有关),它携带的信息量就越大(因此我一直觉得我们的政策法规信息量非常大,因为它变化很多,基本朝令夕改,笑)。
对分类系统来说,类别C是变量,它可能的取值是C1,C2,……,Cn,而每一个类别出现的概率是P(C1),P(C2),……,P(Cn),因此n就是类别的总数。此时分类系统的熵就可以表示为:
![clip_image002[4]](http://www.blogjava.net/images/blogjava_net/zhenandaci/WindowsLiveWriter/7fce385fe28b_D158/clip_image002%5B4%5D_thumb.gif)
有同学说不好理解呀,这样想就好了,文本分类系统的作用就是输出一个表示文本属于哪个类别的值,而这个值可能是C1,C2,……,Cn,因此这个值所携带的信息量就是上式中的这么多。
信息增益是针对一个一个的特征而言的,就是看一个特征t,系统有它和没它的时候信息量各是多少,两者的差值就是这个特征给系统带来的信息量,即增益。系统含有特征t的时候信息量很好计算,就是刚才的式子,它表示的是包含所有特征时系统的信息量。
问题是当系统不包含t时,信息量如何计算?我们换个角度想问题,把系统要做的事情想象成这样:说教室里有很多座位,学生们每次上课进来的时候可以随便坐,因而变化是很大的(无数种可能的座次情况);但是现在有一个座位,看黑板很清楚,听老师讲也很清楚,于是校长的小舅子的姐姐的女儿托关系(真辗转啊),把这个座位定下来了,每次只能给她坐,别人不行,此时情况怎样?对于座次的可能情况来说,我们很容易看出以下两种情况是等价的:(1)教室里没有这个座位;(2)教室里虽然有这个座位,但其他人不能坐(因为反正它也不能参与到变化中来,它是不变的)。
对应到我们的系统中,就是下面的等价:(1)系统不包含特征t;(2)系统虽然包含特征t,但是t已经固定了,不能变化。
我们计算分类系统不包含特征t的时候,就使用情况(2)来代替,就是计算当一个特征t不能变化时,系统的信息量是多少。这个信息量其实也有专门的名称,就叫做“条件熵”,条件嘛,自然就是指“t已经固定“这个条件。
但是问题接踵而至,例如一个特征X,它可能的取值有n多种(x1,x2,……,xn),当计算条件熵而需要把它固定的时候,要把它固定在哪一个值上呢?答案是每一种可能都要固定一下,计算n个值,然后取均值才是条件熵。而取均值也不是简单的加一加然后除以n,而是要用每个值出现的概率来算平均(简单理解,就是一个值出现的可能性比较大,固定在它上面时算出来的信息量占的比重就要多一些)。
因此有这样两个条件熵的表达式:
![clip_image002[6]](http://www.blogjava.net/images/blogjava_net/zhenandaci/WindowsLiveWriter/7fce385fe28b_D158/clip_image002%5B6%5D_thumb.gif)
这是指特征X被固定为值xi时的条件熵,
![clip_image002[8]](http://www.blogjava.net/images/blogjava_net/zhenandaci/WindowsLiveWriter/7fce385fe28b_D158/clip_image002%5B8%5D_thumb.gif)
这是指特征X被固定时的条件熵,注意与上式在意义上的区别。从刚才计算均值的讨论可以看出来,第二个式子与第一个式子的关系就是:

具体到我们文本分类系统中的特征t,t有几个可能的值呢?注意t是指一个固定的特征,比如他就是指关键词“经济”或者“体育”,当我们说特征“经济”可能的取值时,实际上只有两个,“经济”要么出现,要么不出现。一般的,t的取值只有t(代表t出现)和
(代表t不出现),注意系统包含t但t 不出现与系统根本不包含t可是两回事。
因此固定t时系统的条件熵就有了,为了区别t出现时的符号与特征t本身的符号,我们用T代表特征,而用t代表T出现,那么:

与刚才的式子对照一下,含义很清楚对吧,P(t)就是T出现的概率,
就是T不出现的概率。这个式子可以进一步展开,其中的

另一半就可以展开为:

因此特征T给系统带来的信息增益就可以写成系统原本的熵与固定特征T后的条件熵之差:

公式中的东西看上去很多,其实也都很好计算。比如P(Ci),表示类别Ci出现的概率,其实只要用1除以类别总数就得到了(这是说你平等的看待每个类别而忽略它们的大小时这样算,如果考虑了大小就要把大小的影响加进去)。再比如P(t),就是特征T出现的概率,只要用出现过T的文档数除以总文档数就可以了,再比如P(Ci|t)表示出现T的时候,类别Ci出现的概率,只要用出现了T并且属于类别Ci的文档数除以出现了T的文档数就可以了。
从以上讨论中可以看出,信息增益也是考虑了特征出现和不出现两种情况,与开方检验一样,是比较全面的,因而效果不错。但信息增益最大的问题还在于它只能考察特征对整个系统的贡献,而不能具体到某个类别上,这就使得它只适合用来做所谓“全局”的特征选择(指所有的类都使用相同的特征集合),而无法做“本地”的特征选择(每个类别有自己的特征集合,因为有的词,对这个类别很有区分度,对另一个类别则无足轻重)。
看看,导出的过程其实很简单,没有什么神秘的对不对。可有的学术论文里就喜欢把这种本来很直白的东西写得很晦涩,仿佛只有读者看不懂才是作者的真正成功。
咱们是新一代的学者,咱们没有知识不怕被别人看出来,咱们有知识也不怕教给别人。所以咱都把事情说简单点,说明白点,大家好,才是真的好。