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

2023-11-06


欢迎关注 『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()

总结

大家喜欢的话,给个

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python】NMF非负矩阵分解算法(测试代码) 的相关文章

随机推荐

  • Vulhub Apache HTTPD 换行解析漏洞

    漏洞介绍 漏洞原理 运维人员为了解决 Apache 解析漏洞 会使用 配置 来限制匹配到的最后一个扩展名 这种方式虽然对多个扩展名的解析漏洞进行了防护 但是因为 的正则匹配规则可以将 php n 的扩展名同样可以匹配到 php 的规则 产生
  • Android使用ViewPager实现图片的轮播

    一 概述 在现在的Android项目中 首页图片轮播是随处可见的 今天我们看看如何实现 先看效果图 二 实现 先给大家看看最简单的布局文件
  • 架构之路_深度探索C++对象模型总结

    本文主要参照 深度探索C 对象模型 一书 一 关于对象 C语言中 数据和处理数据的操作 函数 是分开声明的 不支持数据函数之间的关联性 称之为程序性的 procedural 1 1 对象类型 C 中可以通过独立抽象数据类型实现 比如 cla
  • Unity 中场景切换

    Unity游戏开发中 单个Scene解决所有问题似乎不可能 那么多个Scene之间的切换是必然存在 如果仅仅是切换 似乎什么都好说 但是在场景比较大的时候不想让玩家等待加载或者说场景与场景之间想通过一些画面 动画表现出一些让玩家期待的东西
  • 禅道数据库异机访问,远程连接,navicat连接

    禅道数据库异机访问 远程连接 navicat连接 在使用xxj job做执行器时遇到的问题 数据库端口可以在这里修改 可以在这里修改 opt zbox app zentao config my php 禅道数据库官方文档 该链接也有修改数据
  • TP5+Fastadmin+Log日志

    Log 日志 1 引入类 use think Log 2 记录日志 通过Log类的record 方法 记录一条日志 Log record 这是一条普通日志 记录一个错误级别的日志 使用error 方法 Log error 这是一条错误日志
  • 2022届实习+秋招大厂面试经验(后端开发+java)

    个人情况 待补充 求职方向 后端开发 大致情况 20年底在字节实习到21年6月底 转正 21年7月初开始在阿里实习到8月中 转正 随后面试了百度 腾讯和美团 均拿到offer 中间有挂过 被其他部门又捞了 最终选择阿里 我是22年秋季毕业
  • C++函数中返回智能指针的裸指针问题

    注意 如果不是CSDN网站显示本篇文章 请于底部点击 阅读原文 来阅读本篇文章 C 函数中返回智能指针的裸指针问题 要点 原始代码 解决办法 作为一项案例分析下 C 函数中返回智能指针的裸指针问题 要点 不要在函数中返回智能指针的裸指针出去
  • Flutter之MaterialApp使用详解

    如需转载 请尊重作者 注明出处 谢谢配合 22个参数 字段 类型 navigatorKey 导航键 GlobalKey home 主页 Widget routes 路由 Map
  • 非常简单的无闪刷新验证码原理

    非常简单的无闪刷新验证码原理 只有这一段事件触发语句全搞定 nclick this src GifCode asp newDate getTime GifCode asp验证码的图片 事件 nclick this src GifCode a
  • jsp中request经常是的获取参数的方法总结

    我的个人博客开通了 地址 https timewentby com 欢迎访问 下面将获取参数的方法都列出来说一说 request getParameter String name 获取指定name的值 若name有多个相同值则获取第一个va
  • Devoloper warning for package "com..." Failed to post notification on channel "null" see log for det

    使用通知时屏幕显示 这是因为我们使用的是Android O Android 8 0 之前的通知写法 而Android O之后引入了通知通道 Notification channel 重新定义通知内容中的应用程序类别 可以让开发者给予用户更精
  • Kubernetes CKA考试和真题(下)

    前言 之前分享了CKA考试的1 10题 这篇文章继续分享CKA实操考试的最后7到题目 忘了告诉大家 考试的时候可以查看官网资料 监考官是允许这个行为的 但是你不能打开除了k8s官网的其它页面 第11题 启动多容器pod 任务 创建一个名为k
  • 计算巢实现大模型微调——如何发布一个微调服务

    前言 各位看官 最近是否被大模型相关信息刷屏了呢 铺天盖地的大模型预训练 微调等各种关键词是否让你眼花缭乱呢 在如此热度之下 你有没有想过自己亲自动手部署一个大模型执行训练或者微调呢 或许你曾经尝试过却被某个繁琐的步骤劝退了呢 又或者你是模
  • 关于java.lang.NullPointerException: Cannot invoke “org.springframework.data.redis.core.

    java lang NullPointerException Cannot invoke org springframework data redis core RedisTemplate opsForValue because this
  • 机器学习--特征缩放/均值归一化

    特征缩放 feature scaling 其中 特征缩放 feature scaling 大致的思路是这样的 梯度下降算法中 在有多个特征的情况下 如果你能确保这些不同的特征都处在一个相近的范围 这样梯度下降法就能更快地收敛 举个例子来说明
  • Linux中查看所有文件夹及包括文件大小之和

    如果想查看Linux中哪个文件夹最大 可以通过du sh 命令查询哪个文件夹最大 然后进入该文件夹继续执行该命令 直到找出最大的为止 1 Linux中查看所有文件夹和文件大小 这条命令将会计算该文件夹下所有文件大小总和 du sh 执行效果
  • 1、Reading Rasa Source Code —— main

    目录 main main 从 pypi 官方网站上下载 rasa 的最后一个释放版本 截止目前 最新版本为 2 2 1 的源码 解压后 在根目录下 找到 setup py 文件 这是安装引导程序 我们主要关注的是 entry points
  • TypeScript算法题实战——二叉搜索树篇

    二叉搜索树 也叫二叉查找树 二叉排序树 是具有下列性质的二叉树 若它的左子树不空 则左子树上所有结点的值均小于它的根结点的值 若它的右子树不空 则右子树上所有结点的值均大于它的根结点的值 注意 二叉搜索树中序遍历的结果是有序的 本系列博文将
  • 【Python】NMF非负矩阵分解算法(测试代码)

    目录 算法说明 百度百科 基本例程 总结 欢迎关注 Python 系列 持续更新中 欢迎关注 Python 系列 持续更新中 算法说明 百度百科 从多元统计的观点看 NMF是在非负性的限制下 在尽可能保持信息不变的情况下 将高维的随机模式简