• 算法总结8—非负矩阵因式分解


    数学基础:

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

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

    算法要求输入多个样本数据,每个样本数据都是一个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个矩阵(m*r维和r*n维)记为A(权重矩阵),B(特征矩阵)
    3. 计算A*B与输入的m*n的数据矩阵的差异,足够小则停止,否则继续
    4. 按一定规则调整A,B的值后转3.

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

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

    算法如下:

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

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

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

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

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

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

  • 相关阅读:
    【异常】No ManagedConnections available within configured blocking timeout
    【异常】Caused by: java.lang.ClassNotFoundException: org.springframework.dao.DataIntegrityViolationException
    【Redis】:Jedis 使用
    【异常】INFO: TopologyManager: EndpointListener changed ...
    【Java】JDK类 CountDownLatch
    【WEB】一个简单的WEB服务器
    【JAVA】Socket 编程
    【JBOSS】 JBOSS目录结构
    [SE0]简单的搜索引擎原理
    【ORACLE】 表空间信息
  • 原文地址:https://www.cnblogs.com/luosha/p/2571544.html
Copyright © 2020-2023  润新知