已经好久没写博客了,因为寒假一个多月都没看书, 而一回到学校,又要忙着毕业论文的事,所以也无暇顾及这个。 大部分牛人的博客,都是记载着自己正在研究的方面, 在博客中也是向读者传达着一些知识,我们总是可以从其中学到某种东西。 而我,要达到这样的程度要有很长的一段路需要走, 由于技术水平较低,现在的博客记录的仍然还是自己在学习过程中的一些心得和体会, 很大程度上是描述自己的坎坷经历,希望能给某些人一些借鉴,少走一些弯路。
好了,言归正传,这一个月,都在忙着做毕业设计, 包括看论文,写代码,找数据,做实验。一个月的时间, 就完成了这么一件事,效率确实不算高, 主要原因在于对于搞科研还是新手, 很多情况下都是在尝试了各种可能之后才找到方法, 有时一个人的蛮干还不如直接通过其他方式获得出路。 哎,科研就是要耐得住寂寞,不停地调参数,不停地跑数据, 把各种可能性都尝试一遍,之后才有好的结果。
先简单介绍一下我这个论文的要求,论文的题目叫
信息缺失情况下的社区挖掘
,其实就是一个聚类算法,
根据节点的某些属性和节点之间的边的关系,把图中的比较接近的节点聚到一起,
形成一个社区。而信息缺失,是指节点中的某些边的关系并不知道,
在这样的情况下进行聚类。采用的办法是首先利用节点之间的属性和边的关系,
通过机器学习方法获取所有节点之间的距离,然后再根据这个距离对节点进行聚类。
下面我来说一下整个的过程。
首先是准备数据。一开始准备爬微博的数据, 所以就去网上搜各种微博的爬虫, 然后终于找到了这个一个简单的分布式新浪微博爬虫, 在这个基础上进行了一点小修改,弄了一个简单的单节点爬虫。 这个爬虫可以抓取用户的微博,用户的个人资料以及用户之间的关注关系。 然后,又使用NLPIR对微博进行分词, 提取出关键字作为用户的属性,同时以用户之间的关注关系作为边,这样就开始实验。 可是,不知道是实验室的网络不稳定还是新浪微博的限制,这个爬虫很难稳定地抓取微博的数据, 最后实在没办法,学长建议我去网上直接找别人爬取到的数据集。 于是,我先后使用了Google+, Facebook, Twitter(这三个数据集都是在Stanford Large Network Dataset Collection上找到的), 和Flixter数据集做实验。其中使用Flixter数据集做出来的结果也还可以,可是师兄说一定要有Ground Truth用于验证, 所以我又只好去找其他的数据集, 最后终于在这找到了可以用于实验的数据集。
然后是实现代码去做实验。这个代码其实两部分,第一部分要利用机器学习去学习一个距离, 第二部分是基于距离进行聚类。为了学习距离,需要求解一个最优化函数, 而这里面涉及的数学的公式好复杂,实现起来也非常困难, 找到了一份和这个论文比较相似的论文的源代码,却发现里面错误好多,有些地方也不知道从哪里开始改。 大概修改了一下就把这个距离拿到第二步去聚类,发现结果非常差, 然后也不知道是第一步的问题还是第二步的问题,但是我就只会改第二步的代码:P。 终于在第二步实在找不出什么错误然后第一步的结果又不好之后,我去问老师, 老师让我使用谱聚类算法来验证距离是不是正确的, 因为谱聚类算法也是基于距离的聚类算法,如果谱聚类算法得不到正确的结果,那就是距离的问题了。 多好的主意啊,我当时怎么就没想到呢,因为我当时还没听说过谱聚类算法。 于是我就拿谱聚类算法去验证,果然是距离没学对,而除了代码没写对之外, 有一个重要的步骤没有做,对Feature做Normalize, 这个步骤对于使用节点的属性来说非常重要,它保证了所有属性的作用是均等的。 而后,我又在这里找到了一些其他的学习距离的算法, 我使用了其中的DCA算法来作为我的第一步,相当靠谱。 通过谱聚类算法验证之后,我发现我的第二步算法就几乎没有什么问题了, 跑出的结果也比较让人满意。
大概就是这么一个比较纠结的过程,总结出一些经验吧:
>>>import this
-
写代码还是要多检查,一个bug除了导致几个小时的结果无效,还要浪费更多的时间去找到它。
-
在一个步骤保证正确之前,不要急于开展下一步,这样只会增加更多的复杂性。
-
沉下心来研究论文,尽量采用和别人一样的方法,得到的结果总是好些,虽然不知道为什么好。
-
不要畏惧实验和失败,说不定下一次就是成功的那一次。
-
真爱生命,远离科研。