机器学习之SVD奇异值分解实现图片降维
SVD奇异值分解实现图片降维
目录
- SVD奇异值分解实现图片降维
- 1 SVD奇异值分解
- 1.1 概念
- 1.2 基本步骤
- 1.2.1 矩阵分解
- 1.2.2 选择奇异值
- 1.2.3 重建矩阵
- 1.2.4 降维结果
- 1.3 优缺点
- 1.3.1 优点
- 1.3.2 缺点
- 2 函数
- 2.1 函数导入
- 2.2 函数参数
- 2.3 返回值
- 2.4 通过 k 个奇异值降维
- 3 实际测试
- 3.1 原图数据
- 3.2 代码测试
1 SVD奇异值分解
1.1 概念
SVD(奇异值分解)降维是一种常用的线性降维方法,在数据科学和机器学习中有着广泛的应用。SVD的主要思想是将一个矩阵分解为三个矩阵的乘积,通过保留最重要的奇异值和对应的奇异向量,来近似原矩阵,从而达到降维的目的。
1.2 基本步骤
1.2.1 矩阵分解
给定一个m * n 的数据矩阵A,SVD将其分解为三个矩阵的乘积:
A = U*Σ *V^T
其中:
- U是一个m * n 的正交矩阵,其列向量称为左奇异向量。
- Σ是一个m * n的对角矩阵,对角线上的非负数称为奇异值,按从大到小的顺序排列。
- V^T是m * n的正交矩阵的转置,其行向量称为右奇异向量。
1.2.2 选择奇异值
奇异值在对角矩阵Σ中从大到小排列,前面的几个奇异值往往包含了矩阵中大部分的信息。通过选择前 k 个最大的奇异值( k 小于矩阵的秩),可以保留矩阵的主要特征。
1.2.3 重建矩阵
选择前k个奇异值后,可以构造一个新的对角矩阵Σk,只包含这k 个最大的奇异值,其他位置为零。然后使用U 和V 的前k 个列向量来重建矩阵:
Ak = Uk*Σk *Vk^T
其中Uk和 Vk分别是由U和 V 的前k 个列向量组成的矩阵。
1.2.4 降维结果
矩阵 Ak 即为降维后的矩阵,其维度为 m * n 降低到了m * k 。通常情况下, k 远小于 n,因此达到了降维的效果。
在使用SVD降维时,选择合适的k 非常关键,这通常需要通过实验来确定,以便在降维和保留信息之间找到平衡。
1.3 优缺点
1.3.1 优点
- 信息保留能力:SVD能够有效地提取数据的主要特征,通过保留最大的奇异值,可以最大程度地保留原始数据的方差信息。
- 灵活性:SVD降维不依赖于数据的分布,对于多种类型的数据都适用,包括非负数据、稀疏数据等。
- 简化模型:通过减少特征的数量,SVD可以帮助简化机器学习模型,减少计算量,提高模型的泛化能力,减少过拟合的风险。
- 易于理解:SVD的数学原理相对直观,分解后的奇异值和奇异向量能够提供数据结构的直观解释。
- 稳定性:SVD是一种稳定的算法,对于小的数据扰动,其结果不会产生大的变化。
1.3.2 缺点
- 计算复杂度高:对于大型矩阵,SVD的计算复杂度较高,尤其是当矩阵的维度很高时,计算时间和空间复杂度都会显著增加。
- 不适合非线性数据:SVD是一种线性降维方法,对于非线性结构的数据,其降维效果可能不如非线性降维方法(如t-SNE、Isomap等)。
- 对噪声敏感:虽然SVD相对稳定,但在某些情况下,小的奇异值可能反映了噪声或异常值,这可能导致降维过程中噪声被放大。
- 数据量要求:SVD需要将整个数据集加载到内存中进行处理,对于非常大的数据集,这可能是一个挑战。
- 特征解释性:虽然SVD可以提供数据结构的解释,但分解后的特征可能不如原始特征直观,这可能会降低模型的可解释性。
- 需要选择奇异值数量:在使用SVD降维时,需要手动或通过交叉验证等方法选择保留的奇异值数量(即降维后的维度),这个选择过程可能需要多次尝试,并且可能对最终结果有较大影响。
总的来说,SVD降维是一个强大的工具,特别适用于需要保留数据主要方差特征的场景。然而,它的应用也受到一些限制,特别是当处理大规模数据集或非线性结构的数据时。
2 函数
2.1 函数导入
from numpy.linalg import svd
2.2 函数参数
- 默认值:a, full_matrices=True, compute_uv=True, hermitian=False,一般输入a参数,其他默认
a
:一个形状为(M, N)的数组,需要被分解的矩阵。- full_matrices:布尔值,可选,默认为True。
- 如果为True,则U和V*的形状分别是(M, M)和(N, N),奇异值将被填充为一个(M, N)的对角矩阵。
- 如果为False,则U和V*的形状分别是(M, K)和(K, N),其中K = min(M, N),奇异值仍然是一个(K, )的数组。
- compute_uv:布尔值,可选,默认为True。
- 如果为True,则计算U和V*。
- 如果为False,则只计算奇异值,不计算U和V*。
- hermitian:布尔值,可选,默认为False。
- 这个参数在NumPy的较新版本中已经废弃,不再推荐使用。它用于指定矩阵是否为厄米特矩阵(即共轭转置等于自身的矩阵)。如果为True,则函数计算的是矩阵的 eigendecomposition 而非 SVD。
2.3 返回值
该函数返回三个数组:
U
:形状为(M, M)或(M, K)的数组,取决于full_matrices
参数,包含了左奇异向量。s
:形状为(K, )的数组,包含了矩阵的奇异值,奇异值是按降序排列的。Vh
:形状为(N, N)或(K, N)的数组,取决于full_matrices
参数,包含了右奇异向量的共轭转置。
2.4 通过 k 个奇异值降维
代码展示:
def pic_compress(k,pic_array):global u,sigma,vt,sig,new_pic# pic_array为数组u,sigma,vt = svd(pic_array)# 创建一个对角矩阵,对角线上的元素是前k个奇异值sig = np.eye(k) * sigma[:k]# 通过奇异值分解重构图像,只使用前k个奇异值new_pic = np.dot(np.dot(u[:,:k],sig),vt[:k,:])# 计算压缩后图像的大小size = u.shape[0] * k + sig.shape[0] * sig.shape[1] + k * vt.shape[1]# 返回重构后的图像和其大小return new_pic,size
3 实际测试
3.1 原图数据
3.2 代码测试
代码展示:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from numpy.linalg import svddef pic_compress(k,pic_array):global u,sigma,vt,sig,new_picu,sigma,vt = svd(pic_array)# 创建一个对角矩阵,对角线上的元素是前k个奇异值sig = np.eye(k) * sigma[:k]# 通过奇异值分解重构图像,只使用前k个奇异值new_pic = np.dot(np.dot(u[:,:k],sig),vt[:k,:])# 计算压缩后图像的大小size = u.shape[0] * k + sig.shape[0] * sig.shape[1] + k * vt.shape[1]# 返回重构后的图像和其大小return new_pic,sizeimg = Image.open('at1_gry.png')
ori_img = np.array(img)
new_img,size = pic_compress(50,ori_img)
print(f'original size:{ori_img.shape[0]*ori_img.shape[1]}')
print(f'compress size:{size}')
# 创建一个包含两个子图的图形
fig,ax = plt.subplots(1,2)
# 在第一个子图中显示原始图像
ax[0].imshow(ori_img,cmap='gray')
# 设置第一个子图的标题为before compress
ax[0].set_title('before compress')
ax[1].imshow(ori_img,cmap='gray')
ax[1].set_title('after compress')
plt.show()
运行结果:
可以看到降维后图片比降维前模糊
相关文章:
机器学习之SVD奇异值分解实现图片降维
SVD奇异值分解实现图片降维 目录 SVD奇异值分解实现图片降维1 SVD奇异值分解1.1 概念1.2 基本步骤1.2.1 矩阵分解1.2.2 选择奇异值1.2.3 重建矩阵1.2.4 降维结果 1.3 优缺点1.3.1 优点1.3.2 缺点 2 函数2.1 函数导入2.2 函数参数2.3 返回值2.4 通过 k 个奇异值降维 3 实际测试3…...
基于.Net Core+Vue的文件加密系统
1系统架构图 2 用例图 管理员角色的用例: 文件分享大厅:管理员可以访问文件分享大厅,下载文件。个人信息管理:管理员可以更新自己的个人信息,修改密码。用户管理:管理员负责创建、更新或删除用户账户&…...
数据结构(链表 哈希表)
在Python中,链表和哈希表都是常见的数据结构,可以用来存储和处理数据。 链表是一种线性数据结构,由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表可以用来实现栈、队列以及其他数据结构。Python中可…...
1161 Merging Linked Lists (25)
Given two singly linked lists L1a1→a2→⋯→an−1→an and L2b1→b2→⋯→bm−1→bm. If n≥2m, you are supposed to reverse and merge the shorter one into the longer one to obtain a list like a1→a2→bm→a3→a4→bm−1⋯. For ex…...
第23篇 基于ARM A9处理器用汇编语言实现中断<五>
Q:怎样修改HPS Timer 0定时器产生的中断周期? A:在上一期实验的基础上,可以修改按键中断服务程序,实现红色LED上的计数值递增的速率,主程序和其余代码文件不用修改。 实现以下功能:按下KEY0…...
VS Code--常用的插件
原文网址:VS Code--常用的插件_IT利刃出鞘的博客-CSDN博客 简介 本文介绍VS Code(Visual Studio Code)常用的插件。 插件的配置 默认情况下,插件会放到这里:C:\Users\xxx\.vscode\extensions 修改插件位置的方法 …...
数智化转型 | 星环科技Defensor 助力某银行数据分类分级
在数据驱动的金融时代,数据安全和隐私保护的重要性日益凸显。某银行作为数字化转型的先行者,面临着一项艰巨的任务:如何高效、准确地对分布在多个业务系统、业务库与数仓数湖中的约80万个字段进行数据分类和分级。该银行借助星环科技数据安全…...
【md文档】公式简单介绍
在Markdown文档中,可以使用LaTeX语法来插入数学公式。以下是一些常见的LaTeX公式示例及其在Markdown中的写法: 1. 行内公式 行内公式使用单个美元符号 $ 包裹。 ‘’’ 这是一个行内公式:$E mc^2$效果: 这是一个行内公式&…...
macOS Sequoia 15.3 beta3(24D5055b)发布,附黑、白苹果镜像下载地址
“ 镜像(黑苹果引导镜像、白苹果Mac镜像、黑苹果虚拟机镜像)下载地址:黑果魏叔官网。” 关于macOS Sequoia 15.3 beta3(24D5055b),以下是对其的详细介绍: 一、版本发布信息 发布时间 …...
HTML学习笔记(4)
目录 一、背景相关样式 二、定位position 三、javascript 1、变量的定义 2、数据类型 3、绑定事件 一、背景相关样式 background-image: url(); // 背景图片 background-repeat: repeat; // 背景图片是否平铺 no-repeat background-size: 200px; // 背景图片尺寸 cover把…...
密钥轮换时,老数据该如何处理
密钥轮换时是否需要重新加密老数据,取决于具体的加密策略和密钥管理系统的设计。以下是两种常见情况及处理方式: 1. 密钥轮换不涉及重新加密老数据 场景:如果密钥轮换仅用于新数据的加密,而老数据仍使用旧密钥解密。 处理方式&a…...
Django框架:python web开发
1.环境搭建: (a)开发环境:pycharm (b)虚拟环境(可有可无,优点:使用虚拟环境可以把使用的包自动生成一个文件,其他人需要使用时可以直接选择导入包ÿ…...
RCD-IoT:在高数据包传输率下,利用资源受限设备实现工业监测与控制
论文标题 中文:RCD-IoT:在高数据包传输率下,利用资源受限设备实现工业监测与控制 英文:RCD-IoT: Enabling Industrial Monitoring and Control with Resource-Constrained Devices Under High Packet Transmission Rates 作者信…...
LabVIEW实车四轮轮速信号再现系统
开发了一个基于LabVIEW的实车四轮轮速信号再现系统。该系统解决现有电机驱动传感器成本高、重复性差、真实性差和精度低等问题,提供一种高精度、低成本的轮速信号再现解决方案。 项目背景 ABS轮速传感器在现代汽车安全系统中发挥着至关重要的作用。为保证其准确性和…...
【Vim Masterclass 笔记16】S07L32 + L33:同步练习09 —— 掌握 Vim 宏操作的六个典型案例(含点评课内容)
文章目录 S07L32 Exercise 09 - Macros1 训练目标2 操作指令2.1. 打开 macros-practice.txt 文件2.2. 练习1:将旧版 Python 代码转换为新版写法2.3. 练习2:根据列表内容批量创建 Shell 脚本2.4. 练习3:对电话号码作格式化处理2.5. 练习4&…...
LabVIEW 实现线路板 PCB 可靠性测试
在电子设备制造领域,线路板 PCB(Printed Circuit Board)的可靠性直接影响产品的整体性能和使用寿命。企业在生产新型智能手机主板时,需要对 PCB 进行严格的可靠性测试,以确保产品在复杂环境下能稳定运行。传统的测试方…...
深入内核讲明白Android Binder【二】
深入内核讲明白Android Binder【二】 前言一、Binder通信内核源码整体思路概述1. 客户端向服务端发送数据流程概述1.1 binder_ref1.2 binder_node1.3 binder_proc1.4 binder_thread 2. 服务端的binder_node是什么时候被创建的呢?2.1 Binder驱动程序为服务创建binder…...
TextButton组件的功能与用法
文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了CircleAvatar Widget,本章回中将介绍Button这种Widget,闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 关于Button相信大家都很熟悉,也就是我们常用的按钮。用户按下按钮后…...
HTML5+Canvas实现的鼠标跟随自定义发光线条源码
源码介绍 HTML5Canvas实现的鼠标跟随自定义发光线条特效源码非常炫酷,在黑色的背景中,鼠标滑过即产生彩色变换的发光线条效果,且线条周围散发出火花飞射四溅的粒子光点特效。 效果预览 源码如下 <!DOCTYPE html PUBLIC "-//W3C//D…...
AS自治系统
引言 通过前几天的学习,我们基本了解了静态路由,有静态就肯定有动态,那他们又有哪些区别呢? 静态路由:由网络管理员手工填写的路由信息。动态路由:所有路由器运行相同路由协议,之后,…...
PyQt6 与 REST API:如何实现桌面应用与 Web 服务的无缝对接
PyQt6 与 REST API:如何实现桌面应用与 Web 服务的无缝对接 今日水一篇 在当今互联网时代,数据交互无处不在。桌面应用与 Web 服务的结合,能够为用户提供更丰富、更实时的功能体验。本文将介绍如何利用 PyQt6 实现桌面应用与 REST API 的无…...
endnote x9 如何将参考文献和文中的应用格式由annotated变为编码,例[1],[2]
在 EndNote X9 中,将参考文献和文中引用格式更改为编码形式(如 [1], [2])需要以下步骤: 1. 选择合适的输出样式 打开 EndNote X9。点击菜单栏的 "Edit" > "Output Styles" > "Open Style Manage…...
题解 CodeForces 430B Balls Game 栈 C/C++
题目传送门: Problem - B - Codeforceshttps://mirror.codeforces.com/contest/430/problem/B翻译: Iahub正在为国际信息学奥林匹克竞赛(IOI)做准备。有什么比玩一个类似祖玛的游戏更好的训练方法呢? 一排中有n个球…...
管理口令安全和资源(二)
DBMS_METADATA DBMS_METADATA 是 Oracle 数据库中的一个包,它提供了用于管理数据库元数据的工具和过程。元数据是关于数据的数据,它描述了数据库的结构,包括表、视图、索引、存储过程、用户和其他数据库对象的信息。DBMS_METADATA 包允许用户…...
【漏洞预警】FortiOS 和 FortiProxy 身份认证绕过漏洞(CVE-2024-55591)
文章目录 一、产品简介二、漏洞描述三、影响版本四、漏洞检测方法五、解决方案 一、产品简介 FortiOS是Fortinet公司核心的网络安全操作系统,广泛应用于FortiGate下一代防火墙,为用户提供防火墙、VPN、入侵防御、应用控制等多种安全功能。 FortiProxy则…...
Cadence笔记--原理图导入PCB
1、以PMU6050为例,首先在原理图双击PMU6050器件,在PCB_Footprint目录填写PCB封装名称并且保存,如下图所示: 2、确保原理图命名的名称不一样,否则会出错,这里PMU6050更改了NC等名称,如下图所示&a…...
TOSUN同星TsMaster使用入门——3、使用系统变量及c小程序结合panel面板发送报文
本篇内容将介绍TsMaster中常用的Panel面板控件以及使用Panel控件通过系统变量以及c小程序来修改信号的值,控制报文的发送等。 目录 一、常用的Panel控件介绍 1.1系统——启动停止按钮 1.2 显示控件——文本框 1.3 显示控件——分组框 1.4 读写控件——按钮 1.…...
Redis 缓存穿透、击穿、雪崩 的区别与解决方案
前言 Redis 是一个高性能的键值数据库,广泛应用于缓存、会话存储、实时数据分析等场景。然而,在高并发的环境下,Redis 缓存可能会遇到 缓存击穿、缓存穿透 和 缓存雪崩 这三大问题。这些问题不仅影响系统的稳定性和性能,还经常出…...
用Cursor生成一个企业官网前端页面(生成腾讯、阿里官网静态页面)
用Cursor生成一个企业官网前端页面 第一版: <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...
北京市房屋建筑物轮廓shp数据arcgis高度字段内容下载分析
标题中的“北京市房屋建筑物轮廓shp数据arcgis高度字段”涉及到的是地理信息系统(GIS)中的数据格式和属性字段。在GIS领域,SHP(Shapefile)是一种常见的矢量数据格式,用于存储地理空间特征,如点、…...
深度学习常见术语解释
正例与负例: 在分类任务中,通常将目标类别称为正例(positive),非目标类别称为负例(negative)。 True Positives(TP): 被正确地划分为正例的个数,…...
《内网穿透:网络拓展与安全防护的平衡艺术》
一、引言:开启内网穿透的大门 在当今数字化浪潮席卷全球的时代,网络已成为人们生活和工作中不可或缺的一部分。我们日常使用的网络,如同一个庞大而复杂的生态系统,其中内网和外网犹如两个相互关联却又有所区别的世界。 想象一下…...
文件读取和输入输出
文件指针 在C语言中,文件操作是通过文件指针来进行的。文件指针是一个指向 FILE 结构的指针,用于标识和操作一个文件。 FILE *fp; 常用的文件操作函数 fopen:打开文件。fclose:关闭文件。fread:从文件中读取数据。…...
【Linux系列】查看服务器是否使用了 SSD 的多种方法
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
基础入门-传输加密数据格式编码算法密文存储代码混淆逆向保护安全影响
知识点: 1、传输格式&传输数据-类型&编码&算法 2、密码存储&代码混淆-不可逆&非对称性 一、演示案例-传输格式&传输数据-类型&编码&算法 传输格式 JSON XML WebSockets HTML 二进制 自定义 WebSockets:聊天交互较常…...
通过idea创建的springmvc工程需要的配置
在创建的spring mvc工程中,使用idea开发之前需要配置文件包括porm.xml、web.xml、springmvc.xml 1、porm.xml 工程以来的spring库,主要包括spring-aop、spring-web、spring-webmvc,示例配置如下: <project xmlns"http:/…...
PyTest自学-认识PyTest
1 PyTest自学-认识PyTest 1.1 PyTest可以用来做什么? PyTest是一个自动化测试框架,支持单元测试和功能测试,有丰富的插件,如,pytest-selemium, pytest-html等。 1.2 安装pytest 使用pip install -U pytest。 1.3 py…...
JavaScript系列(31)--装饰器详解
JavaScript装饰器详解 🎨 今天,让我们深入探讨JavaScript的装饰器(Decorators)。装饰器是一种用于修改类和类成员的强大语言特性,它让我们能够以声明式的方式增强类的功能。 装饰器基础概念 🌟 …...
培养未来:2024年少儿编程教育的实践与思考
目录 引言 : 正文: 一、Scratch教学的深化 二、代码编程的多样化 三、赛教融合驱动 四、社区互动与共同成长 结语 : 引言 : 在快速发展的科技时代,编程教育作为培养未来技术人才的重要环节,不断经历…...
ComfyUI-PromptOptimizer:文生图提示优化节点
ComfyUI-PromptOptimizer 是 ComfyUI 的一个自定义节点,旨在优化文本转图像模型的提示。它将用户输入的提示转换为更详细、更多样化、更生动的描述,使其更适合生成高质量的图像。无需本地模型。 1、功能 提示优化:优化用户输入的提示以生成…...
用户中心项目教程(三)---再谈nvm,nodejs和神器Geek
目录 1.昨日回顾 2.nodejs&&nvm使用 2.1问题抛出 2.2解决方案 3.geek的使用 3.1页面展示 3.2下载链接 3.3如何使用 4.按照官方文档操作 4.1官方文档 4.2我的演示 4.3可能出现的问题 1.昨日回顾 我依稀记得昨天的时候关于这个umi3相关的兼容性问题导致的这个…...
CSS布局新视角:BFC(块级格式化上下文)的作用与优势
在CSS布局的世界中,BFC(Block Formatting Context,块级格式化上下文)是一个既重要又神秘的概念。它不仅是解决复杂布局问题的关键工具,也是提升页面性能和用户体验的重要手段。本文将从新视角出发,深入探讨…...
智能化植物病害检测:使用深度学习与图像识别技术的应用
植物病害一直是农业生产中亟待解决的问题,它不仅会影响作物的产量和质量,还可能威胁到生态环境的稳定。随着人工智能(AI)技术的快速发展,尤其是深度学习和图像识别技术的应用,智能化植物病害检测已经成为一…...
Spring Boot Actuator 详细介绍
Spring Boot Actuator 详细介绍 1. 简介 Spring Boot Actuator 是 Spring Boot 提供的一个用于监控和管理应用程序的强大功能模块。它可以帮助我们了解应用程序的运行状况、指标收集、环境信息、日志级别管理等。 2. 添加依赖 2.1 在 pom.xml 中添加以下依赖: …...
微软确认Win10停更不碍Microsoft 365使用!未来是否更新成谜
快科技1月17日消息,微软澄清了关于Windows 10停止支持后Microsoft 365办公套件使用情况的误解。 前两天微软更新支持文档,表示2025年10月14日Windows 10停止支持之后,Microsoft 365应用程序将不再支持Windows 10设备,引发用户担忧…...
uniapp 微信小程序 editor 富文本编辑器
<view class"inp boxsizing"><view class"contentBox"><!-- 富文本编辑器 --><view classwrapper><view classtoolbar tap"format"><view :class"formats.bold ? ql-active : " class"iconfon…...
数据结构学习笔记——排序
排序 1. 排序相关概念 稳定性:关键字相同的数据记录,排序后相对顺序仍保持不变 例如,两个25,在排序完后,有*的25仍在后方,说明该排序算法是稳定的 内部排序:数据元素全部放在内存中的排序 外…...
CSS 样式 margin:0 auto; 详细解读
一、基本语法 margin 属性是用于设置元素的外边距,它可以接受一个、两个、三个或四个值。 margin:0 auto 是一种简洁的写法,其中包含了两个值。 二、值的含义 第一个值 0 表示元素的上下外边距为 0。这意味着该元素的顶部和底部与相邻元素或父元素之间…...
leetcode24-两两交换链表中的节点
leetcode 24 思路 本题仍然引入虚拟头节点来实现会更加简单,因为不用单独考虑对于头节点进行交换的场景对于边界条件考虑更少,交换的步骤按照下图中的步骤来 首先将dummy->22->11->3 但是在第一步的时候,dummy->2,…...
项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(六)
文章目录 一、考试管理模块实现1、添加考试功能实现1.1 页面设计1.2 前端功能实现1.3 后端功能实现1.4 效果展示2、考试管理功能实现2.1 页面设计2.2 前端功能实现2.3 后端功能实现2.3.1 后端查询接口实现2.3.2 后端编辑接口实现2.3.3 后端删除接口实现2.4 效果展示二、代码下载…...