数学基础:

线性代数的矩阵乘法运算。

   非负矩阵分解是一种特征提取的算法,它尝试从数据集中寻找新的数据行,将这些新找到的数据行加以组合,就可以重新构造出数据集。

   算法要求输入多个样本数据,每个样本数据都是一个m维数值向量,首先把我们的数据集用矩阵的形式写出来,每一列是一个数据,而每一行是这些数据对应维度的数值。于是我们就有了一个大小为m*n的输入矩阵。而算法的目标就是将这个矩阵分解为另外两个非负矩阵的积。

$$M_{m,n}=A_{m,r}B_{r,n}$$

   我们将分解矩阵后新得出的一个维度称为特征,那么在前一个m*r的矩阵中,第i行第j列的值就代表属性i对第j种特征的贡献值,而后一个矩阵的第i行第j列则代表第i种特征对第j个样本的贡献值。这样我们就找出了输入样本的r种特征。

   r的大小应该依照需要进行选择,比如如果是希望找到某些共性特征,则就要选择较小的r。当我们确定了一个较为合适的r值后,就要想办法确定后面两个矩阵具体的值了。

   书中给出的算法大致如下:

  1. 定义一个函数计算用来两个矩阵的差异程度(每个对应元素相减后平方的和)
  2. 随机生成2个矩阵(mr维和rn维)记为A(权重矩阵),B(特征矩阵)
  3. 计算AB与输入的mn的数据矩阵的差异,足够小则停止,否则继续
  4. 按一定规则调整A,B的值后转3.

对于调整的方法,可以用模拟退火(下一篇文章中会提到)等多种算法,书里使用的是乘法更新法则,该法则我没有认真去看….感兴趣的可以去看论文….英文的…

http://hebb.mit.edu/people/seung/papers/nmfconverge.pdf.

算法如下:

hn 转置后的权重矩阵和数据矩阵相乘的结果

hd 转置后的权重矩阵和原权重矩阵相乘再乘特征矩阵的结果

wn数据矩阵与转置后的特征矩阵相乘的结果

wd权重矩阵与特征矩阵相乘,再与转置后的特诊矩阵相乘得到的矩阵

为了更新特征矩阵和权重矩阵,我们先把上面所有矩阵变为数组.然后把特征矩阵中每一个值与hn中对应值相乘,并除以hd中对应的值.类似的,我们再将权重矩阵中每一个值与wn中的对应值相乘,并除以wd中对应的值.

最近的算法都很好理解的样子…不过写起来还是挺麻烦的….还有最后一篇优化了,内容挺多,包括模拟退火和遗传算法….恩