mahout三种向量:
在mahout中,向量被实现为三个不同的类,每个类都是针对不同场景优化的:DenseVector、RandomAccessSparseVector和SequentialAccessSparseVector。
1、DenseVector可被视为一个double型数组,其大小为数据中的特征个数。因为不管数组的元素之是不是0,数组中所有元素都被预先分配了空间。我们称之为密集的(dense)。
2、RandomAccessSparseVector被实现为integer型和double型之间的一个HashMap,只有非零元素被分配空间。因此,这类向量被成为稀疏向量。
3、SequentialAccessSparseVector实现为两个并列的数组,一个是integer型另一个是double型。其中只保留了非零元素。与面向随机访问的RandomAccessSparseVector不同,它是为顺序读取而优化的。
对象转为向量:维度数等于特征数。
选择一个对象的特征并把它们映射到数字的过程称为:特征选择
将这些特征编码为向量的过程称为:向量化
在计算相似度时,我们需要抵消向量大小不同而造成的影响,降低大向量的重要性,并提高较小向量的重要性的过程就叫做: 归一化(统一单位和量级)
-n 默认不进行归一化 默认值为0 如果使用曼哈顿距离测度 1范数合适 如果使用欧式距离测度 向量2范数合适。
二、向量选择:
具体选择那种实现依赖于算法。如果算法要对向量的值做许多随机插入和更新,就适合使用像DenseVector和RandomAccessSparseVector这样支持快速随机访问的实现。另一方面,而对于像k-means聚类这样反复计算向量大小的算法,SequentialAccessSparseVector实现的执行速度就会比RandomAccessSparseVector更快。
Mahout utils包中有一个称为VectorBenchmarks的工具类,可以使用该工具寻找某个稀疏水平上执行该运算最快的向量类型
三、如何将对象转化为向量:
在算法中,每个对象都要转化成一个n维向量。其维度数与对象的特征个数相同。
比如,一堆苹果,他们有不同的形状,重量,颜色。其中有一个苹果,它的形状是3(圆),重量是0.1(kg),颜色绿色600(波长)
那么每个苹果可以对应为向量(3,0.1,600)
但是现在维度有一个问题,就是颜色维度的值将主导最终的结果,比如,一个相对较小的10nm的色差会相当于100倍的重量差异。不过我们可以通过不同维度加权解决这个问题。
作为聚类算法的主要应用场景 - 文本分类,对文本信息的建模也是一个常见的问题。在信息检索研究领域已经有很好的建模方式,就是信息检索领域中最常用的向量空间模型 (Vector Space Model, VSM)。因为向量空间模型不是本文的重点,这里给一个简要的介绍,有兴趣的朋友可以查阅参考目录中给出的相关文档。
文本的向量空间模型就是将文本信息建模为一个向量,其中每一个域是文本中出现的一个词的权重。关于权重的计算则有很多中:
Canopy Clustering是一种小而美的聚类方法,其算法流程如下:
(1)设样本集合为S,确定两个阈值t1和t2,且t1>t2。
(2)任取一个样本点p属于S,作为一个Canopy,记为C,从S中移除p。
(3)计算S中所有点到p的距离dist。
(4)若dist
(5)若dist
(6)重复(2)~(5),直至S为空。
t1大canopy少 t1小canopy多 t2大重叠少 t2小重叠多
基于模型的聚类:
基于距离的聚类都不能满足既有重叠又有层次的情况,基于模型的聚类可以解决此问题:
基于概率分布模型的聚类算法(后面简称基于模型的聚类算法)的原理:首先需要定义一个分布模型,简单的例如:圆形,三角形等,复杂的例如正则分布,泊松分布等;然后按照模型对数据进行分类,将不同的对象加入一个模型,模型会增长或者收缩;每一轮过后需要对模型的各个参数进行重新计算,同时估计对象属于这个模型的概率。所以说,基于模型的聚类算法的核心是定义模型,对于一个聚类问题,模型定义的优劣直接影响了聚类的结果,下面给出一个简单的例子,假设我们的问题是将一些二维的点分成三组,在图中用不同的颜色表示,图 A 是采用圆形模型的聚类结果,图 B 是采用三角形模型的聚类结果。可以看出,圆形模型是一个正确的选择,而三角形模型的结果既有遗漏又有误判,是一个错误的选择。
图采用不同模型的聚类结果
ClusterDumper工具可以检测任何聚类算法的输出
改善聚类质量:
去除噪声和使用合适的加权技术,使用合适的聚类测度方法
去除噪声:mahout提供了一个钩子:LUCence Analyzer 允许在向量化的过程中注入任何过滤技术。(提供:大小写转换、去停用词、根据长度删除单词、取单词词干)
2、随机梯度下降SGD (stochastic gradient descent)
梯度下降算法在每次更新回归系数的时候都需要遍历整个数据集(计算整个数据集的回归误差),该方法对小数据集尚可。但当遇到有数十亿样本和成千上万的特征时,就有点力不从心了,它的计算复杂度太高。改进的方法是一次仅用一个样本点(的回归误差)来更新回归系数。这个方法叫随机梯度下降算法。由于可以在新的样本到来的时候对分类器进行增量的更新(假设我们已经在数据库A上训练好一个分类器h了,那新来一个样本x。对非增量学习算法来说,我们需要把x和数据库A混在一起,组成新的数据库B,再重新训练新的分类器。但对增量学习算法,我们只需要用新样本x来更新已有分类器h的参数即可),所以它属于在线学习算法。与在线学习相对应,一次处理整个数据集的叫“批处理”。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29754888/viewspace-1391858/ ,如需转载,请注明出处,否则将追究法律责任。