数学基础:
线性代数的矩阵乘法运算。
非负矩阵分解是一种特征提取的算法,它尝试从数据集中寻找新的数据行,将这些新找到的数据行加以组合,就可以重新构造出数据集。
算法要求输入多个样本数据,每个样本数据都是一个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值后,就要想办法确定后面两个矩阵具体的值了。
书中给出的算法大致如下:
- 定义一个函数计算用来两个矩阵的差异程度(每个对应元素相减后平方的和)
- 随机生成2个矩阵(m*r维和r*n维)记为A(权重矩阵),B(特征矩阵)
- 计算A*B与输入的m*n的数据矩阵的差异,足够小则停止,否则继续
- 按一定规则调整A,B的值后转3.
对于调整的方法,可以用模拟退火(下一篇文章中会提到)等多种算法,书里使用的是乘法更新法则,该法则我没有认真去看….感兴趣的可以去看论文….英文的…
http://hebb.mit.edu/people/seung/papers/nmfconverge.pdf.
算法如下:
hn 转置后的权重矩阵和数据矩阵相乘的结果
hd 转置后的权重矩阵和原权重矩阵相乘再乘特征矩阵的结果
wn数据矩阵与转置后的特征矩阵相乘的结果
wd权重矩阵与特征矩阵相乘,再与转置后的特诊矩阵相乘得到的矩阵
为了更新特征矩阵和权重矩阵,我们先把上面所有矩阵变为数组.然后把特征矩阵中每一个值与hn中对应值相乘,并除以hd中对应的值.类似的,我们再将权重矩阵中每一个值与wn中的对应值相乘,并除以wd中对应的值.
最近的算法都很好理解的样子…不过写起来还是挺麻烦的….还有最后一篇优化了,内容挺多,包括模拟退火和遗传算法….恩