Chouqin's Blog

A blog for hackers.

毕业论文点滴

已经好久没写博客了,因为寒假一个多月都没看书, 而一回到学校,又要忙着毕业论文的事,所以也无暇顾及这个。 大部分牛人的博客,都是记载着自己正在研究的方面, 在博客中也是向读者传达着一些知识,我们总是可以从其中学到某种东西。 而我,要达到这样的程度要有很长的一段路需要走, 由于技术水平较低,现在的博客记录的仍然还是自己在学习过程中的一些心得和体会, 很大程度上是描述自己的坎坷经历,希望能给某些人一些借鉴,少走一些弯路。

好了,言归正传,这一个月,都在忙着做毕业设计, 包括看论文,写代码,找数据,做实验。一个月的时间, 就完成了这么一件事,效率确实不算高, 主要原因在于对于搞科研还是新手, 很多情况下都是在尝试了各种可能之后才找到方法, 有时一个人的蛮干还不如直接通过其他方式获得出路。 哎,科研就是要耐得住寂寞,不停地调参数,不停地跑数据, 把各种可能性都尝试一遍,之后才有好的结果。

先简单介绍一下我这个论文的要求,论文的题目叫 信息缺失情况下的社区挖掘,其实就是一个聚类算法, 根据节点的某些属性和节点之间的边的关系,把图中的比较接近的节点聚到一起, 形成一个社区。而信息缺失,是指节点中的某些边的关系并不知道, 在这样的情况下进行聚类。采用的办法是首先利用节点之间的属性和边的关系, 通过机器学习方法获取所有节点之间的距离,然后再根据这个距离对节点进行聚类。 下面我来说一下整个的过程。

首先是准备数据。一开始准备爬微博的数据, 所以就去网上搜各种微博的爬虫, 然后终于找到了这个一个简单的分布式新浪微博爬虫, 在这个基础上进行了一点小修改,弄了一个简单的单节点爬虫。 这个爬虫可以抓取用户的微博,用户的个人资料以及用户之间的关注关系。 然后,又使用NLPIR对微博进行分词, 提取出关键字作为用户的属性,同时以用户之间的关注关系作为边,这样就开始实验。 可是,不知道是实验室的网络不稳定还是新浪微博的限制,这个爬虫很难稳定地抓取微博的数据, 最后实在没办法,学长建议我去网上直接找别人爬取到的数据集。 于是,我先后使用了Google+, Facebook, Twitter(这三个数据集都是在Stanford Large Network Dataset Collection上找到的), 和Flixter数据集做实验。其中使用Flixter数据集做出来的结果也还可以,可是师兄说一定要有Ground Truth用于验证, 所以我又只好去找其他的数据集, 最后终于在这找到了可以用于实验的数据集。

然后是实现代码去做实验。这个代码其实两部分,第一部分要利用机器学习去学习一个距离, 第二部分是基于距离进行聚类。为了学习距离,需要求解一个最优化函数, 而这里面涉及的数学的公式好复杂,实现起来也非常困难, 找到了一份和这个论文比较相似的论文的源代码,却发现里面错误好多,有些地方也不知道从哪里开始改。 大概修改了一下就把这个距离拿到第二步去聚类,发现结果非常差, 然后也不知道是第一步的问题还是第二步的问题,但是我就只会改第二步的代码:P。 终于在第二步实在找不出什么错误然后第一步的结果又不好之后,我去问老师, 老师让我使用谱聚类算法来验证距离是不是正确的, 因为谱聚类算法也是基于距离的聚类算法,如果谱聚类算法得不到正确的结果,那就是距离的问题了。 多好的主意啊,我当时怎么就没想到呢,因为我当时还没听说过谱聚类算法。 于是我就拿谱聚类算法去验证,果然是距离没学对,而除了代码没写对之外, 有一个重要的步骤没有做,对Feature做Normalize, 这个步骤对于使用节点的属性来说非常重要,它保证了所有属性的作用是均等的。 而后,我又在这里找到了一些其他的学习距离的算法, 我使用了其中的DCA算法来作为我的第一步,相当靠谱。 通过谱聚类算法验证之后,我发现我的第二步算法就几乎没有什么问题了, 跑出的结果也比较让人满意。

大概就是这么一个比较纠结的过程,总结出一些经验吧:

>>>import this
  1. 写代码还是要多检查,一个bug除了导致几个小时的结果无效,还要浪费更多的时间去找到它。

  2. 在一个步骤保证正确之前,不要急于开展下一步,这样只会增加更多的复杂性。

  3. 沉下心来研究论文,尽量采用和别人一样的方法,得到的结果总是好些,虽然不知道为什么好。

  4. 不要畏惧实验和失败,说不定下一次就是成功的那一次。

  5. 真爱生命,远离科研。

Comments