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

这篇具有很好参考价值的文章主要介绍了【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文件】
【更多内容敬请期待】文章来源地址https://www.toymoban.com/news/detail-628105.html


到了这里,关于【Python】NMF非负矩阵分解算法(测试代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【能量算子】评估 EEG 中的瞬时能量:非负、频率加权能量算子(Python&Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Python、Matlab代码实现

    2024年02月08日
    浏览(42)
  • Python矩阵LU分解

    scipy.linalg 中提供了一系列矩阵分解函数,其中最基础的肯定是LU分解。 LU分解,即使得矩阵 A A A 分解为 L U LU LU ,其中 L L L 为下三角阵, U U U 为上三角阵。对于这两种矩阵, scipy.linalg 中提供了 tril, triu ,可以将第 k k k 条对角线下面或上面的所有元素置零,即可以此获取L矩

    2024年02月08日
    浏览(34)
  • 【VMD-DBO-LSTM】变分模态分解-蜣螂优化算法-长短时记忆神经网络研究(Python代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 1.1 变分模态分解算法 1.2 蜣螂优化算法 1.3 LSTM 📚2 运行

    2024年02月09日
    浏览(51)
  • C#,数值计算,矩阵的乔莱斯基分解(Cholesky decomposition)算法与源代码

    安德烈·路易斯·乔尔斯基出生于法国波尔多以北的查伦特斯海域的蒙古扬。他在波尔多参加了Lycée e,并于1892年11月14日获得学士学位的第一部分,于1893年7月24日获得第二部分。1895年10月15日,乔尔斯基进入莱科尔理工学院,在当年223名入学学生中排名第88位。他在莱科尔理工

    2024年02月22日
    浏览(38)
  • Python实现矩阵奇异值分解(SVD)

    Python实现矩阵奇异值分解(SVD) 矩阵奇异值分解(Singular Value Decomposition, SVD)是一种重要的矩阵分解方法,可以将一个矩阵分解成三个矩阵的乘积,即 A = U Σ V T A=USigma V^{T} A = U Σ

    2024年02月10日
    浏览(42)
  • 机器学习实战:Python基于SVD奇异值分解进行矩阵分解(八)

    1.1 奇异值分解 奇异值分解( Singular Value Decomposition,SVD )是一种重要的矩阵分解技术,它可以将一个矩阵分解为三个矩阵的乘积,分别为左奇异矩阵、奇异值矩阵和右奇异矩阵。SVD 的原理可以描述如下: 对于任意 m × n m times n m × n 的矩阵 A A A ,它的 SVD 分解为: A = U $

    2024年02月02日
    浏览(56)
  • 【Python】scipy稀疏矩阵的奇异值分解svds

    当 A A A 是方阵时,可以很容易地进行特征分解: A = W Σ W − 1 A=WSigma W^{-1} A = W Σ W − 1 ,其中 Σ Sigma Σ 是 A A A 的特征值组成的对角矩阵。如果 W W W 由标准正交基组成,则 W − 1 = W T W^{-1}=W^T W − 1 = W T ,特征分解可进一步写成 W T Σ W W^TSigma W W T Σ W 。 然而,当 A A A 不是方

    2024年02月12日
    浏览(39)
  • 【华为OD机试真题 Python语言】68、矩阵扩散 | 机试题+算法思路+考点+代码解析

    🍂个人博客首页: 鲨鱼狼臧   🍂专栏介绍: 2023华为OD机试真题,使用Python进行解答,专栏每篇文章都包括真题,思路参考,代码分析,订阅有问题后续可与博主解答问题 🎃题目描述 存在一个m*n的二维数组,其成员取值范围为0或1   其中值为1的成员具备扩散性,每经过

    2024年02月15日
    浏览(51)
  • 变分模态分解(VMD)-Python代码

    变分模态分解(VMD)的原理推荐两个参考连接 变分模态分解原理步骤和VMD算法的介绍 代码可直接运行 以上就是所有内容,感谢敢看!求三连!

    2024年02月16日
    浏览(37)
  • 对称矩阵的三对角分解(Lanzos分解算法)-MINRES算法预热

    这篇博客看完以后接着看下一篇博客添加链接描述专门介绍MINRES算法实现就容易了 首先介绍Lanczos分解,Lanzos把对称矩阵转换为一个三对角对称矩阵。考虑三对角对称矩阵如下,考虑正交分解 T = Q T A Q T = Q^T A Q T = Q T A Q T = ( α 1 β 1 0 ⋯ 0 0 β 1 α 2 β 2 0 ⋯ 0 0 β 2 α 3 β 3 ⋯ 0

    2024年02月03日
    浏览(239)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包