中矩阵怎么编写_简单的非负矩阵分解(NMF)

目录

  • Intuition
  • 算法流程
  • 代码编写
  • Reference

Intuition

这个模型是我见过最简单的无监督模型,你听得没错,比Kmeans还简单。但是我为什么还要写这个模型呢?因为这是考试范围里面嘛。。。

回到今天的主题哈,今天我们要解决的问题是,把一个非负矩阵V分解成两个非负矩阵W和H:

为了给出求解的方案,我们首先需要把目标函数写出来

方法一

因为我们的目标函数是二次型的,所以我们求导然后让导数为0,通过迭代的方法优化我们的参数:

方法二

在这篇论文中[2]提出了一种更加有效的优化方法:

没有了,就是这么简单了

算法流程

  • 初始化W和H
  • 使用方法一或者方法二迭代直到收敛

代码编写

相应的代码在:

https://github.com/JyiHUO/algorithm-from-scratch/tree/master/NMF​github.com
import numpy as np
from skimage import io


class NMF():
    def __init__(self, rank, alpha=0.01, epoch = 20):
        self.alpha = alpha
        self.epoch = epoch
        self.rank = rank
        self.W = None
        self.H = None

    def train(self, X):
        # init
        row, col = X.shape
        v_max, v_min = np.max(X), np.min(X)
        W = np.random.rand(row, self.rank) * (v_max - v_min) + v_min
        H = np.random.rand(self.rank, col) * (v_max - v_min) + v_min

        # update
        for e in range(self.epoch):
            W = W * ( (X @ H.T)/(W @ H @ H.T) )
            H = H * ( (W.T @ X) / (W.T @ W @ H) )
        self.W = W
        self.H = H


if __name__ == '__main__':
    img_src = "https://test87983.oss-cn-shanghai.aliyuncs.com/299536/poster.jpg"
    image = io.imread(img_src)

    clf = NMF(rank=300, epoch=100)
    clf.train(image[:, :, 0])
    new_image = clf.W @ clf.H
    print(new_image)
    print(image[:, :, 0])
    new_image = new_image.astype("uint8")
    io.imshow(new_image)
    io.show()

Reference

  • https://zhuanlan.zhihu.com/p/22043930
  • http://www.columbia.edu/~jwp2128/Teaching/E4903/papers/nmf_nature.pdf
作为一种重要的身份认证的手段,人脸识别已经广泛地应用于管理、安全等各个领域。人脸识别的一个关键性的问题是特征抽取,即如何从众多的特征寻找最有效的特征。子空间分析法是一种有效的特征抽取方法,而本文所研究讨论的非负矩阵分解(Non-negative Matrix Factorization, NMF)具有一些独特的优点,成为构建特征子空间的一种有效的方法。 非负矩阵分解是一种新的矩阵分解方法,它将一个非负矩阵分解为左右两个非负矩阵的乘积。由于分解前后的矩阵仅仅包含非负元素,因此原来矩阵的列向量可解释为对左矩阵所有列向量(称基向量)的加权和;而权重系数为右矩阵对应列向量的元素。这种基于基向量组合的表示形式具有直观的语义解释,反映了人们思维局部构成整体的概念。与一般矩阵分解方法相比,NMF具有其独特的优点。例如实现起来比较简单,分解的形式和结果具有实际的物理意义等。典型的非监督学习算法,如主分量分析(PCA)、矢量量化(VQ)、独立分量分析(ICA)、因子分析(FA)等,均可以理解为对原始数据矩阵在一定条件限制下进行分解。本文的非负矩阵分解(NMF)算法与上述算法模型类似,是国际上新近提出的一种矩阵分解方法。与其他方法相比,NMF特殊之处在于其对于矩阵分解过程的非负限制,这会得到原始数据基于部分的表示,从而能更好的反映原始数据的局部特征,NMF的这一特性使得其可在诸多领域的应用得到很好的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值