机器学习科研助手总结

机器学习科研助手总结

  • kmeans
  • Product Quantization(pq)
  • Cartesian Kmeans(ck-means)
  • Recommender System

在大二下学期的时候,我报名参加了学校MIMA(Machine Intelligence & Media Analysis)实验室组织的科研助手,旨在跟随老师所在实验室的一个项目,但说实话就是在实验室里打杂,帮助学长们实现部分代码,出bug后寻求解决方法,尽管最终并没有发出什么论文或者做出什么成型的项目(说实话,本来也没打算有什么成果,只是想多学多做提高科研能力),不过带我们的学长还是很负责任的(在此感谢学长),在这期间学到了很多书本上学不到的东西,对科研也有了一定的了解,感觉到科研离我们并不是那么遥远,在这里把一些心得和学到的一些知识记录下来。


kmeans

相信对机器学习有所接触的人都会听说或者用过kmeans聚类算法,下面引用百度百科的kmeans词条对其进行简单的解释:

k-means 算法首先接受参数 k;然后将事先输入的n个数据对象划分为k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。  
K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一。K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。
通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。  
假设要把样本集分为c个类别,算法描述如下:  
(1)适当选择c个类的初始中心;  
(2)在第k次迭代中,对任意一个样本,求其到c个中心的距离,将该样本归到距离最短的中心所在的类;  
(3)利用均值等方法更新该类的中心值;  
(4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。  
该算法的最大优势在于简洁和快速。算法的关键在于初始中心的选择和距离公式。  

通过对kmeans的应用,再加上平时对《模式分类》一书的简单理解,使我对机器学习产生了初步的兴趣。


Product Quantization

相关论文网址:
http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=5432202&tag=1

基本思想:

这篇paper介绍了一种基于product quantization(简称PQ)的最近邻搜索方法,主要想法是将当前的样本空间分解为低维的笛卡儿积子空间,并对每一个子空间分别进行量化(quantization,将连续的取值离散化为有限多个取值的过程),其中原空间中的一个向量是由子空间量化后的下标索引组成的一个简单编码表示的,两个向量间的欧式距离可以通过他们量化后对应的编码来获得。然而,有一种非对称版本能够提高精度,因为它计算的是一个向量和一个编码之间的距离。

举例:

For example,我们测试时使用的是siftsmall数据集,若当前每个空间向量均为64维,将其分为8个子空间,每个子空间有8维,可找出256(2^8)个中心点
(管理下标0~255便于编码),在每个子空间中通过kmeans方法找到其256个中心点(向量)的最近邻即进行编码(表示第几个中心点),之后通过保存的编码即索引
找到将每个子空间相应的中心点向量拼接之后的向量,再通过非对称方法计算测试集向量和编码对应的向量之间的欧式距离即可。

Cartesian Kmeans

相关论文网址:
http://www.cs.toronto.edu/~norouzi/
相关代码网址:
https://github.com/norouzi/ckmeans

基本思想:

ck-means算法的提出主要原因是kmeans算法在k很大的时候,迭代算法计算量大,存储各个中心需要的空间大,但是如果每个中心由一个小的子中心集合线性合成的话,空间利用率很高。因此,ck-means算法应运而生,在我认为,如同PQ一样,ck-means也应属于一种量化方法,它首先对原空间进行分割,再对每个子空间运行kmeans求出k个中心点,以原空间的向量在各子空间中对应的中心点拼接之后的向量代替原向量。其中又分为两个版本,对称版本是将原空间向量找到其对应的中心点,计算中心点之间的距离来代替原先计算向量之间的距离;非对称版本是将原空间向量找到其对应的中心点,计算原空间向量和中心点之间的距离,显然非对称版本的精度更高,但计算量也较大。给出的代码中还是用了OpenMP,明显是使用并行方法来进行了优化,OpenMP的使用在前面有所讲述,这里不再赘述。

举例:

For example,我们测试时用的是sift数据集,共1000000个样本,每个样本128维,我们分为8个子空间,每个子空间向量为16维,每个子空间中找出256个子样本中心点,这样在计算欧式距离时,我们只需计算向量与样本中心点的距离即可,假设原先需要计算1000000*1000000次欧式距离(每个向量之间均计算一次),现在只需找到向量对应的中心点(共256*8个中心点),对称版本只需计算256*256*8*8次欧式距离,非对称版本也只需计算1000000*256*8次欧式距离,比起kmeans来看计算次数要少得多。

代码分析:

变量说明:

base -- 用于训练模型
query -- 测试集
trdata -- 训练集
model -- 训练出的模型,如8部分256中心点,则有8个struct,每个struct包含256个中心点,每个中心点16维。
cbase -- 存储中心点下标索引,如8部分256中心点,则cbase是8*1000000的矩阵,代表每个原向量对应的每个子空间的中心点索引。

应用步骤:

现在,如果我们要查找原向量对应的中心点,则查找cbase,找到该向量在每个子空间中对应的中心点索引即编码,再到model中找到对应子空间中的索引下的中心点子向量,将8部分子向量按子空间顺序拼接起来之后得到对应中心点向量,使用此中心点向量代替原向量进行计算。

ck-means总结:

在这几个机器学习方法中,投入精力较多的就是ck-means,感觉这个方法用的十分巧妙与灵活,但是有时又感觉机器学习好多命名都是故弄玄虚,比如梯度,不就是咱们平常说的导数嘛,回归,不就是咱们说的拟合嘛,再拿本例来说,编码,不就是使用下表索引进行操作嘛,所以,有时这些令我们感觉高大上的东西就在我们身边,只不过是换了一个名字,就让我们产生了一种仰视而不可攀的心理。(个人见解而已)


Recommender System

相关论文网址:
Matrix Factorization:
http://www2.research.att.com/~volinsky/papers/ieeecomputer.pdfhttp://acsweb.ucsd.edu/~dklim/mf_presentation.pdf
相关代码网址:
http://www.quuxlabs.com/blog/2010/09/matrix-factorization-a-simple-tutorial-and-implementation-in-python/
Recommender System,中文翻译过来就是推荐系统。推荐系统是通过分析用户属性、访问日志、反馈信息等对用户可能感兴趣的项进行预测。
主要使用的是协同过滤推荐技术,采用最近邻技术,利用用户的历史喜好信息计算用户之间的距离,然后利用目标用户的最近邻居用户对商品评价的加权评价值来预测目标用户对特定商品的喜好程度,系统从而根据这一喜好程度来对目标用户进行推荐。协同过滤最大优点是对推荐对象没有特殊的要求,能处理非结构化的复杂对象,如音乐、电影。
在此过程中,我的主要工作是将ck-means应用到推荐系统中,比较使用前后的误差和运行时间之后看是否能够在性能方面有所提升。
有关推荐系统方面的知识,由于还没有花费太多精力在这方面,在这里就不再多说了,不过作为当今电子商务盛行的时代,推荐系统的应用已经十分广泛,因此这方面的研究很有前景的,笔者也会在今后多多在这方面下一些功夫,争取能够有所收获。


科研助手经历总结:

  • 在经历了一年左右的科研助手的生活之后,总体感觉还是不错的,首先,参加科研助手应该有一个良好的心态,不能太过物质,科研需要的是一颗能够安静下来悉心钻研的心。
  • 在接触机器学习的这段时间里,自己越来越感觉到自己的能力之有限,ML对数学的要求有时要比对计算机编程的要求还要强,因此想要在机器学习这方面有所成就,就必须数学和编程两手抓,当然编程主要使用Matlab和C语言了。
  • 刚开始时感觉自己对论文实在是不太感冒,而且全英文实在是有些难度,不过在读完几篇之后,习惯了这种方式也就不再觉得那么遥不可及了,所以说科研是个循序渐进的过程,要厚积而薄发,希望我能以这种心态继续走在科研的大道上。

注:

以上纯属个人见解,主要讲了一下自己科研助手的一些经历和收获,如有疑问或错误可在评论区提出,笔者会尽快回答或修改。

你可能感兴趣的:(机器学习科研助手总结)