blog mail me! feed

Archive for October, 2008

灰冬.

早上穿上套头衫, 默默的走入雨中,
细末开始慢慢的浸湿外套上四处的油污,  我终于意识到这是一件黄乎乎的脏衣服了,
哪怕落下的大粒的凝聚的雨露, 噼噼啪啪的把衣服弄得满是斑点.

踏过一个一个水洼, 拂去头发上卷曲的雨水,
看着从夜晚昏黄路灯投射着冷清下到灰白的天空透露着凝滞,
然后明白又是一年灰色的季节了.

图书证还是没法重办, 甚至借来的也被没收掉,
我不安而烦躁的思考了一路掉头准备回去和管理员宣泄我满腔的不满,
最后也只是不停的在她面前牢骚和抱怨, 仍然两手空空.

实在是单调得乏味, 借来CCNA Intro,
打发着这个被我亲手揉碎的晚上,
也许本来可以很简单的美好, 可是, 现在, 一切都没有了.

灰冬里的一个再平凡不过的晚上,
我继续毫无乐趣的坐在灯管下, 百无聊赖.

Stuck in Python.

这两天本来想借<Thinking In Java>的, 结果图书证被我自爆了后一直没有挂失,
今天去挂失, 补办得等一周. 
于是借阅<An Introduction to Support Vector Machines and Other Kernel-based Learning Methods>的计划也就顺延了, 还是慢慢啃论文吧.

把以前压箱底的Mono机器人翻出来重写了下, 
其实也就是封装到了一个类里面, 部分函数重写了下, 支持断线自动登录,
但是我一直不理解的是, 为啥xmpppy这么容易莫名其妙的就掉线,
看着机器人不停的上线总是一件让人心烦的事情, 尤其是NUT那个”呼”的提示音, 让我焦虑不安.

昨天算是把Stage2的代码都重写了, 
另外一直在找threading有关的资料在看, 准备做一点简单的调度工作.
自己对新写的Stage2的测试不是很有信心, 昨天把低级bug排除了后, 还一直没有真正跑一次.

我感觉我尽管能堆Python代码, 但是远谈不上”掌握”, “了解”和”应用”,
甚至很多高级特性我都是一脸茫然, 更不要说对标准库都不甚了解.
不过, 用Python写代码总不是痛苦的事情.

马上就得开始堆Java代码了, 当然也许还有用C语言写的那些细菌基因的玩意儿.
whatever.

剧集.

最近House, CSI:NY, DSM都沉默性歇菜了,
闲得无聊, 开始追 The Big Bang Theory,
另外准备先看看 Bleak House的pilot再决定要不要下完, 反正短小精悍,
15集而已.

说说这几天.

天气真是可爱的让我喜欢, 无论是穿着短袖还是卫衣都感觉很舒服,
裹着很薄的被子或者蜷缩在厚被子里都可以完成一个温暖的夜晚.
所以无论是阳光遍地洒满, 还是雨点和着秋风飘在夜晚昏黄的灯光下, 都不那么所谓了.

心理负担很大, 是的,
不过我不会过多的解释, 因为去剖析自己就好比把让人负担的东西抬起来, 再重重砸到自己脚上.

巴西的咖啡豆挺好, 这让我想起了上次为了那个法压壶一起买的那袋印度产咖啡,
酸得很有”特色”, 当然我不喜欢咖啡泛酸的, 虽然被牛奶和方糖一压, 酸味就很稀薄得难以分辨了,
除了出现在吞咽行为尾端的余味.

写代码的状态很一般,
热情开始变得飘渺, 看来我还没有从该死的五月天的阴影里走出来.

上周末难得一家人一起吃了饭,
每每想到这些场景总让我觉得无比的温暖,
那是一种让人总希望延续和珍惜的不需要考虑割舍和抉择的时刻.

话说, 键盘被磨得好光滑了 .

Stage2的新爬虫

一直以来, Stage2的爬虫都以DSF模式在进行着勤劳的爬行工作,
DSF决定了在处理最大限制深度的时候显得稍微笨拙.

同时因为一些最早遗留的问题,
在处理FTP文件和目录变更(尤其是目录和文件移动)时, 显得有些繁琐, 所以一直没有着手处理.

今天决定用BSF的模型来重写爬虫的行为,
同时优化本地cache的模式, 不再像原始版本那样从数据库重建cache, 而是直接序列化输出到本地的cache文件.
而cache也将完全的基于文件结构来建立而不是原来的平面目录结构.

另外, 准备加入多线程的支持以保证在爬行的时候, 多线程的工作最大程度的提高效率, 利用网络带宽.

就是这样, 不想写了, 不想写了!~

协同过滤学习笔记: 稀疏?

上一篇里说到, 遇到稀疏的数据集的缺失数据的时候, 如何补充值的问题,
我采用的是补充一个评分均值以期减少这个引入的评分所产生的影响.

当然稀疏数据集同样面对的问题还有”cold start”, 系统越大, 这种效应越明显,
即一个新加入的项目不可避免的遇到评分人数相对的极低的现象,
按照上一篇我第一种考虑的方法, 这些新项目都会被不可避免的排除掉了.

当然这里又可以引出些讨论:
比如是不是根据评分的timestamp引入另外一个因子, 对近一段时间内的timestamp有更高的权重以期让那些低评分数的新项目出现呢?
不过我不想把这个系统改造得过于繁琐, 但是不可避免的, 如何去”揣测”和填充空缺的数据集是一个大问题.

Slope One算法可以简单的根据已有的用户的打分规则, 来推测当前用户”应该”或者”可能”的打分.
不过我把Slope One应用到我的”极其稀疏”的数据集中的后果就是, 使得结果更向那些孤立值倾斜.
我试图设立一些阈值来限制这些孤立”噪声”的出现, 但是效果很差.

我终于明白其实我这个根本不是什么稀疏不稀疏的问题 ,
是数据太少了, 还不足以通过协同过滤得到有效的结果.

我这几天也一直在考虑音乐站有关量化对于曲目, 专辑, 歌手的评分的问题,
毕竟一个量化的数值, 对于协同过滤以及其他任何算法来说, 都是一个必须的数字.
引入曲目后, 有些东西变得更微妙了,
比如A用户可能喜欢X专辑中的所有歌, 除了最后两首,
但是对喜欢的歌标记”喜欢”是非常烦琐和机械化的操作, “既然我默认喜欢, 为什么就不简单的放下去就行了呢?”

播放行为在最开始的时候, 应该是随机的, 除非用户从某个tag开始收听节目,
当然这要涉及到具体这个音乐站怎么被设计来生成播放清单了.
这样无数的行为都可能对评分产生微妙的影响,
让我的微小的脑子想得十分生涩的痛苦. 

所以, 也许所谓的”烦琐”的标注”喜欢”的动作,
是必须的, 为了你听到更好的音乐推荐, 动动鼠标吧.

协同过滤的学习笔记: 关于稀疏数据集.

最近在平面格子上做了一个测试,
豆瓣上选取了标签为indie, pop, rock的各前100张专辑组成数据集,
交给用户打分, 在这里先谢谢了帮我完成这个无趣的测试的所有人.

之所以做这个是因为MovieLens的数据集里的电影自己几乎都没看过,
也就无从得知”相关度”的问题.

不过这300张专辑的样本同样有个问题是, 很多独立音乐, 和较老的摇滚音乐,
很多人是没有听过的, 于是在进行协同过滤的时候, 我把这些”没听过”的记录都通通删除掉, 
结果问题就出来了, 项目间的相关性变得很奇怪, 甚至出现了很多1.0, 而真正”应该”相关的数据, 相关度不理想.

的确, 如果我们把每个项目来自不同用户的评分看做一个向量的话,
对于项目A我们有评分a1, a2, a3, …, am
项目B我们有评分b1, b2, b3, …, bn
理想的状况是, 这个数据集是密集的, 因而m和n应该非常接近甚至相等.

然而由于前面提到的问题, 大量的”没听过”的记录使得数据集变得异常稀疏,
假设一张冷门专辑X, 恰好有一个用户打分,
而这位用户也恰好给另一张专辑Y打了同样的分,
因此尽管 X, Y向量的维度有着巨大的差异,
但不影响我们通过余弦求出的两者夹角余弦值为1.

而正是这样类似的大量的稀疏数据所产生的随机效应和孤立因子,
使得相关性中出现了大量的这种效应引入的具有极高随机性的值,
显然, 在最开始设计算法的时候, 忽略了这个问题.

我着手改变这种因为稀疏数据集从而引入的相关性准确度大幅下降的问题,
我自己想到的两种方法是:

  1.  将每两个项目同时评分的人数, 标准化在区间[0, 1]之内 (利用所有项目对的评分人数算出的μ和σ进行), 将这个作为一个因子. 基于这个因子进行过滤也好, 或者直接把这个因子乘上相关性因子得到修正值也行.
  2. 对缺失的数据, 人为的填充数据.
在考虑第二种方法的时候, 我看到一个比较有趣的算法,
即, 通过用户已有的评分值, 来进行缺失项的评分预测.
当然我相信这个预测是非常粗糙的, 尽管我还没有看过这个算法的具体实现,
但是我一直在考虑这样的预测是否陷入了一种循环中. 

另外一种填充法相对简单, 取一个相对的中值或者和用户的评分均值最接近的因子,
这样对最后的相关性的影响是最小的, 也避免了上面的算法的复杂度和可能的预测偏差. 

进行如上的填充工作后, 最后的相关性结果就理想多了.
的确, 对于这个信息量膨胀的时代, 稀疏数据集可能远比密集数据集出现得普遍,
如何更好的消除数据稀疏性, 是一个很好的问题.

越写越乱, 索性不写了.

不安.

买了本<Collective Intelligence>
没有想到的是, 书里所有的算法都不再是生硬的pseudo-code, 而是Python,
不过, Python实现的算法很轻巧, 很优雅, 不用过多的去关注数据结构.

这让我想起了, 有一天下了一堆有关协同过滤的papers, 后来准备自己动手实践下,
当时俺不会Python, 想到用C解决一堆集合的求交问题, 我就头大.
当时正好在MATLAB里做了个很简单的, 基因启动子相关的处理实验,
顺手就接着用MATLAB做了, 哈哈哈哈哈.

基于MovieLens的数据库,
把所有的运算都一股脑塞到矩阵里, 最后嘎吱嘎吱的等着出结果,
结果… 结果… 好像不大理想.

于是昨天索性又用Python重写了一遍,
继续用修正余弦相关性,
基于之前放出去的一个音乐口味的测试,
结果… 结果… 好像还不赖.

好像阶段性的大概无非接下来就两条路,
要么找更多的测试者, 看看再更大的样本集里, 能否有更稳定更精确的结果,
要么直接开始做想做的东西, 通过实践检验效果.

可我只是觉得头痛, 烦躁和不安,
好像整个世界都不属于我了.

刷机了.

用了2年的Windows Mobile 5, 昨天突然心血来潮, 准备刷到6.1;
胡乱的找了点文章来看, 发现刷机的步骤异常简单, 而且实际上, 得感谢max同学,
上次刷机的时候, 就把IPL, SPL, 解锁, SuperCID通通搞定了.

唯一遇到的问题是Vista下的驱动问题,
该死的ActiveSync没法装在vista下, 装个Mobile Center一进三色屏就没法连接上手机,
每每开刷机软件还没开刷软件就挂了.

最后找来Awaw的XP开工, 5分钟就刷成6.1了,
然后匆忙拿着还没有输入法的手机跑去上课,
随便折腾了半天的系统.

6.1果然比5.0更好用了,
于是我惬意的幻想自己非常的惬意.
感觉这老爷机重获新生了, 当然我知道, 这种新鲜度不会维持太久了,
终究就是工具而已, 嗯, 工具.

陷.

开始为了栋力博客和明基五月天的合作项目加班加点的赶工,
糊弄了一个紫色的HTML样式, 然后再把它非常简易的封装成一个wordpress的主题.

我都不愿说这是一个”主题”, 因为它实在是简陋而残缺,
这个”主题”基本只被设计用于显示页面, 而每个页面其实都并不依赖在编辑器中输入的内容, 而都是一个个模板,
被应用到页面上的模板实际上只是一个利用着wordpress框架和接口工作的一堆自定义代码.

到这里, 整个site已经基本脱离博客的范畴了,
不过wordpress强大的API让人可以基于它快速的开发, 这就是最有趣的地方了.

准备稍微修改下index.php和single.php使得它同时可以被用作一个基本的官方博客,
hack的乐趣真是无穷.
虽然赶工很累, 不过总能找到有趣的事情来调剂.

这就是生活.