blog mail me! feed

Archive for February, 2009

动态加载模块.

做个笔记扔这儿吧:

>>> sys = __import__('sys')
>>> os = __import__('os')
>>> re = __import__('re')
>>> unittest = __import__('unittest')
>>> sys
>>> <module 'sys' (built-in)>
>>> os
>>> <module 'os' from '/usr/local/lib/python2.2/os.pyc'>

实时的管道日志处理

众所周知, 某b是懒人, 当然这个前提与本文无关.
某b搭建的nba视频站虽然和NBA官方的版权声明冲突不小, 不过每天的PV还是能有大概17k,
不过这个统计的方法很可怕, php里先建立一个数组, 把每条访问数据push进去,
序列化, 扔到memcached里. 再一个访问来了, 反序列化, 再push, 再序列化…

后来干脆就准备写个实时的日志记录和处理的python程序, 不然序列化都会吃掉大量的脚本运行时间.
先很白痴的准备用FastCGI来做, 做一个webservice, php请求一次, 我就完成一次日志.
后来还是打webserver的主意, 不过FastCGI行不通, 就转而研究管道了.

mkfifo创建named pipeline后, 让nginx把日志输出到管道, 就可以通过python阻塞读取日志了,
不过这里python脚本要先阻塞读取, 再kill -HUP掉nginx, 让配置重新生效.

此后的处理就可以按照需要的配置来进行了,
处理后的日志数据存放在sqlite3数据库里, 方便进行查询和索引.
每条进来的日志先写在内存的数据库里, 达到一定数目时再用事务写到硬盘的实体表里.

昨天晚上大概写了个DEMO出来, 在本地调试管道,
发现一切都正常, 唯有打开事务后插入要出错,
后来Google了下, 发现也有人提到这个.
按照方法修正了, 就ok了.

继续完善了准备拿到209生产环境实践下, 然后扔到svn repoistory上去.

非典型脑残非主流.

今日选课, 发现IE7, Firefox, 竟然都点不开js写的菜单,
后来发现一篇通知, 上书:

各位同学:

       数字化部教务系统近期升级后,出现与ie浏览器7.0版本不兼容的问题,导致使用ie 7.0的同学无法在网上进行退补选(网上选课下拉菜单不能显示),数字化部正在协调处理。请不能进行退补选的同学换用ie浏览器6.0版本的机器进行退补选操作,也可到教务处指定机房退补选(机房全部安装ie6.0)。

       特此通知! 

我操, 在这个浏览器大战日益升级, 淘汰IE6的浪潮越来越汹涌的时候,
我校教务处依然选择逆潮流而行, 切身实践脑残非主流精神… 

尤其这句话, 请不能进行退补选的同学换用ie浏览器6.0版本的机器进行退补选操作, 有十足的民工风范.
这个做前台的程序员估计就是什么五月花, 指南针培养出来的高级技工人才.

杂念.

这周都无一例外的早上8点爬起来了, 逛一圈网站,
然后开始背单词. 早起看到的城市还是很漂亮的.

被php的引用类型折腾得够呛,
从某种意义上来说, 引用很像C语言的指针, 但是很可怕的是,
如果你把一个引用对象当作指针来用, 只会是灾难.

首先来说, php把array也用实例而不是引用传递,
且用foreach枚举元素时, 每个元素也会被重新实例化.
因此如果要对一个数组中的元素建立引用, 只能通过 array[index],
来建立对于对应元素的引用访问, 否则引用只会指向被你实例化后的元素. 

把引用的对象push到了一个数组里, 用unique_id作的associated_id,
结果这个数组的元素也只能通过下标访问, 一旦通过 var _element = ptr_list[index]; 
声明了另外一个_element对象, 引用关系也就莫名其妙的消失了.

我承认也许是我看manual太草率, 以至于在这里还是搞不明白引用对象使用中各个细节和处理的关系,
不过大概就先记在这里, 以后要用到就明白了.

—————— 

发现libsvm是可以直接嵌入到程序中使用的, 而svm-train/predict/scale.c 就是相当好的examples,
不过呢其实把libsvm直接编译到自己的程序里的唯一好处是省去了数据输出和再读入的时间,
对于大量的参数判别还是很有用的(比如某BT的双密码子64*64参数).

发现libsvm在进行迭代的时候, 迭代次数越小也就说明数据是越具有特征性的,
或者说更容易建立用于discrimination的hyperplane.
通过数据的svm-scale后, iterations由4k+下降到了~400, 准确率由78%上升到99.7%可以看出,
迭代数可以一定程度反映所选参数的优劣.

当然我担心64*64参数下, 有的参数分量会不会过小而导致数据直接为0,
由此scale的时候产生巨大的误差.
试试就知道了.

数据缩放很重要啊.

说来惭愧, 上次都看到很多关于libsvm的文章提到svm-train前要先用svm-scale缩放数据了,
居然都没有一点提示, 还是想当然的认为密码子的准确率就是很低, 不予采用…

昨天晚上联想到用熵算氨基酸时, 缩放后准确率迅速提升,
才突然恍然大悟, 重新把密码子的参数缩放到[-1, +1], 迭代数立马缩减到原来的1/10,
准确率也就奔着99.7%去了…

过小的数据区间和数据间差异性, 果然是不利于机器学习滴.

真是折腾.

我发现太geeky了也是坏事, 自从我觉得顺序复习单词表效果不好后,
我就自己写了个乱序复习单词的python小程序.

第二天我就觉得不满意, 就用cPickle加上了一个退出时自动把当前复习状态保存到内存里的功能.
当天下午嫌dump出来的文件过大, 又顺便把其bz2化了…

第三天加上了询问每个单词记忆状况的功能, 遗忘的单词会自动重复复习.

第四天觉得无声太无趣了, 就去找了找python的TTS解决方案,
后来找到一个非TTS的解决方案, pyspeech.
用起来倒是很简单, 就是用的windows讲述人的接口, 不过发音太扯淡了,
抓着个单词就乱读, 寒.

后来翻出来买的红宝送的MP3, 倒是读得字正腔圆,
可惜一个list一个MP3, 没法达到乱序复习同步播放的要求.
不过这MP3倒是很体贴的带了lrc文件,
我去下了个MP3切割工具, 发现可以导入cue格式, 就自己又写了个lrc2cue.py把lrc的信息抓出来生成cue,
终于是完成了每个单词独立声音文件的切割…

再写了个脚本完成切割后各个文件的重命名, 和使用lame把MP3转为WAV,
就可以用winsound模块把这个声音放出来了.

程序跑起来的时候, 听着单词发音, 我突然又觉得很无趣了.
damn.

无聊数据图一张.

 

酵母已标注蛋白质中各氨基酸的比例 点击看大图

酵母已标注蛋白质中各氨基酸的比例 点击看大图

最近在做的酵母的基因预测, 有一个参数是各种氨基酸在蛋白质中的比例,
毕竟数字不直观, 就自己用Flash写了个程序做了个图,
这是酵母的所有已经标注的共5600+个ORF(不包含线粒体染色体)所表达的蛋白质对应的平均的氨基酸比例.

 

红色是正样本, 即真实的的ORF;
蓝色的是负样本, 通过蒙特卡洛方法进行随机打乱后的随机序列, 用于进行训练;

图片还是很好看的,
哈哈哈.

秩序与混乱.

昨天又把闲置了两周的基因预测程序拿出来, 把最后一个参数 — 氨基酸实现了,
跑了一个 6-fold Cross Validation发现准确率竟然能到99%以上, 很是惊讶,
当然这里不排除Shuffle函数在随机打乱序列产生负样本时, 引入的少量终止密码子干扰项.

事实上, 氨基酸参数就是一个单纯的频率, 即20种氨基酸在目标蛋白质中的所占的比例,
突然想到以前导师提到过的, 的相关概念, 发现这个参数模型可以和熵结合得很紧密.

把每种氨基酸出现的概率看做P(xi),由公式,
Entropy
最后可以得到当前样本的熵, 也就是信息量的度量, 即不确定性.

我先对正负样本各自计算其熵(信息量), 发现相差无几,
后来就稍微改了下形式, 做了一个所谓的”相对熵”.
我计算出所有的正样本中, 各个氨基酸出现的平均概率值p’(xi),
最后计算时采用 -∑ p(xi)log[p'(xi)], p(xi)代表当前样本的真实值.

如果自然界中的蛋白质组成是有序的, 那么负样本打乱或者随机的序列对应的随机的氨基酸分布,
必然会使得整个模型趋于混乱的方向发展, 从而不确定性增大, 熵增加.
实际程序跑出来发现, 正样本的H(x)大概在2.9, 而负样本在3.4左右,
比较好的体现了不确定性的度量.

当然, 另外的一篇给予启发的很好的文章来自相当经典的”数学之美”系列,
具体的讲信息的度量这篇文章在: 数学之美系列 4 — 怎样度量信息?

脚本.

把那个处理教务处验证码的脚本改成了GM脚本,
然后发现作用不大, 因为要让Firefox可以用使用这个无比破烂的教务系统,
还得写一堆乱七八糟的脚本来修正那帮破民工做的这个破系统.

顺便写了一个计算GPA的小js,
必须用在我校的山寨教务系统里.
先在Firefox, Chrome下测试都通过了, IE7出现各种诡异的错误,
最后发现IE7必须把js的编码改成gb2312才行,
异质.

好吧, 我的GPA,
在去掉了该死的中国近代史和工程制图后, 勉强能到2.91.

-____-#

利用canvas处理验证码.

最近canvas很火, 一部分来源于这个: Megaupload auto-fill captcha.

觉得很有趣于是自己也做了一个去hack教务处的弱智验证码的js, 点击这里.

canvas本身还是很简单的,
将图像的BITMAP数据通过Context.getImageData读出到一个数组就可以处理了;
标准的32位数据, R G B ALPHA.

本来想试试用直方图来做, 不过发现很多数字做出来都是相同的,
图省事, 就直接把以前在C#里面的写的, 很弱智的关键点的判断的那个算法拿过来直接用了.

后来发现除了不支持canvas的IE外, Chrome和Safari也是不支持这个方法的,

var ctx = canvas.getContext("2d");
for(prop in ctx){ ... }

用上面的代码debug了下, 发现Webkit没有提供getImageData / putImageData 函数,
所以没法处理图像的raw数据了.
囧, 改天没事改成GreaseMonkey脚本.

Next entries »