【PyTorch][chapter 15][李宏毅深度学习][Neighbor Embedding-LLE]

前言:

     前面讲的都是线性降维,本篇主要讨论一下非线性降维.

流形学习(mainfold learning)是一类借鉴了拓扑流行概念的降维方法.

      如上图,欧式距离上面 A 点跟C点更近,距离B 点较远

     但是从图形拓扑结构来看, B 点跟A点更近


目录:

  1.    LLE 简介
  2.    高维线性重构
  3.    低维投影
  4.     Python 例子


一  局部线性嵌入(LLE Locally Linear Embedding )

           局部线性嵌入(Locally Linear Embedding,以下简称LLE)也是非常重要的降维方法。和传统的PCA,LDA等关注样本方差的降维方法相比,LLE关注于降维时保持样本局部的线性特征,由于LLE在降维时保持了样本的局部特征,它广泛的用于图像图像识别,高维数据可视化等领域。下面我们就对LLE的原理做一个总结。

   1.1  LLE 思想

          比如我们有一个样本 x_1,我们在它的原始高维邻域里用K-近邻算法(k=3)找到和它最近的三个样本 x_2,x_3,x_4    然后我们假设x_1,  可以由 x_2,x_3,x_4  线性表示,即:     

            x_1=w_{12}x_2+w_{13}x_3+w_{14}x_4w_{12},w_{13},w_{14}为权重系数。

   在我们通过LLE降维后,我们希望 x_1 在低维空间对应的投影z_1  ′和  x_2,x_3,x_4  对应的投影 z_2,z_3,z_4  也尽量保持同样的线性关系,即

              z_1=w_{12}z_2+w_{13}z_3+w_{14}z_4

 LLE算法的主要优点有:

    1)可以学习任意维的局部线性的低维流形

    2)算法归结为稀疏矩阵特征分解,计算复杂度相对较小,实现容易。

    LLE算法的主要缺点有:

    1)算法所学习的流形只能是不闭合的,且样本集是稠密均匀的。

    2)算法对最近邻样本数的选择敏感,不同的最近邻数对最后的降维结果有很大影响。


二  高维线性重构

         设有m个n维的样本

                        \begin{bmatrix} x_1\\ x_2 \\ .. \\ x_m \end{bmatrix}

        使用均方差作为损失函数

           J(W)=\sum_{i=1}^{m}||x_i-\sum_{j\in Q(i)}w_{ij}x_j||_2^2

        其中:

             Q(i): 按照欧式距离作为度量, 计算和样本点 x_i最近的的k个最近邻

               w_{ij}: 权重系数为标量,\sum_{j \in Q(i)} w_{ij}=1

       则

         J(W)=\sum_{i=1}^{m}||x_i\sum_{j\in Q(i)}w_{ij}-\sum_{j\in Q(i)}w_{ij}x_j||_2^2

                     =\sum_{i=1}^{m}||\sum_{j\in Q(i)}w_{ij }x_i-\sum_{j\in Q(i)}w_{ij}x_j||_2^2

                     =\sum_i \sum_j ||w_{ij}(x_i-x_j)||_2^2

                    =\sum_i W_i^T(x_i-x_j)(x_i-x_j)^TW_i

          例:

              

         设

                   S_i=(x_i-x_j)(x_i-x_j)^T(对称矩阵)

          则:

                   J(w)=\sum_{i}W_i^TS_iW_i

                加上约束条件

                  W_i^T1_K=1 其中

                      1_k=\begin{bmatrix} 1\\ 1 \\ .. \\ 1 \end{bmatrix} k行全1的列向量

             现在我们将矩阵化的两个式子用拉格朗日子乘法合为一个优化目标:

             L(W_i)=\sum_{j}W_i^TS_iW_i+\lambda(W_i^T1_k-1)

             对W_i求导并令其值为0,我们得到

             2S_iW_i+\lambda 1_k=0(前半部分 利用了S_i的对称性简化了)

            W_i=\frac{-\lambda}{2}(S_i)^{-1}1_k(公式1)

                   =\frac{S_i^{-1}1_k}{1_k^TS_i^{-1}1_k}(公式2)

公式2的解原理 

由约束条件:   W_i^T1_K=1  ,1_k^TW_i=1

已知:            W_i=\frac{-\lambda}{2}(S_i)^{-1}1_k

        则       

       1_k^TW_i=1

        1_k^T\frac{-\lambda}{2}S_i^{-1}1_k=1

         \frac{-\lambda}{2}=1/(1_k^TS_i^{-1}1_k)

     重新带入公式1 ,即得到公式2

          W_i=\frac{S_i^{-1}1_k}{1_k^TS_i^{-1}1_k}


三  低维投影

          我们得到了高维的权重系数W,那么我们希望这些权重系数对应的线性关系在降维后的低维一样得到保持。假设我们的n维样本集{x_1,x_2,...x_m}在低维的d维度对应投影为{z_1,z_2,...z_m}, 则我们希望保持线性关系,也就是希望对应的均方差损失函数最小,即最小化损失函数J(Y)如下:

                 J(z)=\sum_{i=1}^{m}||z_i-\sum_j^{m}w_{ij}z_j||_2^2

  注意:

       低维的损失函数中: 权重系数W已知,目标是求最小值对应的数据z

        W:   是[m,m]矩阵,我们将那些不在邻域位置的W_i的位置取值为0,将W扩充到m×m维度。

一般我们也会加入约束条件如下:

     \sum_{i=1}^{m}z_i=0

     \frac{1}{m}\sum_{i=1}^{m}z_iz_i^T=E: 单位矩阵

3.1 原理推导  

Z\sim R^{d*m}

损失函数为

 J(Z)=\sum_{i=1}^{m}||z_i-\sum_{j}^{m}W_{ij}z_j||_2^2

            =\sum_{i=1}^{m}||ZE_i-ZW_i||_2^2(步骤一)

            =\sum_{i=1}^{m}||Z(E_i-W_i)||_2^2

              =tr(Z(E-W)(E-W)^TZ^T)

备注: 步骤一原理

其中I_i, W_i 为m 行一列的列向量

下面一步推导用到了该知识:

tr(aa^T)=\sum_{i=1}^{m}a_i^2

a=\begin{bmatrix} a_1\\ a_2 \\ .... \\ a_m \end{bmatrix}

设 

M=(E-W)(E-W)^T

J(Z)=tr(ZMZ^T)

加上约束条件,得到拉格朗日函数

L(Z)=tr(ZMZ^T+\lambda(ZZ^T-mE))

对Z 求微分

2MZ^T+2\lambda Z^T=0

MZ^T=\lambda^{'} Z^T

要得到最小的d维数据集,我们需要求出矩阵M最小的d个特征值所对应的d个特征向量组成的矩阵Z=(z_1,z_2,..z_d)

由于M的最小特征值为0不能反应数据特征,此时对应的特征向量为全1。我们通常选择M的第2个到第d+1个最小的特征值对应的特征向量

2.2 为什么M的最小特征值为0呢?

前面知道约束条件: W^Te=1*e,

                                (W^T-E)e=0(注意大E和小e 不一样,前面是单位矩阵,后面是全1的列向量)

                              (E-W^T)e=0

                              (E-W)(E-W^T)e=0*(E-W)=0

                               (E-W)(E-W^T)e=0*e

                            所以最小的特征值为0,对应的特征向量为全1的列向量。

把该最小特征值丢弃

W^T=\begin{bmatrix} W_1^T\\ .... \\ W_i^T\\ ....\\ W_m^T\end{bmatrix}e=\begin{bmatrix} 1\\ 1 \\ ... \\ 1 \end{bmatrix}   W_1^Te=1,W_2^Te=1,..W_i^T=e


四 Python 例子

# -*- coding: utf-8 -*-
"""
Created on Wed Feb  7 17:02:55 2024@author: chengxf2
"""import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import manifold, datasets
from sklearn.utils import check_random_statedef generateData(m = 500):random_state = check_random_state(0)p = random_state.rand(m) * (2 * np.pi - 0.55)t = random_state.rand(m) * np.pi# 让球体不闭合,符合流形定义indices = ((t < (np.pi - (np.pi / 8))) & (t > ((np.pi / 8))))colors = p[indices]x, y, z = np.sin(t[indices]) * np.cos(p[indices]), \np.sin(t[indices]) * np.sin(p[indices]), \np.cos(t[indices])fig = plt.figure()ax = Axes3D(fig, elev=30, azim=-20,auto_add_to_figure=False)fig.add_axes(ax)ax.scatter(x, y, z, c=p[indices], marker='o', cmap=plt.cm.rainbow)plt.show()return x,y,z,colorsdef LLE():x,y,z,colors= generateData()train_data = np.array([x,y,z]).Tprint("\n 高维空间shape",np.shape(train_data))#n_neighbors: 高维空间K邻近选择的点个数#n_components:低维空间的维度#[362,2]trans_data = manifold.LocallyLinearEmbedding(n_neighbors =10, n_components = 2,method='standard').fit_transform(train_data)print("\n 低维空间shape",np.shape(trans_data))size = np.random.rand(363)*100fig = plt.figure()plt.scatter(trans_data[:, 0], trans_data[:, 1],s=size, marker='o',c=colors)LLE()

参考:

15: Unsupervised Learning - Neighbor Embedding_哔哩哔哩_bilibili

https://www.cnblogs.com/pinard/p/6266408.html

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

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

相关文章

「C++ 类和对象篇 10」初始化列表

目录 一、什么是初始化列表&#xff1f; 二、为什么需要初始化列表&#xff1f; 三、初始化列表怎么使用&#xff1f; 3.1 在构造函数中使用初始化列表 3.2 注意 3.3 结论 3.4 应用场景 四、初始化列表的初始化顺序 五、另一种初始化成员变量的方法 【总结】 一、什么是初始化…

C++入门篇(4)—— 类与对象(1)

目录 1.类的引入 2.类的定义 3.类的访问限定符 4.类的作用域 5. 类对象的存储方式 6. this指针 6.1 this指针的引入 6.2 this指针的特性 6.3有意思的面试题 1.类的引入 C语言struct 结构体中只能定义变量&#xff0c;而C中可以定义函数。 struct Date {void Init(int…

vue常用9个事件修饰符

第075个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&a…

vueRouter中Hash模式和History模式有什么区别

VueRouter是Vue.js官方推荐的前端路由库&#xff0c;它提供了一种方便的方式来构建单页应用&#xff08;SPA&#xff09;。在使用VueRouter时&#xff0c;我们可以选择不同的路由模式&#xff0c;其中最常见的是Hash模式和History模式。本文将深入探讨这两种模式的区别&#xf…

逐行拆解Guava限流器RateLimiter

逐行拆解Guava限流器RateLimiter 常见限流算法 计数器法 设置一个时间窗口内允许的最大请求量&#xff0c;如果当前窗口请求数超过这个设定数量&#xff0c;则拒绝该窗口内之后的请求。 关键词&#xff1a;时间窗口&#xff0c;计数器。 举个例子&#xff0c;我们设置1秒钟…

CSS3 基本语法

CSS3 基本语法 1. CSS3 新增长度单位 rem 根元素字体大小的倍数&#xff0c;只与根元素字体大小有关。vw 视口宽度的百分之多少 10vw 就是视口宽度的 10% 。vh 视口高度的百分之多少 10vh 就是视口高度的 10% 。vmax 视口宽高中大的那个的百分之多少。&#xff08;了解即可&am…

JVM相关-JVM模型、垃圾回收、JVM调优

一、JVM模型 JVM内部体型划分 JVM的内部体系结构分为三部分&#xff0c;分别是&#xff1a;类加载器&#xff08;ClassLoader&#xff09;子系统、运行时数据区&#xff08;内存&#xff09;和执行引擎 1、类加载器 概念 每个JVM都有一个类加载器子系统&#xff08;class l…

Spring Batch 批处理框架适配达梦数据库,实现从文件批量读取写入数据库(完整教程)

效果展示(达梦数据库): 技术简介: Spring Batch 是一个基于 Spring 的批处理框架,用于开发和执行大规模、高性能、可靠的批处理应用程序。它提供了丰富的功能和组件,用于处理复杂的批处理任务,例如大数据ETL(Extract-Transform-Load)、数据清洗、数据迁移、报表生成…

C# OCR识别图片中的文字

1、从NuGet里面安装Spire.OCR 2、安装之后&#xff0c;找到安装路径下&#xff0c;默认生成的packages文件夹&#xff0c;复制该文件夹路径下的 6 个dll文件到程序的根目录 3、调用读取方法 OcrScanner scanner new OcrScanner(); string path "C:\1.png"; scann…

React18原理: Fiber架构下的单线程CPU调度策略

概述 React 的 Fiber 架构, 它的整个设计思想就是去参考CPU的调度策略CPU现在都是多核多进程的&#xff0c;重点研究的是 CPU是单核单线程&#xff0c;它是如何调度的?为什么要去研究单线程的CPU&#xff1f; 浏览器中的JS它是单线程的JS 的执行线程和浏览器的渲染GUI 是互斥…

缺省参数(c++)

void fun(int a0) { cout<<a<<endl; } 当我们调用函数时: fun(10) 输出10; fun&#xff08;&#xff09; 未传参时&#xff1a; 输出0; 未传参时a就会接受0&#xff0c;相当于这个0就是“备胎” 传参了0就没有用 全缺省 void fun2(int a10,int b3,int…

为什么无法正常访问TikTok?该使用跨境专线吗?

TikTok作为全球范围内备受欢迎的社交媒体平台&#xff0c;吸引了数以亿计的用户。然而&#xff0c;有时候用户可能会遇到无法正常访问TikTok的问题&#xff0c;这可能涉及到多方面的因素。本文将深入探讨为什么可能无法正常访问TikTok&#xff0c;并考虑是否使用 TikTok跨境专线…

使用vue-client-only 解决组件不兼容SSR问题

目录 前言 一、解决方案 1.基于Nuxt 框架的SSR应用 2.基于vue2框架的应用 3.基于vue3框架的应用 二、总结 往期回顾 前言 最近在我的单页面SSR应用上开发JSON编辑器功能&#xff0c;在引入组件后直接客户端跳转OK&#xff0c;但是在直接加载服务端渲染的时候一直报这…

ADMap:Anti-disturbance framework for reconstructing online vectorized HD map

参考代码&#xff1a;ADMap 动机与出发点 局部地图构建算法在实际中会遇到部分车道线偏离的或是错误的情况&#xff0c;这往往是全局信息获取上存在欠缺&#xff0c;毕竟地图元素的回归很依赖于全局信息的获取。那么从特征提取、attention layer设计和loss构建上可以做一些工作…

visual studio和cmake如何编译dlib库

官网 dlib C Library 对应的是最新版本&#xff0c;只能用到vs2015版本及以后 如果使用vs2013&#xff0c;所以需要下载vs2013可用的版本。 就是说dlib版本与vs版本有对应关系 所有版本 dlib C Library - Browse /dlib at SourceForge.net Releases davisking/dlib GitHu…

Go语言每日一练——链表篇(八)

传送门 牛客面试笔试必刷101题 ----------------两个链表的第一个公共结点 题目以及解析 题目 解题代码及解析 解析 这一道题使用的还是双指针算法&#xff0c;我们先求出两个链表的长度差n&#xff0c;然后定义快慢指针&#xff0c;让快指针先走n步&#xff0c;最后快慢指…

【数学建模】【2024年】【第40届】【MCM/ICM】【B题 搜寻潜水器】【解题思路】

一、题目 &#xff08;一&#xff09;赛题原文 2024 MCM Problem A: Resource Availability and Sex Ratios Maritime Cruises Mini-Submarines (MCMS), a company based in Greece, builds submersibles capable of carrying humans to the deepest parts of the ocean. A …

app逆向-⽹络请求库okhttp3

文章目录 一、前言二、应用1、添加权限AndroidManifest.xml2、添加依赖okhttp33、编写界面文件activity_main.xml4、编写Activity代码 三、效果 一、前言 OkHttp是由Square公司开发的用于Java和Android的开源HTTP客户端库。它被广泛用于在Java和Android应用程序中进行HTTP请求…

结构体数组所有元素(1亿个元素)初始化为相同的值

一个结构体数组&#xff0c;有1亿个元素&#xff0c;每个元素都要初始化为相同的值&#xff0c;如果没有现成的语法直接支持这样的初始化操作&#xff0c;就得用for循环写&#xff0c;会不会非常耗时&#xff1f; 如果结构体里的成员都是一些简单的基本数据类型&#xff0c;整…

小游戏和GUI编程(5) | SVG图像格式简介

小游戏和GUI编程(5) | SVG图像格式简介 0. 问题 Q1: SVG 是什么的缩写&#xff1f;Q2: SVG 是一种图像格式吗&#xff1f;Q3: SVG 相对于其他图像格式的优点和缺点是什么&#xff1f;Q4: 哪些工具可以查看 SVG 图像&#xff1f;Q5: SVG 图像格式的规范是怎样的&#xff1f;Q6…