【Python】NMF非负矩阵分解算法(测试代码)

目录

    • 算法说明(百度百科)
    • 基本例程
    • 总结


欢迎关注 『Python』 系列,持续更新中
欢迎关注 『Python』 系列,持续更新中

算法说明(百度百科)

从多元统计的观点看,NMF是在非负性的限制下,在尽可能保持信息不变的情况下,将高维的随机模式简化为低维的随机模式H,而这种简化的基础是估计出数据中的本质结构W;从代数的观点看,NMF是发现数据的一种内在非负(或蕴涵更多性质的)代数分解形式或表示方法;从维数约减的观点看,因为基矩阵W和系数矩阵H同时由NMF来确定,系数矩阵H并非为数据矩阵V在W上的投影,所以NMF实现的是非线性的维数约减。

NMF最成功的一类应用是在图像的分析和处理领域。图像本身包含大量的数据,计算机一般将图像的信息按照矩阵的形式进行存放,针对图像的识别、分析和处理也是在矩阵的基础上进行的。这些特点使得NMF方法能很好地与图像分析处理相结合。人们已经利用NMF算法,对卫星发回的图像进行处理,以自动辨别太空中的垃圾碎片;使用NMF算法对天文望远镜拍摄到的图像进行分析,有助于天文学家识别星体;美国还尝试在机场安装由NMF算法驱动的识别系统,根据事先输入计算机的恐怖分子的特征图像库来自动识别进出机场的可疑恐怖分子。

基本例程

import numpy as np
import torch
import random
import matplotlib.pyplot as plt


def nmf(X, r, maxiter, minError):
    # X=U*V'
    row, col = X.shape
    U = np.around(np.array(np.random.rand(row, r)), 5)#
    V = np.around(np.array(np.random.rand(col, r)), 5)
    obj = []
    for iter in range(maxiter):
        print('-----------------------------')
        print('开始第', iter, '次迭代')
        # update U
        XV = np.dot(X, V)# np.dot(a ,b), 其中a和b都是二维矩阵,此时dot就是进行的矩阵乘法运算
        UVV = np.dot(U, np.dot(V.T, V))
        U = (U * (XV / np.maximum(UVV, 1e-10)))
        # update V
        XU = np.dot(X.T, U)
        VUU = np.dot(V, np.dot(V.T, V))
        V = (V * (XU / np.maximum(VUU, 1e-10)))
        d = np.diag(1 / np.maximum(np.sqrt(np.sum(V * V, 0)), 1e-10))
        V = np.dot(V, d)

        temp = X - np.dot(U, np.transpose(V))#计算损失
        error = np.sum(temp * temp)#损失和
        print('error:', error)
        print('第', iter, '次迭代结束')
        obj.append(error)
        if error < minError:
            break

    return U, V, obj


if __name__ == "__main__":
    X = np.random.randn(20, 50)#  生成20行50列矩阵,服从标准正态分布的随机样本值。
    X = np.array(np.abs(X))    #  确保非负
    print("X shape\n", X.shape)# (20, 50)
    # print('X:',X)#初始待分解的矩阵
    U, V, obj = nmf(X, 2, 100, 0.01)
    print("U\n",U)#     # X=U*V'
    print("U shape\n", U.shape)#(20, 2)
    print("V\n",V)#     # X=U*V'
    print("V shape\n", V.shape)# (50, 2)
    x = range(len(obj))
    plt.plot(x, obj)
    plt.show()

总结

大家喜欢的话,给个,点个关注!继续跟大家分享敲代码过程中遇到的问题!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2022 mzh

Crated:2022-1-10

欢迎关注 『Python』 系列,持续更新中
欢迎关注 『Python』 系列,持续更新中
【Python安装第三方库一行命令永久提高速度】
【使用PyInstaller打包Python文件】
【更多内容敬请期待】


你可能感兴趣的:(python,python,矩阵,算法)