基于LPP算法实现MNIST数据集降维

news2024/12/23 14:02:15

目录

  • 1、作者介绍
  • 2、LPP算法简介
    • 2.1 基本概念及原理
    • 2.2 算法流程
  • 3、LPP算法实现
    • 3.1 数据集简介
    • 3.2 代码实现
      • 3.2.1 完整代码
      • 3.2.2 运行结果
  • 4、参考链接

1、作者介绍

刘晨雨,男,西安工程大学电子信息学院,2022级研究生
研究方向:医学图像分割
电子邮件:1422231109@qq.com

陈梦丹,女,西安工程大学电子信息学院,2022级硕士研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:1169738496@qq.com

2、LPP算法简介

2.1 基本概念及原理

LPP(Locality Preserving Projection),即局部保留投影算法,是一种常用的降维算法,通过线性近似LE算法(拉普拉斯特征映射)来保留局部信息,可以被看做是PCA的替代。

LPP算法通过构建空间中各样本对之间的远近亲疏关系,并在降维投影中尽可能地去保留这样的亲疏关系,从而保留数据的局部结构。

2.2 算法流程

LPP算法的核心思想是通过线性映射将高维数据投影到低维空间,使得样本的局部关系在低维空间中得以保持。

算法的具体步骤如下:

  • 构建邻近图:首先,根据数据之间欧氏距离,计算每个样本与其最近邻样本之间的距离,并构建一个邻近图。
  • 构建权重矩阵:根据邻近图,计算每个样本与其最近邻样本之间的权重。常用的权重计算方法是通过径向基函数计算权重,距离较近的样本具有较高的权重。
  • 构建重构误差矩阵:对于每个样本,通过将其与其最近邻样本的线性组合重构出来,计算重构误差。重构误差表示通过低维空间的投影无法完美重构原始样本。
  • 构建目标函数:LPP算法的目标是最小化重构误差,同时保持样本之间的局部关系。因此,构建目标函数,使得重构误差最小化。目标函数通常可以表示为矩阵形式,并通过对该矩阵进行特征值分解,得到最优的投影矩阵。
  • 降维:根据得到的最优投影矩阵,将高维数据映射到低维空间中,完成降维过程。

3、LPP算法实现

3.1 数据集简介

手写数字数据集(digits)是常用的sklearn库中自带的数据集,直接调用即可;digits所包含的主要数据分为images 、data、target、target_names。其中:

  • imgaes 是一个三维矩阵1797 张8 * 8的图片;
  • data是具体数据包含1797个样本,每个样本包括8 × 8像素的图像,其实就是将8 × 8的images按行展开;
  • target 指明每张图片的标签,也就是每张图片代表的数字;
  • target_names数据集中所有标签[0,1,2,3,4,5,6,7,8,9] 。
    在这里插入图片描述

3.2 代码实现

3.2.1 完整代码

# 导入包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_digits
# 求欧氏距离
# X维度[N,D]
def cal_pairwise_dist(X):
    N,D = np.shape(X)
    # 数据扩展
    tile_xi = np.tile(np.expand_dims(X,1),[1,N,1])
    tile_xj = np.tile(np.expand_dims(X,axis=0),[N,1,1])
    # 欧式距离公式
    dist = np.sum((tile_xi-tile_xj)**2,axis=-1)
    # 返回任意两个点之间距离
    return dist
# 求取rbf径向基函数
def rbf(dist, t = 1.0):
    return np.exp(-(dist/t))
# 求取两两点的位置关系矩阵W
def cal_rbf_dist(data, n_neighbors = 10, t = 1):
    # 根据输入的data数据调用欧式距离公式计算两两点之间的距离
    dist = cal_pairwise_dist(data)
    # 如果距离小于0则直接为0
    dist[dist < 0] = 0
    # 样本点的数目N为距离的第一个维度
    N = dist.shape[0]
    # 径向基
    rbf_dist = rbf(dist, t)
    # 初始矩阵N*N
    W = np.zeros([N, N])
    # 逐行遍历
    for i in range(N):
        # 按照欧氏距离从小到大进行排序,取n个最近的样本点
        index_ = np.argsort(dist[i])[1:1 + n_neighbors]
        # 径向基算出这些点的距离
        W[i, index_] = rbf_dist[i, index_]
        W[index_, i] = rbf_dist[index_, i]
    return W
# X为输入维度 格式 [N,D];n_neighbors为K近邻的数目; t为距离计算的参数
def lpp(X,n_dims = 2,n_neighbors = 30, t = 1.0):
    N = X.shape[0]
    W = cal_rbf_dist(X, n_neighbors, t)
    D = np.zeros_like(W)
    # 计算对角线矩阵D
    for i in range(N):
        D[i,i] = np.sum(W[i])
    L = D - W
    XDXT = np.dot(np.dot(X.T, D), X)
    XLXT = np.dot(np.dot(X.T, L), X)
    # 求上述式子的特征值和特征向量
    eig_val, eig_vec = np.linalg.eig(np.dot(np.linalg.pinv(XDXT), XLXT))
    # 返回一个由小到大的排序后的序号
    sort_index_ = np.argsort(np.abs(eig_val))
    # 特征值根据序号重新排列
    eig_val = eig_val[sort_index_]
    # 输出前十个特征值
    print("输出前十个特征值:", eig_val[:10])
    # 判断特征值太小的舍去
    j = 0
    while eig_val[j] < 1e-6:
        j+=1
    # 最终选择一个j出来
    print("\nj: ", j)
    # 最终取n_dims个比较小的特征值的序号
    sort_index_ = sort_index_[j:j+n_dims]
    # 选取的特征值
    eig_val_picked = eig_val[j:j+n_dims]
    print("选取的特征值:", eig_val_picked)
    # 得到转换矩阵A:特征值所对应的特征向量
    A = eig_vec[:, sort_index_]
    # 求取的那个公式
    Y = np.dot(X, A)
    return Y

if __name__ == '__main__':
    # 测试 load_digits 数据
    X = load_digits().data
    Y = load_digits().target
    n_neighbors = 5
    dist = cal_pairwise_dist(X)
    max_dist = np.max(dist)
    data_2d_LPP = lpp(X, n_neighbors = n_neighbors, t = 0.01*max_dist)
    data_2d_PCA = PCA(n_components=2).fit_transform(X)
    # 画图
    plt.figure(figsize=(12,6))
    plt.subplot(121)
    plt.title("LPP")
    plt.scatter(data_2d_LPP[:, 0], data_2d_LPP[:, 1], c = Y)
    plt.subplot(122)
    plt.title("PCA")
    plt.scatter(data_2d_PCA[:, 0], data_2d_PCA[:, 1], c = Y)
    plt.show()

3.2.2 运行结果

在这里插入图片描述

4、参考链接

[1] 局部保留投影算法解析参考:https://zhuanlan.zhihu.com/p/340121889
[2] LPP算法实现代码参考:https://github.com/heucoder/dimensionality_reduction_alo_codes/blob/master/codes/LPP/LPP.py

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

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

相关文章

低代码开发重要工具:jvs-rules 规则引擎功能介绍(四)

一、策略管理 JVS-Rules采用业务与技术分离的思路&#xff0c;业务人员可以配置和业务相关的内容&#xff0c;可以不考虑底层变量的配置&#xff0c;只需要配置对业务的描述&#xff0c;具体实现的变量绑定可以由技术人员参与&#xff0c;这里就体现了技术与业务规则可以解耦。…

值得收藏的20张小学语文思维导图

思维导图不仅在我们的工作生活中起到越来越重要的作用&#xff0c;也在悄无声息中进入到了我们小学生的课堂。 有需要的家长赶快帮自家的宝贝收藏起来吧&#xff01; 小学语文_ProcessOn思维导图流程图https://link.zhihu.com/?targethttps%3A//www.processon.com/template/s…

leetcode 二分查找小结

文章目录 题目34. 在排序数组中查找元素的第一个和最后一个位置240. 搜索二维矩阵378. 有序矩阵中第 K 小的元素287. 寻找重复数33. 搜索旋转排序数组 总结 题目 34. 在排序数组中查找元素的第一个和最后一个位置 原始思路&#xff1a; class Solution:def searchRange(self,…

Python实现的端午节吃棕子除五毒体感小游戏源码,利用Paddlehub制作的端午体感小游戏,根据摄像头识别的人脸进行控制

利用Paddlehub制作端午体感小游戏 前言 马上要端午节,所以干脆再重写一些逻辑,做个端午节定制小游戏吧. 端午特色 游戏的贴图全换成了端午节相关贴图:三种粽子造型 雄黄酒 以及五毒:蛇,壁虎,蜈蚣,蟾蜍,蟹子 其实五毒也是我在逛了粽子博物馆才看到的哈哈哈,所以虽…

Jmeter+jenkins+ant自动化测试环境搭建

环境&#xff1a;Windows 一、准备安装包 JDK:jdk1.8.0_191 Jmeter:apache-jmeter-5.0 ANT:apache-ant-1.10.7 Jenkins:Jenkins2.233 二、安装JDK 下载地址&#xff1a;https://www.oracle.com/java/technologies/javase-downloads.html 下载后一直下一步即可 1、配置…

模型服务文档自动生成,要素追溯关联、结构规范易读|ModelWhale 版本更新

整装待发的初夏&#xff0c;ModelWhale 持续聚焦 AI for Science&#xff0c;针对大模型等前沿带来了新一轮的版本更新&#xff0c;期待为你提供更好的使用体验。 本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a; • 新增 模型服务文档自动生成&#xf…

美团4.27---实习--【第三档】

1.什么时候重写equals和hashCode方法&#xff1f; /*因为Object中默认的equals方法&#xff0c;内部还是使用来比较对象在内存中的地址&#xff0c;所以结果位false*//*如果重写了equals方法&#xff0c;那么如果两个对象的属性值相同&#xff0c;那么程序会在第三步判断中返回…

Day_46快速排序

目录 一. 关于快速排序思路的产生 二. 快速排序的实现 1. 快速排序的实现 2. 快速排序的效率分析 三. 快速排序的代码实现 1. 快速排序 2. 快速排序核心代码&#xff1a; 四. 代码展示 五. 数据测试 六. 总结 一. 关于快速排序思路的产生 从现在开始&#xff0c;让我们假设…

Hive学习---7、企业级调优

1、企业级调优 1.1 计算资源配置 到此学习的计算环境为HIve on MR。计算资源的调整主要包括Yarn和MR。 1.1.1 Yarn资源配置 1、Yarn配置说明 需要调整的Yarn的参数均与CPU、内存等资源有关&#xff0c;核心配置参数如下&#xff1a; &#xff08;1&#xff09;yarn.nodeman…

Python 三局两胜小游戏

文章目录 1. 明确项目目标2. 分析过程&#xff0c;拆解项目3. 逐步执行 代码实现版本1&#xff1a;版本2&#xff1a;【格式化字符串 %】 1. 明确项目目标 今天且让我扮演一下产品经理的角色。我们此次要实现的需求是&#xff1a;人机PK小游戏。具体效果请参照下面的示意动图。…

OpenGL之VAO,VBO和EBO

一、BO&#xff08;Buffer Object&#xff0c;缓冲对象&#xff09; 缓冲对象是OpenGL管理的一段内存&#xff0c;为了与我们CPU的内存区分开&#xff0c;一般称OpenGL管理的内存为&#xff1a;显存。 显存&#xff0c;也就是显卡里的内存。显卡访问显存比较快&#xff0c;而Bu…

vue3 element-plus 暗黑模式(主题切换)简易版

暗黑模式是说明 暗黑模式是指在应用程序或操作系统中使用暗色背景和浅色文本的界面设计。与传统的亮色模式相比&#xff0c;暗黑模式具有以下特点&#xff1a; 减少眼部疲劳&#xff1a;使用暗色背景可以减少屏幕发出的蓝光&#xff0c;减轻长时间使用电子设备对眼睛的疲劳程度…

【算法与数据结构】707.、LeetCode设计链表

文章目录 一、题目二、设计链表三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、设计链表 思路分析&#xff1a;这里我将的成员函数放在类外实现了&#xff0c;这样链表类看起来更加简洁&#xff0c;方便大家…

mysql之uniquekey学习。

uniquekey就真的是唯一键了吗&#xff1f; 答案是不是的。可以允许多个重复null值的存在&#xff0c;版本5.73 CREATE TABLE student_uniq ( id int(11) DEFAULT NULL, name varchar(200) DEFAULT NULL, socre int(11) DEFAULT NULL, UNIQUE KEY s_uniq (socre,name) )…

【操作系统】Linux进阶必须掌握的进程、线程及调度算法~进程学习

Linux内核源代码中&#xff0c;进程的状态是用数字来表示的&#xff0c;为了弄明白正在运行的进程是什么意思&#xff0c;我们需要知道进程的不同状态。一个进程可以有几个状态&#xff08;在Linux内核里面&#xff0c;进程有时候也叫任务&#xff09; /* The task state arra…

【TA100】图形 2.6伽马(Gamma)校正

很好的视频 https://www.bilibili.com/video/BV15t411Y7cf/?spm_id_from333.788.b_636f6d6d656e74.96&vd_source6f3a5e0ac931d869aee3d7c9bb6847e0 一、Gamma校正 1.前言&#xff1a;颜色空间 ● 一些颜色空间的举例&#xff0c;&#xff08;具体参考2.1节内容&#xff0…

最大似然估计(MLE)VS 最大后验概率估计(MAP)

1、概率和统计是一个东西吗&#xff1f; 概率&#xff08;probabilty&#xff09;和统计&#xff08;statistics&#xff09;看似两个相近的概念&#xff0c;其实研究的问题刚好相反。 一句话总结&#xff1a;概率是已知模型和参数&#xff0c;推数据。统计是已知数据&#x…

普通学校计算机毕业生,从事网络安全行业可以吗?

如果你是普通大学、大专的计算机专业应届生&#xff0c;还在迷茫找工作&#xff0c;这篇内容希望你能认真看完&#xff0c;很可能会决定你的人生方向。 现在的高薪行业&#xff0c;除了明星就只能是程序员了。不信你问问身边的人想学哪个专业&#xff0c;他们肯定不假思索的说…

C++基础(三) —— 内存分配

文章目录 概念01 物理地址内存的分配与释放02 虚拟用户进程空间内存的分配与释放 03 allocator模板类04 new delete05 malloc free06 strcpy 与 memcpy 与 memsetstrcpymemcpymemset 概念 01 物理地址内存的分配与释放 主要采用链表结构 使用了一个名叫page的结构体管理物理…

基于nodejs实现text/event-stream简单应用案例,SSE

基于nodejs实现text/event-stream简单应用案例&#xff0c;SSE text/event-stream代码实现服务器端前端 效果 text/event-stream 是一种用于服务器向客户端推送事件的媒体类型&#xff08;Media Type&#xff09;。它是基于 HTTP 协议的一种流式传输技术&#xff0c;也被称为 …