【机器学习入门 】支持向量机

系列文章目录

第1章 专家系统
第2章 决策树
第3章 神经元和感知机
识别手写数字——感知机
第4章 线性回归
第5章 逻辑斯蒂回归和分类


前言

支持向量机(Support Vector Machine) 于1995年发表,由于其优越的性能和广泛的适用性,成为机器学习的主流技术,并成为解决一般性分类问题的首选方法之一。

支持向量机的发明来源于对分类器决策边界的考察。对于线性可分的两类数据点,有很多条不同的直线可以作为分类的决策边界。有的边界距离两侧或者某一侧的数据点比较近,而有的边界距离两侧的数据点都比较远。在这两种边界中,后者是更好的分类边界。它离所有样本点都更远,可以在两类数据点之间形成更宽的分隔带。样本点落在边界附近的概率相对较低,尤其是那些没有在训练样本集中出现过的未知数据点,这样的决策边界具有更优秀的泛化能力,更有可能对它们进行正确分类。反之,如果决策边界距离已知的训练样本很近,那么,数据点就有更大概率落在边界上或者边界附近,错误分类的概率就会大大增加,相应的泛化能力就会下降。因此,支持向量机的目标是寻找最宽的分隔带

线性可分

下面是看浙大机器学习网课时所作的一点笔记。
在这里插入图片描述
在这里插入图片描述

支持向量机的优化问题

对于某个编号为 i i i的样本点 x i x_i xi,线性分类器如何进行分类决策呢?下面我们把逻辑斯蒂回归或者感知机分类的过程用几何语言描述一下。如下图所示,取一个从原点发出的向量 ω \omega ω,使之垂直于决策边界。样本 x i x_i xi,也可以视作一个从原点发出的向量。那么,样本 x i x_i xi属于哪个类别,或者说落在决策边界的哪一边,取决于它在 ω \omega ω方向上的投影长度 ω ⋅ x i / ∣ ∣ ω ∣ ∣ \omega\cdot x_i/||\omega|| ωxi/∣∣ω∣∣。由于我们只关心投影的相对长度,因此,可以忽略向量 ω \omega ω的长度 ∣ ∣ ω ∣ ∣ ||\omega|| ∣∣ω∣∣,直接使用点积 ω ⋅ x i \omega \cdot x_i ωxi,然后选取常量 b b b作为分割点,这样就得到了判别 x i x_i xi类别的决策规则。
·当 ω ⋅ x i + b ≥ 0 \omega \cdot x_i+b≥0 ωxi+b0时, x i x_i xi是正样本;
·当 ω ⋅ x i + b < 0 \omega \cdot x_i+b<0 ωxi+b<0时, x i x_i xi是负样本。
在这里插入图片描述
下面,给决策规则增加限制,使得决策边界有一定的宽度,而不是无宽度的直线。

·如果 x i x_i xi是正样本,我们要求 ω ⋅ x i + b ≥ 1 \omega \cdot x_i+b\ge1 ωxi+b1
·如果 x i x_i xi是负样本,我们要求 ω ⋅ x i + b ≤ − 1 \omega \cdot x_i+b\le-1 ωxi+b1
引入标记变量 y i y_i yi,对于正样本 y i = 1 y_i=1 yi=1,对于负样本 y i = − 1 y_i=-1 yi=1
于是上面的规则可以改写为,对于任何样本 ( x i , y i ) (x_i,y_i) (xi,yi) y i ( ω ⋅ x i + b ) − 1 ≥ 0 y_i(\omega \cdot x_i+b)-1\ge0 yi(ωxi+b)10
而对于落在分隔带边缘上的样本, y i ( ω ⋅ x i + b ) − 1 = 0 y_i(\omega \cdot x_i+b)-1=0 yi(ωxi+b)1=0。我们称这些样本点为支持向量
根据支持向量,我们还可以计算出分隔带的宽度。假设有一个正样本支持向量 x + x_+ x+,一个负样本支持向量 x − x_- x,分隔带的宽度就是这两个向量在 ω \omega ω方向上的投影长度之差,即 2 / ∣ ∣ ω ∣ ∣ 2/||\omega|| 2/∣∣ω∣∣
( x + − x − ) ⋅ w ∥ w ∥ = ( 1 − b ) − ( − 1 − b ) ∥ w ∥ = 2 ∥ w ∥ \begin{aligned} & \left(\boldsymbol{x}_{+}-\boldsymbol{x}_{-}\right) \cdot \frac{\boldsymbol{w}}{\|\boldsymbol{w}\|} \\ = & \frac{(1-b)-(-1-b)}{\|\boldsymbol{w}\|} \\ = & \frac{2}{\|\boldsymbol{w}\|} \end{aligned} ==(x+x)www(1b)(1b)w2
支持向量机的目标是最大化分隔带的宽度,也就是最小化 ∥ ω ∥ \left \| \omega \right \| ω,为了数学上计算方便,我们将目标设定为最小化 1 2 ∥ ω ∥ 2 \frac{1}{2}{\left \| \omega \right \|}^2 21ω2
这是一个带有约束条件的最优化问题。
约束条件是对于所有样本 y i ( ω ⋅ x i + b ) − 1 ≥ 0 y_i(\omega \cdot x_i+b)-1 \ge 0 yi(ωxi+b)10。对于有约束条件的最优化问题,需要采用拉格朗日乘子法。

拉格朗日乘子法

拉格朗日乘子法可以将有约束的最优化问题,转化为无约束的最优化问题。
假设要优化的目标函数是 f ( x ) f(x) f(x),对于有多个约束条件的情况,设第 i i i个约束条件为 g ( x ) i = 0 g(x)_i=0 g(x)i=0(不等式约束的情况类似),可以最终转化为无约束优化 L ( x , α ) = f ( x ) + ∑ i α i g i ( x ) L(x,\alpha)=f(x)+\sum_{i}{\alpha_i g_i(x)} L(x,α)=f(x)+iαigi(x)
支持向量机的优化目标: 1 2 ∥ ω ∥ 2 \frac{1}{2}{\left \| \omega \right \|}^2 21ω2
约束条件不妨换成 1 − y i ( ω ⋅ x i + b ) ≤ 0 1-y_i(\omega \cdot x_i+b) \le 0 1yi(ωxi+b)0
根据拉格朗日乘子法,优化的目标变为最小化如下函数 L L L:
L ( ω , b , α ) = 1 2 ∥ ω ∥ 2 + ∑ i α i [ 1 − y i ( ω ⋅ + b ) ] L(\omega,b,\alpha) = \frac{1}{2} \left \| \omega \right \| ^2 + \sum_{i}^{} {\alpha_i\left [ 1-y_i\left ( \omega \cdot + b \right ) \right ] } L(ω,b,α)=21ω2+iαi[1yi(ω+b)]
支持向量机优化问题的KKT条件如下:
{ y i ( w ⋅ x i + b ) − 1 ⩾ 0 α i ⩾ 0 α i [ y i ( w ⋅ x i + b ) − 1 ] = 0 \left\{\begin{array}{l} y_{i}\left(\boldsymbol{w} \cdot \boldsymbol{x}_{i}+b\right)-1 \geqslant 0 \\ \alpha_{i} \geqslant 0 \\ \alpha_{i}\left[y_{i}\left(\boldsymbol{w} \cdot \boldsymbol{x}_{i}+b\right)-1\right]=0 \end{array}\right. yi(wxi+b)10αi0αi[yi(wxi+b)1]=0
观察这些条件,可以发现,只有当样本位于分隔带边缘时,才有 y i ( ω ⋅ x i + b ) − 1 = 0 y_i(\omega \cdot x_i+b)-1 = 0 yi(ωxi+b)1=0,这些样本就是支持向量。对于其他样本, y i ( ω ⋅ x i + b ) − 1 > 0 y_i(\omega \cdot x_i+b)-1 \gt 0 yi(ωxi+b)1>0,也就是说,对于非支持向量,必须有 α i = 0 \alpha_i=0 αi=0。因此,只有当 x i x_i xi是支持向量的时候,才有 α i ≠ 0 \alpha_i\ne0 αi=0
支持向量机产生的模型仅与支持向量有关。
下面,对目标函数 L L L求导数,令导数等于0,进行求解。
∂ L ∂ ω = ω − ∑ i α i y i x i = 0 ∂ L ∂ b = − ∑ i α i y i = 0 \frac{\partial L}{\partial \omega} = \omega - \sum_{i}{\alpha_iy_ix_i} = 0 \\ \frac{\partial L}{\partial b} = - \sum_{i}{\alpha_iy_i} =0 ωL=ωiαiyixi=0bL=iαiyi=0
即:
ω = ∑ i α i y i x i 0 = ∑ i α i y i \omega = \sum_{i}{\alpha_iy_ix_i} \\ 0 = \sum_{i}{\alpha _iy_i} ω=iαiyixi0=iαiyi
将上面两个结果代入目标函数,从中消去 ω \omega ω b b b,得到下面新的目标函数。
L = ∑ i α i − ∑ i ∑ j α i α j y i y j x i x j L=\sum_{i}\alpha_i-\sum_{i }^{} \sum_{j}^{} \alpha_i \alpha_j y_i y_j \mathbf{ x_i x_j} L=iαiijαiαjyiyjxixj
由于仅剩下变量 α \alpha α,因此,这是一个二次规划问题,可以使用各种数值优化方法和通用的二次规划问题来解决它。
求解出 α \alpha α后,就可以得到 ω \omega ω b b b,以及模型的分类判别函数。
ω ⋅ x + b = ∑ i α i ⋅ y i ⋅ x i ⋅ x + b \omega \cdot x +b = \sum_i{\alpha_i \cdot y_i \cdot \mathbf{x_i} \cdot x +b} ωx+b=iαiyixix+b

非线性分类与核函数

如上所示,我们发现在支持向量机的目标函数以及产出的模型中,关于输入数据,只有向量内积运算 x i ⋅ x j x_i \cdot x_j xixj。这个特点在处理非线性分类问题的时候非常有价值。
如何解决线性不可分的问题?
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
也就是说,面对在低维空间线性不可分的问题,通常可以采用将数据映射到高维空间的方法,这样问题就变成了高维空间的线性可分问题。例如上面手写笔记中的异或问题。异或问题在二维平面上线性不可分,但其实我们也可以直接增加一个维度,使得异或问题在三维空间中变成线性可分问题。
在二维平面上,无法找到一条直线将(0,0)(1,1)与(0,1)(1,0)分割在直线两侧。但我们增加一个维度,将两组点映射到(0,0,0)、(1,1,0)和(0,1,1)(1,0,1)时,两组点就可以用一个二维平面分隔开来。
实际问题的空间变换要比异或问题复杂得多。假设 x → ϕ ( x ) x\to \phi (x) xϕ(x)是我们需要的空间变换,我们要把所有数据经过 ϕ \phi ϕ变换,然后应用支持向量机。由于支持向量机的计算中只用到向量内积运算,因此只需要计算 ϕ ( x i ) ⋅ ϕ ( x j ) \phi(x_i) \cdot \phi(x_j) ϕ(xi)ϕ(xj)。我们注意到,其实并不需要真的计算变换 ,真正需要的是一个关于两个向量的函数,我们把这个函数记作 κ \kappa κ
κ ( x i , x j ) = ϕ ( x i ) ⋅ ϕ ( x j ) \kappa(x_i, x_j)=\phi(x_i)\cdot\phi(x_j) κ(xi,xj)=ϕ(xi)ϕ(xj)
我们把 κ \kappa κ称作核函数,它为我们进行空间变换提供了很大便利,是解决非线性分类问题的关键。如果空间变换的形式是已知的,当然可以直接计算出函数 κ \kappa κ。然而,核函数的优势是我们通常并不需要知道空间变换的具体形式,只需要定义核函数如何计算即可。下面是一些常用的核函数。
·线性核: κ ( x i , , x j ) = x i ⋅ x j \kappa(x_i,,x_j)=x_i \cdot x_j κ(xi,,xj)=xixj,这就是支持向量机原始的线性形式。
·多项式核: κ ( x i , , x j ) = ( x i ⋅ x j ) d \kappa(x_i,,x_j) = (x_i \cdot x_j)^d κ(xi,,xj)=(xixj)d,其中d是多项式的次数。
·高斯核 κ ( x i , , x j ) = e x p ( − ∥ x i − x J ∥ 2 / 2 σ 2 ) \kappa(x_i,,x_j)=exp(-\left \| x_i - x_J \right \|^2 / 2 \sigma^2 ) κ(xi,,xj)=exp(xixJ2/2σ2),其中 σ \sigma σ是带宽参数,适用于高斯分布的数据。高斯核也叫作径向基函数(Radial Basis Function,RBF)核。核函数中的空间变换思想在其他模型中也很常见。比如,后面我们会看到多层感知机组织成的神经网络模型,实际上也可以理解为不断对数据进行空间变换,最终将数据映射为不同类别,或者映射到期望的目标输出。

支持向量机代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project :demo1 
@File    :SVM.py
@IDE     :PyCharm 
@Author  :Yue
@Date    :2024-03-21 22:59 
'''
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm,datasets# 加载鸢尾花数据集
iris = datasets.load_iris()
index = iris.target < 2
X = iris.data[index,:2]
Y = iris.target[index]# 创建两个支持向量机
# C 是正则化参数,数值越大 正则化强度越小
# 正则化参数 是用来防止过拟合的
# 这里使用一个较大的参数值减弱正则化,以便显示原始结果
linear_svm = svm.SVC(kernel='linear', C=1e5)
# 高斯核的带宽参数是gamma
rbf_svm = svm.SVC(kernel='rbf', C=1e5, gamma=1)
svm_models = [linear_svm, rbf_svm]
for model in svm_models:model.fit(X,Y)# 分别绘制两个支持向量机的决策边界
xx,yy = np.meshgrid(np.arange(X[:,0].min()-0.5 ,X[:,0].max()+0.5 ,0.1),np.arange(X[:,1].min()-0.5 ,X[:,1].max()+0.5 ,0.1),
)
input = np.concatenate((xx.reshape((-1,1)) ,yy.reshape((-1,1)) ), axis=1
)
for model in svm_models:z = model.predict(input)z = z.reshape(xx.shape)fig = plt.pcolormesh(xx ,yy ,z ,cmap=plt.cm.Paired)# 绘制样本点for i in range(2):index = Y == imark = 'kx' if i == 0 else 'k+'plt.plot(X[index,0] ,X[index,1], mark)# 绘制支持向量support = model.support_vectors_plt.scatter(support[:,0] ,support[:,1] , c='y', edgecolors='k')plt.show()

这段代码有几个点没有看懂,我是这么向ai提问的。
在这里插入图片描述
它的回答:
在这段代码中,z 是一个一维数组,包含了使用 SVM 模型对网格点 input 进行预测得到的结果。
在这里插入图片描述

然而,pcolormesh 函数需要一个二维数组作为 Z 参数,以便能够在每个 (xx, yy) 网格点上绘制颜色。为了将一维数组 z 转换为这样的二维数组,我们需要使用 reshape 方法。

reshape 方法的作用是重新排列数组中元素的布局,而不改变数组中的数据内容。在这个过程中,我们根据 xxyy 的形状来定义 z 重塑后的形状。
在这里插入图片描述
于是,它变成了一个34*37的形状,也就是网格中的每个点,都对应了一个预测输出。

具体来说,xxyy 是通过 np.meshgrid 函数生成的,这个函数会创建两个二维数组,其中 xx 包含所有水平网格线的 x 坐标值,yy 包含所有垂直网格线的 y 坐标值。xxyy 的形状是相同的,并且都是由 input 数组的大小决定的。

这里是如何使用 reshape 方法的:

z = model.predict(input)
z = z.reshape(xx.shape)  # 将 z 重塑成与 xx 和 yy 相同的形状

在这个例子中,input 是一个二维数组,其形状是 (n_samples, 2),其中 n_samples 是网格点的数量。reshape 方法将 z 从一个长度为 n_samples 的一维数组转换为一个形状为 (n_samples, 1) 的二维数组。然后,这个二维数组可以与 xxyy 配合使用,因为 xxyy 的形状是 (n_samples, n_samples),其中 n_samples 是网格点的数量。
最终,z.reshape(xx.shape) 会得到一个形状为 (n_samples, n_samples) 的二维数组,其中每个元素对应于 (xx[i, j], yy[i, j]) 网格点的预测结果。这样,pcolormesh 函数就可以根据这个二维数组绘制出每个网格点的颜色,从而生成决策边界的图像。
采用线性核的SVM:
在这里插入图片描述
高斯核的SVM:
在这里插入图片描述


总结

`这部分主要介绍了支持向量机的分类模型,中间涉及了很多概念,什么是线性可分,支持向量机的优化目标,如何将分类问题转化为优化问题,如何求解这个优化问题,求解过程中又引入了核函数的概念。
要记住的是,面对低维空间线性不可分的问题,采用将数据映射到高维空间的思想,支持向量机是这一思想的代表方法。

感谢阅读,敬请评论区批评指正哦

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

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

相关文章

阿里云有免费服务器吗?有的,附送免费服务器申请流程

阿里云服务器免费试用申请链接入口&#xff1a;aliyunfuwuqi.com/go/free 阿里云个人用户和企业用户均可申请免费试用&#xff0c;最高可以免费使用3个月&#xff0c;阿里云服务器网分享阿里云服务器免费试用申请入口链接及云服务器配置&#xff1a; 阿里云免费服务器领取 阿里…

day10_面向对象之封装丶构造器

封装概述 现实生活中&#xff0c;每一个个体与个体之间是有边界的&#xff0c;每一个团体与团体之间是有边界的&#xff0c;而同一个个体、团体内部的信息是互通的&#xff0c;只是对外有所隐瞒。 面向对象编程语言是对客观世界的模拟&#xff0c;客观世界里每一个事物的内部…

总结: HQL语句

总结: HQL语句 Part1 数据库的操作Part2 数据表的操作1. 创建普通表2. 内外部表3. 内外部表转换 Part1 数据库的操作 查看数据库: show databases; 创建数据库: create database if not exists 数据库名 使用数据库: use 数据库名; 查看数据库详细信息: desc database 数据库名…

Echarts 利用多X轴实现未来15天天气预报

Echarts 利用多X轴实现未来15天天气预报 UI 设计图 Echarts 实现效果 代码实现 代码分解 echarts 图表上下均显示数据 通过设置 grid.top 和 grid.bottom 设置白天和夜间天气展示区域 grid: {top: 36%,bottom: 36%,left: 5%,right: 5%}, 天气图标的设置 由于 axisLabel 的…

【Linux】一文了解【进程优先级相关知识点】&【PRI / NI值】背后的修正原理(13)

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《…

算法 之 排序算法

&#x1f389;欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ &#x1f389;感谢各位读者在百忙之中抽出时间来垂阅我的文章&#xff0c;我会尽我所能向的大家分享我的知识和经验&#x1f4d6; &#x1f389;希望我们在一篇篇的文章中能够共同进步&#xff01;&#xff01;&…

leetcode(Hot100)——数组篇

1、两数之和 本题使用哈希法&#xff0c;用一个哈希Map保存数组的值以及对应下标&#xff0c;代码如下&#xff1a; class Solution {public int[] twoSum(int[] nums, int target) {HashMap<Integer,Integer> map new HashMap<>();for(int i0; i<nums.length…

【网络基础】网络层基本协议介绍

目录 一、IP数据包 1.1 网络层的功能 1.2 IP数据包格式 二、ICMP协议介绍 2.1 作用 2.2 常用命令 2.2.1 Ping命令 2.2.2 tracert命令 2.3 广播域 三、ARP协议介绍 3.1 作用 3.2 原理 一、IP数据包 1.1 网络层的功能 定义了基于IP协议的逻辑地址&#xff0c;就是I…

数据结构应用——哈夫曼树

哈夫曼树 哈夫曼树的相关概念构造哈夫曼树基础算法 哈夫曼编码 哈夫曼树的相关概念 结点的权&#xff1a;有某种现实含义的数值。结点的带权路径长度&#xff1a;从树的根结点到该结点的路径长度&#xff08;经过的边数&#xff09;与该结点上权值的乘积。树的带权路径长度&am…

XiBe希贝奶瓶好用吗?2名宝宝的宝爸深度测评分享!

几乎每个新手宝爸宝妈都会有一段时间对孩子的很多东西都是不懂的&#xff0c;一边摸索一边学习。列如关于奶瓶这个问题就困扰不少新手爸妈&#xff0c;特别是面对这么多的品牌的奶瓶完全不知道怎么选。 相信很多新手爸妈都十分担心奶瓶材质安全问题&#xff0c;所以我作为一名…

OpenCV+OpenCV-Contrib源码编译

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、OpenCV是什么&#xff1f;二、OpenCV 源码编译1.前期准备1.1 源码下载1.2 cmake安装1.3 vscode 安装1.4 git 安装1.5 mingw安装 2.源码编译2.1 打开cmake2.…

python(django)之流程接口管理后台开发

1、在models.py中加入流程接口表和单一接口表 代码如下&#xff1a; from django.db import models from product.models import Product# Create your models here.class Apitest(models.Model):apitestname models.CharField(流程接口名称, max_length64)apitester model…

详细分析Python中的enumerate()函数(附多个Demo)

目录 前言1. 基本知识2. Demo 前言 对于Python的基本函数&#xff0c;从实战中获取确切知识 1. 基本知识 enumerate() 接受一个可迭代对象作为输入&#xff0c;并返回一个枚举对象这个枚举对象包含了原始可迭代对象中的每个元素以及对应的索引它允许在循环中同时获取索引和值…

uboot - pinctrl - FPGA回片前测试阶段 - 设置GPIO引脚复用失败

问题描述 pinctrl设置引脚复用失败&#xff0c;没有调用到controller中的set_groups_function函数。 问题定位 pinctrl如何注册dm节点如何进行设备树中各个设备节点下的复用配置为什么没调用到控制器实现的set_groups_function函数 &gpio0 {status "okay";p…

VMware Workstation Pro 17虚拟机超级详细搭建(含redis,nacos,docker)(一)

今天从零搭建一下虚拟机的环境&#xff0c;把nacos&#xff0c;redis等微服务组件还有数据库搭建到里面&#xff0c;首先看到的是我们最开始下载VMware Workstation Pro 17 之后的样子&#xff0c;总共一起应该有三部分因为篇幅太长了 下载地址 : VMware - Delivering a Digit…

Vue动态设置控制表格列表展现列

最近遇到一个需求,表格列表默认不展示某一列,当我设置后可以展示该列,也可以展示和隐藏别的列,起到可以对整个表格列展示隐藏控制的效果,如下示例,默认不展示“单位名称”这一列,在我点击设置齿轮后可以看到,有“单位名称”这一列,但未打钩: 当我勾中“单位名称”,…

第2讲-Memory(5)外存

磁盘存储器 组成 记录原理 性能指标 (磁盘存取时间的计算) 磁盘地址 工作过程 优点 ①存储容量大,位价格低; ②记录介质可重复使用; ③记录信息可长期保存而不丢失,甚至可脱机存档; ④非破坏性读出,读出时不需要再生。 缺点 存取速度慢,机械结构复杂,对工作环境…

在wps的word中如何引用正确引用参考文献

目录 插入参考文献编号把插入的编号置于右上角最终效果 插入参考文献编号 把插入的编号置于右上角 最终效果

面试算法-88-反转链表

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 解 class Solution {public ListNode reverseList(ListNode head) {if(head null || hea…

大数据技术在工厂生产数字转型中的应用与价值

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 随着大数据技术的快速发展&#xff0c;越来越多的企业开始关注并应用大数据技术&#x…