因子分析和非负矩阵分解

news2024/12/23 14:05:28

因子分析 (Factor Analysis, FA)

因子分析是一种统计方法,用于通过少量潜在变量(因子)解释观测数据中的相关结构。它在数据降维、特征提取和变量选择中广泛应用。

原理

因子分析假设观测变量是由少数潜在因子线性组合并加上噪声得到的。通过估计因子载荷矩阵和因子方差,可以解释数据的相关结构。

公式推理
  1. 线性模型: 给定观测数据矩阵 X 和因子矩阵 F,模型可以表示为:

其中,L 是因子载荷矩阵,E 是噪声矩阵。

  1. 因子协方差: 假设因子 F 的协方差矩阵为 Ψ,噪声 E 的协方差矩阵为 Θ,则观测数据 X 的协方差矩阵为:

  1. 估计参数: 通过最大似然估计(MLE)或主成分方法,可以估计因子载荷矩阵 L 和因子方差矩阵 Ψ。
经典案例

案例:FA在心理学问卷数据中的应用

我们将使用一个假设的心理学问卷数据集,其中包含若干个问题的回答。通过因子分析,可以识别出潜在的心理因素。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import FactorAnalysis
from sklearn.preprocessing import StandardScaler

# 生成假设的心理学问卷数据
np.random.seed(0)
n_samples = 1000
n_features = 10

# 假设数据是由三个潜在因子生成的
true_factors = np.random.normal(size=(n_samples, 3))
loading_matrix = np.random.normal(size=(3, n_features))
X = np.dot(true_factors, loading_matrix) + np.random.normal(size=(n_samples, n_features))

# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 使用因子分析进行降维
fa = FactorAnalysis(n_components=3, random_state=42)
X_fa = fa.fit_transform(X_scaled)

# 可视化因子载荷
plt.figure(figsize=(12, 6))
plt.imshow(fa.components_, cmap='viridis', aspect='auto')
plt.colorbar(label='Loading Value')
plt.title('Factor Loadings')
plt.xlabel('Feature')
plt.ylabel('Factor')
plt.show()
代码解析
  1. 生成假设的心理学问卷数据:假设数据由三个潜在因子生成,使用随机数生成因子和载荷矩阵。
  2. 标准化数据:使用 StandardScaler 对数据进行标准化处理,使得每个特征具有零均值和单位方差。
  3. 使用因子分析进行降维:创建因子分析对象并将数据降到三个因子。
  4. 可视化因子载荷:绘制因子载荷矩阵,展示每个因子与原始特征之间的关系。

代码展示了如何利用因子分析对高维数据进行降维,并通过可视化直观地展示了因子与原始特征的关系,有助于理解因子分析在数据特征提取中的应用。

非负矩阵分解 (Non-negative Matrix Factorization, NMF)

NMF 是一种矩阵分解方法,它将一个非负矩阵分解成两个非负矩阵的乘积,广泛用于数据降维、主题建模和推荐系统。

原理

NMF 通过将原始数据矩阵 X 分解为两个非负矩阵 W 和 H 的乘积来近似原始数据。矩阵 W 和 H 分别表示低维特征和基向量。

公式推理
  1. 非负矩阵分解: 给定一个 m×n 非负矩阵 X,NMF 将其分解为 m×k 非负矩阵 W 和 k×n 非负矩阵 H,使得:

  1. 优化目标: 最小化原始矩阵和分解矩阵的 Frobenius 范数:

其中,∥⋅∥F 表示 Frobenius 范数。

  1. 约束条件

经典案例

案例:NMF 在图像数据集上的应用

我们将使用 Olivetti 面部图像数据集,该数据集包含 400 张面部图像,每张图像是 64x64 像素的灰度图像。通过 NMF 将面部图像数据降维,并可视化基向量。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_olivetti_faces
from sklearn.decomposition import NMF
from sklearn.preprocessing import MinMaxScaler

# 加载 Olivetti 面部图像数据集
faces = fetch_olivetti_faces(shuffle=True, random_state=42)
X = faces.data

# 使用 MinMaxScaler 进行数据归一化
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)

# 使用 NMF 进行降维
n_components = 10
nmf = NMF(n_components=n_components, random_state=42)
W = nmf.fit_transform(X_scaled)
H = nmf.components_

# 可视化基向量
fig, axes = plt.subplots(2, 5, figsize=(15, 6),
                         subplot_kw={'xticks':(), 'yticks':()})
for i, ax in enumerate(axes.flat):
    ax.imshow(H[i].reshape(64, 64), cmap='gray')
    ax.set_title(f'Component {i+1}')
plt.suptitle('NMF Components')
plt.show()
代码解析
  1. 加载 Olivetti 面部图像数据集:使用 fetch_olivetti_faces 函数加载面部图像数据集,包括特征矩阵 X
  2. 标准化数据:使用 StandardScaler 对数据进行标准化处理,使得每个特征具有零均值和单位方差。
  3. 使用 NMF 进行降维:创建 NMF 对象并将数据降到 10 个组件。
  4. 可视化基向量:绘制 NMF 基向量,每个基向量表示一个特征模式。
实战应用:
1. 数据加载与预处理

真实照片可能需要从文件系统中读取,并进行一些预处理操作。这包括读取图像文件、调整图像尺寸和进行归一化。

2. 代码修改步骤
  1. 读取图像:你可以使用像 PILOpenCV 这样的库来读取和处理图像。
  2. 调整图像尺寸:确保所有图像尺寸一致,以便可以将它们转化为相同的特征维度。
  3. 数据归一化:确保图像数据在 [0, 1] 范围内。

以下是一个示例代码,演示如何处理真实照片并使用 NMF:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import NMF
from sklearn.preprocessing import MinMaxScaler
from PIL import Image
import os

# 设置图像文件路径和参数
image_dir = 'path_to_your_images_directory'  # 替换为图像文件夹的路径
image_size = (64, 64)  # 目标图像尺寸

# 读取图像并转换为数组
def load_images_from_folder(folder, size):
    images = []
    for filename in os.listdir(folder):
        img_path = os.path.join(folder, filename)
        with Image.open(img_path) as img:
            img = img.convert('L')  # 转为灰度图像
            img = img.resize(size)  # 调整图像尺寸
            img_array = np.array(img).flatten()  # 展平图像
            images.append(img_array)
    return np.array(images)

# 加载图像数据
X = load_images_from_folder(image_dir, image_size)

# 数据归一化
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)

# 使用 NMF 进行降维
n_components = 10  # 选择适当的组件数量
nmf = NMF(n_components=n_components, random_state=42)
W = nmf.fit_transform(X_scaled)
H = nmf.components_

# 可视化 NMF 基向量
fig, axes = plt.subplots(2, 5, figsize=(15, 6), subplot_kw={'xticks':(), 'yticks':()})
for i, ax in enumerate(axes.flat):
    ax.imshow(H[i].reshape(image_size), cmap='gray')
    ax.set_title(f'Component {i+1}')
plt.suptitle('NMF Components')
plt.show()
说明
  1. 读取图像
    • 使用 PIL 库的 Image.open() 函数读取图像。
    • 将图像转换为灰度图像(如果不需要颜色通道),并调整到指定的尺寸。
  1. 归一化
    • 使用 MinMaxScaler 将图像数据归一化到 [0, 1] 范围。
  1. NMF 降维
    • 设置 n_components 为你希望的特征数量。
    • 使用 NMF 进行降维,并可视化基向量。
  1. 图像尺寸
    • 确保所有图像的尺寸一致,以便将它们展平为固定长度的特征向量。
额外的考虑
  • 图像质量:处理真实照片时,图像质量和分辨率会影响结果。确保图像清晰并适合分析。
  • 数据集大小:对于大量图像,可能需要考虑数据的加载和处理效率。

代码展示了如何利用 NMF 对高维数据进行降维,并通过可视化直观地展示了基向量,有助于理解 NMF 在数据特征提取中的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1988336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Stable Diffusion 使用详解(6)---人物风格及背景变换

目录 背景 ControlNet lineart IP-Adapter 实例 生成场景模特 操作 生成效果 生成背景 操作 生成效果 融合 ip-adaptor contrlNet lineart controlNet 生成效果 背景 很多场景下,需要完成人物风格变换,比如现在是写真集,想转…

『 Linux 』网络基础

文章目录 协议分层OSI 七层模型TCP/IP 四层(五层)模型网络协议栈与操作系统的联系报文TCP/IP 通讯过程以太网通信的过程以太网的数据碰撞 协议分层 协议分层是计算机网络中奖网络协议进行组织和管理的方法; 通过将网络通信过程分成多个层次,每个层次负责特定的功能从而简化网络…

打破视频生成难题,腾讯提出 MimicMotion引领AI模仿人体动作新纪元

该论文提出了一种可控的视频生成框架MimicMotion,能够生成高质量且任意长度的视频,模仿特定的运动指导。该研究引入信心感知姿势指导,确保视频帧的高质量和时间平滑性。同时,还引入了基于姿势信心的区域性损失放大策略&#xff0c…

hashmap底层原理(数据结构 put原理 get原理 remove原理)

目录 一、数据结构 二、put原理 进入put方法 第一步:通过 HashMap 自己提供的hash 算法算出当前 key 的hash 值 第二步: 进入putVal(hash(key), key, value, false, true) 第三步: resize 完整源码 putval resize 流程图​ 三、get原…

如何不需要通过试单(多单未成功)来关闭被禁用的PayPal账号

轮询自检系统 可以最大程度不浪费订单,当你的PayPal被禁止收单时,无需通过试单(多单不成功)功能来关闭你的账号,极大的保证订单的成功率。 除了在接单时候系统自检,我们还提供一个批量检测PayPal账号系统,可大批量的检…

【运维自动化-配置平台】平台管理功能如何使用

蓝鲸智云配置平台,以下简称配置平台 配置平台里的平台管理功能是管理员的一些操作,比如一些全局纬度的设置1、全局配置-业务通用 业务快照名称:通常不需要修改,保持平台搭建好默认业务(蓝鲸)即可 拓扑最大…

主从备份及安装准备

主从复制 学习内容 1. 备份的三种类型 1. 热备份 2. 逻辑备份 3. 物理备份 2. 情景 ⼊职企业,发现企业架构为⼀主多从,但是两台从服务器和主库不同 步,但是每天会全库北⽅主服务器上的数据到从服务器,由于数据量 不是很⼤&a…

C++校园线上点餐系统-计算机毕业设计源码82032

摘要 本论文旨在设计并实现一种基于C语言的校园线上点餐系统,以解决校园内学生和教职员工点餐的便利性问题。该系统采用C语言作为主要开发语言,结合文件操作、数据结构和用户界面设计等技术,实现了一个功能完善的点餐系统。 论文介绍了校园线…

【书生大模型实战营第三期 | 基础岛第2关-8G 显存玩转书生大模型 Demo】

学习心得:8G 显存玩转书生大模型 Demo 摘要 本文是对《8G 显存玩转书生大模型 Demo》文档的学习心得。通过阅读文档,我了解了如何在有限的硬件资源下部署和使用大型语言模型,包括InternLM2-Chat-1.8B、InternLM-XComposer2-VL-1.8B和Intern…

langchain实现大模型结构化输出

文章目录 前言大模型对话函数返回列表格式返回对象类型返回对象格式(信息抽取)返回json格式做选择题(在给定答案中选一个答案) 前言 这里大模型使用GLM4。 结构化输出的稳定性与大模型的能力挂钩 听话的就容易出 不听话的就容易报…

SQL布尔盲注

目录 1 布尔盲注 2布尔盲注流程 2.1输入id进行测试 2.2判断注入类型 2.3爆数据库名 2.4爆表名 2.5爆字段名 2.6查询数据 1 布尔盲注 布尔盲注就是在SQL注入过程中,SQL语句执行后,查询到的数据不能回显到前端页面,如果正确执行了构造的…

连接一切:Web3如何重塑物联网的未来

传统物联网的挑战 物联网(IoT)正在迅速改变我们的世界,通过将各种设备连接到互联网,它使得设备能够相互交流,提供智能化的服务和解决方案。然而,随着物联网的迅猛发展,安全性、隐私保护和设备互…

C++ primer plus 第17 章 输入、输出和文件:文件输入和输出05:文件模式:内核格式化

C primer plus 第17 章 输入、输出和文件:文件输入和输出05:文件模式:内核格式化 C primer plus 第17 章 输入、输出和文件:文件输入和输出05:文件模式:内核格式化 17.5 内核格式化 程序清单 17.21 strout.cpp 文章目录 C primer plus 第17 章 输入、输…

第41届CCF

第41届CCF中国数据库学术会议 NDBC2024中国乌鲁木齐 《电信领域数据库新需求与挑战》分论坛介绍 2024年08月09日上午09:00-12:30 电信领域进入算力网络时代,数据库国产化需求迫切,对数据库可用性、扩展性、一体化、多模、跨域传输和调度等提出新的要求。基于此,本论坛重点讨…

UE5 右键菜单缺少Generate Visual Studio project files

前言 在安装完毕 ue5 后,看到别人右键菜单有 多出来的三个选项 ,但是我却没有,如下图: 解决方式 1、在 “C:\Program Files (x86)\Epic Games\Launcher\Engine\Binaries\Win64” 路径下有 UnrealVersionSelector.exe 文件。 …

fme从json中提取位置到kml中

fme从json中提取位置到kml中 简单参考,我自己要用的,越弄越复杂。 概述-模板总体结构 数据就是官方提供的数据,模板的基本节结构是读模块+转换器+写模块,最近爬取一些json文件,用到了。 1.使用json读模块读取数据 首先检查一下源数据 使用文本打开数据集,可以看到非缩…

压电雨量传感器的工作原理

型号推荐:云境天合TH-Y1】压电动能式雨量计通过雨滴撞击传感器产生的微小形变,将机械能转化为电能。这种转化过程基于压电效应,即某些材料在受到压力作用时会产生电荷,从而产生电信号。雨滴撞击传感器时,传感器发生形变…

写给大模型新人的经验,刷到少走三年弯路!

这篇文章,我将结合自己在大模型领域的经验,给大家详细聊聊新人应该如何转行大模型赛道? 比如大模型都有哪些方向?各方向的能力要求和岗位匹配?新手转行大模型常踩的坑和常见的误区?以及入行大模型最顺滑的…

扩散模型系列笔记(一)——DDPM

直观理解 扩散模型分为前向过程(扩散过程,Data → \to →Noise)和后向过程(生成过程或逆扩散过程,Noise → \to →Data)。在前向过程中,对于每一个观测样本,不断向样本中添加少量噪…

智能编程新纪元:腾讯AI代码助手的高效编程体验

智能编程新纪元:腾讯AI代码助手的高效编程体验 智能编程新纪元:腾讯AI代码助手的高效编程体验引言一、配置开发环境二、AI助手实现高效编程2.1 AI助手自动补全2.2 AI助手实现编程思维2.3 AI助手高效注解2.4 AI助手打破语言壁垒 三、帮助和提升四、优化和…