机器学习——子空间学习(PCA LDA)
1. 引入:子空间学习与降维
什么是子空间学习?
- 子空间学习大意是指通过投影,实现高维特征向低维空间的映射,是一种经典的降维思想。绝大多数的维数约简(降维,投影)算法都算是子空间学习,如PCA、LDA、LPP、LLE等;
- 本文只介绍前两种维数约减算法,即主成分分析(PCA)和线性判别分析(LDA)。
什么是降维?什么情况下需要降维?
- 降维:寻找一组映射对样本进行重新表示(representation);
- 原样本:x=[x1;x2;...;xd]∈Rdx=[x_1;x_2;...;x_d]∈\mathbb{R}^dx=[x1;x2;...;xd]∈Rd;新表示:y=[y1;y2;...;ym]∈Rm(m<d)y=[y_1;y_2;...;y_m]∈\mathbb{R}^m(m<d)y=[y1;y2;...;ym]∈Rm(m<d);降维目标:学习映射ϕ(x)=y\phi(x)=yϕ(x)=y;
- 我们知道,样本空间是由样本的各个属性张成的空间,假设每个样本有ddd个属性,则样本空间就是一个ddd维空间,ddd维空间中的每个点就是一个样本的表示(representation);
- 降维就是学习一个从原样本空间到新样本空间(子空间,即维度小于ddd,假设为mmm维)的映射,使得新样本空间中每个点是一个样本的新的表示,也就是说,每个样本的表示从ddd维向量简化为了mmm维向量,这显然是一件好事。
需要降维的情况:如数据冗余。下图中前两列表达的是同一个意思,造成了数据冗余,对此,应当进行降维。
数据冗余的弊端?维度灾难!
- 增加计算机开销(存储空间、计算资源);
- 采样困难。
2. 主成分分析(PCA)
假设:映射ϕ(⋅)\phi(·)ϕ(⋅)是线性映射,线性映射的实质就是定义了一个新坐标。
ϕ(⋅):WTx=y∈Rm,W=[w1,w2,...,wm]∈Rd×m\phi(·):W^Tx=y∈\mathbb{R}^m,W=[w_1,w_2,...,w_m]∈\mathbb{R}^{d×m}ϕ(⋅):WTx=y∈Rm,W=[w1,w2,...,wm]∈Rd×m
最大方差理论: 在信号处理中认为信号具有较大的方差,噪声有较小的方差。 即新坐标系上数据方差应越大越好。
2.1 目标函数
在新坐标系下最大化数据新表征的方差:maxw∑i=1n(yi−yˉ)2,\max\limits_w\sum\limits_{i=1}^n(y_i-\bar{y})^2,wmaxi=1∑n(yi−yˉ)2,s.t.yi=wTxi,∣∣w∣∣=1.\text{s.t.}\quad y_i=w^Tx_i,||w||=1.s.t.yi=wTxi,∣∣w∣∣=1.第二个约束条件是为了坐标系标准化。矩阵化表示:maxW∑i=1n∣∣yi−yˉ∣∣2,\max\limits_W\sum\limits_{i=1}^n||y_i-\bar{y}||^2,Wmaxi=1∑n∣∣yi−yˉ∣∣2,s.t.yi=WTxi,WTW=I.\text{s.t.}\quad y_i=W^Tx_i,W^TW=I.s.t.yi=WTxi,WTW=I.其中W=[w1,...,wm]∈Rd×mW=[w_1,...,w_m]∈\mathbb{R}^{d×m}W=[w1,...,wm]∈Rd×m,第二个约束条件保证坐标系为标准正交坐标系,也可表示为∣∣wi∣∣=1,wiTwj=0||w_i||=1,w_i^Tw_j=0∣∣wi∣∣=1,wiTwj=0。PCA降维的过程可以通过数据乘以矩阵来表示,因此是一个线性变换。
- 原样本:x=[x1;x2;...;xd]∈Rdx=[x_1;x_2;...;x_d]∈\mathbb{R}^dx=[x1;x2;...;xd]∈Rd
- 新表示:y=[y1;y2;...;ym]∈Rm(m<d)y=[y_1;y_2;...;y_m]∈\mathbb{R}^m(m<d)y=[y1;y2;...;ym]∈Rm(m<d)
PCA的目标函数推导:f(W)=∑i=1n∣∣yi−yˉ∣∣2=∑i=1n(yi−yˉ)T(yi−yˉ)=∑i=1ntr((yi−yˉ)(yi−yˉ)T)f(W)=\sum\limits_{i=1}^n||y_i-\bar{y}||^2=\sum\limits_{i=1}^n(y_i-\bar{y})^T(y_i-\bar{y})=\sum\limits_{i=1}^ntr((y_i-\bar{y})(y_i-\bar{y})^T)f(W)=i=1∑n∣∣yi−yˉ∣∣2=i=1∑n(yi−yˉ)T(yi−yˉ)=i=1∑ntr((yi−yˉ)(yi−yˉ)T)=tr(∑i=1n(yi−yˉ)(yi−yˉ)T)=tr(∑i=1n(WTxi−WTxˉ)(WTxi−WTxˉ))=tr(\sum\limits_{i=1}^n(y_i-\bar{y})(y_i-\bar{y})^T)=tr(\sum\limits_{i=1}^n(W^Tx_i-W^T\bar{x})(W^Tx_i-W^T\bar{x}))=tr(i=1∑n(yi−yˉ)(yi−yˉ)T)=tr(i=1∑n(WTxi−WTxˉ)(WTxi−WTxˉ))=tr(∑i=1nWT(xi−xˉ)(xi−xˉ)TW)=tr(WT(∑i=1n(xi−xˉ)(xi−xˉ)T)W)=tr(\sum\limits_{i=1}^nW^T(x_i-\bar{x})(x_i-\bar{x})^TW)=tr(W^T(\sum\limits_{i=1}^n(x_i-\bar{x})(x_i-\bar{x})^T)W)=tr(i=1∑nWT(xi−xˉ)(xi−xˉ)TW)=tr(WT(i=1∑n(xi−xˉ)(xi−xˉ)T)W)=tr(WT(X−Xˉ)(X−Xˉ)TW)=tr(WT(n−1)cov(X)W)=tr(W^T(X-\bar{X})(X-\bar{X})^TW)=tr(W^T(n-1)cov(X)W)=tr(WT(X−Xˉ)(X−Xˉ)TW)=tr(WT(n−1)cov(X)W)
综上,PCA的目标函数如下:f(W)=tr(WT(X−Xˉ)(X−Xˉ)TW)f(W)=tr(W^T(X-\bar{X})(X-\bar{X})^TW)f(W)=tr(WT(X−Xˉ)(X−Xˉ)TW)
2.2 问题求解
优化目标:maxWtr(WT(X−Xˉ)(X−Xˉ)TW),\max\limits_Wtr(W^T(X-\bar{X})(X-\bar{X})^TW),Wmaxtr(WT(X−Xˉ)(X−Xˉ)TW),s.t.WTW=I\text{s.t.}\quad W^TW=Is.t.WTW=I
采用拉格朗日乘子法,目标转化为:minWL(W,λ)=−tr(WT(X−Xˉ)(X−Xˉ)TW)+tr(λ(WTW−I))\min\limits_Wℒ(W,\lambda)=-tr(W^T(X-\bar{X})(X-\bar{X})^TW)+tr(\lambda(W^TW-I))WminL(W,λ)=−tr(WT(X−Xˉ)(X−Xˉ)TW)+tr(λ(WTW−I))令∂L∂W=0\frac{\partial ℒ}{\partial W}=0∂W∂L=0,得:(X−Xˉ)(X−Xˉ)TW=λW(X-\bar{X})(X-\bar{X})^TW=\lambda W(X−Xˉ)(X−Xˉ)TW=λW这是一个典型的特征值分解问题,即:CW=λW,C=(X−Xˉ)(X−Xˉ)TCW=\lambda W,\quad C=(X-\bar{X})(X-\bar{X})^TCW=λW,C=(X−Xˉ)(X−Xˉ)T对(X−Xˉ)(X−Xˉ)T(X-\bar{X})(X-\bar{X})^T(X−Xˉ)(X−Xˉ)T进行特征值分解得:(X−Xˉ)(X−Xˉ)T=VΛVT(X-\bar{X})(X-\bar{X})^T=V\Lambda V^T(X−Xˉ)(X−Xˉ)T=VΛVT其中Λ=diag(λ1,λ2,...,λd),V=[v1,v2,...,vd]\Lambda=diag(\lambda_1,\lambda_2,...,\lambda_d), V=[v_1,v_2,...,v_d]Λ=diag(λ1,λ2,...,λd),V=[v1,v2,...,vd],得到的λ1,λ2,...,λd\lambda_1, \lambda_2,...,\lambda_dλ1,λ2,...,λd就是CCC的ddd个特征值,VVV是特征值对应特征向量构成的矩阵。
注意:VVV的每一列代表一个特征向量。
我们对特征值进行排序,取前mmm个最大特征值所对应的特征向量即组成了最优投影矩阵:W=[v1,v2,...,vm]W=[v_1,v_2,...,v_m]W=[v1,v2,...,vm]至此,我们就可以使用矩阵WWW对数据进行投影降维了。
2.3 主成分解
- 第一主成分包含了样本方差的最大方向;
- 第二主成分与第一主成分不相关(夹角90度),包含了剩余样本方差的最大方向;
- 前几个主成分包含了样本的绝大部分信息,以至于可以忽略后面的主成分。
2.4 子空间、基和嵌入
- 投影矩阵W=[w1,...,wm]W=[w_1,...,w_m]W=[w1,...,wm]是新的数据表征的坐标系集合,我们可以说WWW在样本空间中张了一个子空间;
- 向量wiw_iwi定义一个样本的主成分,也定义新坐标系中第iii个坐标轴,称为WWW张成的子空间的一个基;
- yi=WTxiy_i=W^Tx_iyi=WTxi是样本xix_ixi在WWW张成的子空间中的一个低维嵌入。
2.5 算法流程
- 样本中心化:A=X−XˉA=X-\bar{X}A=X−Xˉ,其中Xˉ=[xˉ,xˉ,...,xˉ]∈Rd×n\bar{X}=[\bar{x},\bar{x},...,\bar{x}]∈\mathbb{R}^{d×n}Xˉ=[xˉ,xˉ,...,xˉ]∈Rd×n;
- 计算协方差矩阵:C=AAT=(X−Xˉ)(X−Xˉ)TC=AA^T=(X-\bar{X})(X-\bar{X})^TC=AAT=(X−Xˉ)(X−Xˉ)T;
- 特征值分解:C=VΛVTC=V\Lambda V^TC=VΛVT
- 根据特征值选取特征向量构建投影矩阵:W=[v1,v2,...,vm]W=[v_1,v_2,...,v_m]W=[v1,v2,...,vm]
注意:WWW对应VVV的前mmm列!(前提:特征值已排序!)
- 输入原样本投影至新子空间完成降维:Y~=WTA\tilde{Y}=W^TAY~=WTA
使用奇异值分解(SVD)后:
- 样本中心化:A=X−XˉA=X-\bar{X}A=X−Xˉ,其中Xˉ=[xˉ,xˉ,...,xˉ]∈Rd×n\bar{X}=[\bar{x},\bar{x},...,\bar{x}]∈\mathbb{R}^{d×n}Xˉ=[xˉ,xˉ,...,xˉ]∈Rd×n;
- 奇异值分解:A=UΣVTA=U\Sigma V^TA=UΣVT
- 根据奇异值选取奇异向量构建投影矩阵:W=[u1,u2,...,um]W=[u_1,u_2,...,u_m]W=[u1,u2,...,um]
注意:WWW对应UUU的前mmm列!(前提:奇异值已排序!)
- 输入原样本投影至新子空间完成降维:Y~=WTA\tilde{Y}=W^TAY~=WTA
问题:yyy的维度如何确定?
- 固定值(分类问题设为类别数目-1);
- 试错法(trial by error);
- 设定特征值比重的阈值:maxm∑i=1mλi/∑i=1dλi≥h\max\limits_{m}\sum_{i=1}^m\lambda_i/\sum_{i=1}^d\lambda_i≥hmmax∑i=1mλi/∑i=1dλi≥h;
- 根据保留维度-精度的图像拐点(如下)。
2.6 小结
- 核心思想:寻找合适的正交投影矩阵WWW,使得投影后的样本Y=WTXY=W^TXY=WTX方差最大,也就是说在新的空间中保留的信息越多越好。
- 不足之处:存储、计算开销大;并未利用到监督信息。
如何改进?
减小存储、计算开销:奇异值分解(SVD)。A=UΣVTA=U\Sigma V^TA=UΣVT,其中A∈Rd×n,U∈Rd×r,Σ∈Rr×r,V∈Rn×rA∈\mathbb{R}^{d×n},U∈\mathbb{R}^{d×r},\Sigma∈\mathbb{R}^{r×r},V∈\mathbb{R}^{n×r}A∈Rd×n,U∈Rd×r,Σ∈Rr×r,V∈Rn×r,UUU和VVV都是正交矩阵,UUU中每个向量称为AAA的左奇异向量,VVV中每个向量称为AAA的右奇异向量,而Σ\SigmaΣ是一个对角方阵,且rrr等于AAA的秩。(更多请看这篇:求分解后的U,Σ,VU,\Sigma,VU,Σ,V三个矩阵的方法)
利用监督信息:线性判别分析(LDA)。
3. 线性判别分析(LDA)
费希尔准则(Fisher Criteria):同类样本应该尽量聚合在一起,而不同类样本之间应该尽量扩散。如下图,即使得红线尽可能短,蓝线尽可能长。
如何定义聚合程度和扩散程度?
其实方差就可以实现!方差大,既可以表示聚合程度小,也可以表示扩散程度大!
3.1 同类样本的聚合程度
一维情况下(方差):sw(c)=∑i∈c(yi−μc)2s_w(c)=\sum\limits_{i∈c}(y_i-\mu_c)^2sw(c)=i∈c∑(yi−μc)2其中c∈[1,...,c,...,C]c∈[1,...,c,...,C]c∈[1,...,c,...,C],共CCC个类,μc=1nc∑i∈cyi\mu_c=\frac{1}{n_c}\sum\limits_{i∈c}y_iμc=nc1i∈c∑yi是ccc类样本的中心。
多维情况下(协方差矩阵):sw(c)=tr(∑i∈c(yi−μc)(yi−μc)T)s_w(c)=tr(\sum\limits_{i∈c}(y_i-\mu_c)(y_i-\mu_c)^T)sw(c)=tr(i∈c∑(yi−μc)(yi−μc)T)
3.2 类别之间的扩散程度
sb=∑c=1Ctr((μc−μ)(μc−μ)T)s_b=\sum\limits_{c=1}^Ctr((\mu_c-\mu)(\mu_c-\mu)^T)sb=c=1∑Ctr((μc−μ)(μc−μ)T)其中μc=1nc∑i∈cyi\mu_c=\frac{1}{n_c}\sum\limits_{i∈c}y_iμc=nc1i∈c∑yi是ccc类样本中心,μ=1n∑iyi\mu=\frac{1}{n}\sum\limits_iy_iμ=n1i∑yi是总样本中心。
3.3 目标函数
根据费希尔准则,yyy在一个理想的坐标系下应当满足:∀c,sw(c)↓,sb↑\forall c,s_w(c)↓,s_b↑∀c,sw(c)↓,sb↑故目标函数构建如下:min∑csw(c)sb\min \frac{\sum_cs_w(c)}{s_b}minsb∑csw(c)假设低维嵌入yyy由xxx通过投影矩阵WWW投影到LDA子空间,即:y=WTx,y∈Rm×1,x∈Rd×1,W∈Rd×my=W^Tx,\quad y∈\mathbb{R}^{m×1}, x∈\mathbb{R}^{d×1}, W∈\mathbb{R}^{d×m}y=WTx,y∈Rm×1,x∈Rd×1,W∈Rd×m则目标函数变为:minWtr(WTSwWWTSbW)\min_W tr(\frac{W^TS_wW}{W^TS_bW})Wmintr(WTSbWWTSwW)该目标函数是SwS_wSw和SbS_bSb的广义瑞利商。其中类内散度矩阵SwS_wSw和类间散度矩阵SbS_bSb定义如下:Sw=∑c=1C∑i∈c(xi−xˉc)(xi−xˉc)T∈Rd×dS_w=\sum\limits_{c=1}^C\sum\limits_{i∈c}(x_i-\bar{x}_c)(x_i-\bar{x}_c)^T∈\mathbb{R}^{d×d}Sw=c=1∑Ci∈c∑(xi−xˉc)(xi−xˉc)T∈Rd×dSb=∑c=1Cnc(xˉc−xˉ)(xˉc−xˉ)T∈Rd×dS_b=\sum\limits_{c=1}^Cn_c(\bar{x}_c-\bar{x})(\bar{x}_c-\bar{x})^T∈\mathbb{R}^{d×d}Sb=c=1∑Cnc(xˉc−xˉ)(xˉc−xˉ)T∈Rd×d该目标函数的最优解有无穷多个,因为可以对WWW进行任意缩放。所以,我们可以认为该问题等价于:minWtr(WTSwW),s.t.,WTSbW=I\min_Wtr(W^TS_wW),\quad \text{s.t.},W^TS_bW=IWmintr(WTSwW),s.t.,WTSbW=I
3.4 问题求解
在PCA中已求解过类似问题,即构造拉格朗日函数求偏导,得到一个典型的特征值分解问题,故此处不再详述。
构造构造拉格朗日函数,并求偏导得到:Sb−1SwW=λWS_b^{-1}S_wW=\lambda WSb−1SwW=λW同理,这也是一个特征值分解问题。
3.5 算法流程
- 计算各类样本中心和所有样本中心:μc=1nc∑i∈cyi,μ=1n∑iyi\mu_c=\frac{1}{n_c}\sum\limits_{i∈c}y_i,\quad\mu=\frac{1}{n}\sum\limits_iy_iμc=nc1i∈c∑yi,μ=n1i∑yi
- 计算类间散度矩阵和类内散度矩阵:Sw=∑c=1C∑i∈c(xi−xˉc)(xi−xˉc)T∈Rd×dS_w=\sum\limits_{c=1}^C\sum\limits_{i∈c}(x_i-\bar{x}_c)(x_i-\bar{x}_c)^T∈\mathbb{R}^{d×d}Sw=c=1∑Ci∈c∑(xi−xˉc)(xi−xˉc)T∈Rd×dSb=∑c=1Cnc(xˉc−xˉ)(xˉc−xˉ)T∈Rd×dS_b=\sum\limits_{c=1}^Cn_c(\bar{x}_c-\bar{x})(\bar{x}_c-\bar{x})^T∈\mathbb{R}^{d×d}Sb=c=1∑Cnc(xˉc−xˉ)(xˉc−xˉ)T∈Rd×d
- 特征值分解:Sb−1SwW=λWS_b^{-1}S_wW=\lambda WSb−1SwW=λW;
- 根据特征值选取特征向量构建投影矩阵:W=[v1,v2,...,vm]W=[v_1,v_2,...,v_m]W=[v1,v2,...,vm];
- 输入原样本投影至新子空间完成降维:Y=WTXY=W^TXY=WTX
3.6 PCA vs LDA
思想上:
- PCA旨在寻找一组子坐标系(定义一个子空间)使得样本点的方差最大,即信息量保留最多;
- LDA旨在寻找一组子坐标系(定义一个子空间)使得样本点类内散度小,类间散度大(费希尔准则)。
监督性:
- PCA是无监督学习方法;
- LDA是有监督学习方法。
子空间学习(subspace learning)角度:
- 两者都属于线性子空间学习算法,因为都在样本空间定义了一个新的子坐标系(子空间),每个列向量定义了一个坐标轴;
- 目标都是学习一个投影矩阵WWW,使得样本在新坐标系上的表示具有相应特性;
降维(dimension reduction)角度:
- 两者都有降维的效果,坐标轴数目减少,维度减少。
特征提取(feature extraction)角度:
- 两者都起到了特征提取的作用,样本在新坐标系下的坐标就相当于样本的新特征(表征、表示)。
效率:PCA效率好于LDA。
4. 子空间学习的核化
想想:如果样本分布不是线性的,怎么办?
思路:把样本利用非线性映射投射到更高的维度(一般来说),使得在高维非线性空间,可以使用线性子空间学习进行数据分析。
然而,对于任意给定数据寻找合适的非线性映射ϕ\phiϕ是不现实的。
回顾一下,在支持向量机这篇文章中,我曾介绍过核方法(kernel trick),也就是我们定义核函数κ(xi,xj)=ϕ(xi)Tϕ(xj)\kappa(x_i,x_j)=\phi(x_i)^T\phi(x_j)κ(xi,xj)=ϕ(xi)Tϕ(xj),使得ϕ\phiϕ可以隐式地由核函数表示出来。只要满足Mercer条件(即核矩阵对称半正定)的函数就是核函数,因此核函数很容易找到,并且有了核函数后,内积的计算也变得十分方便。链接中的文章也介绍了常见的核函数。
在此,我们以PCA和LDA为例,对子空间学习进行核化。
机器学习——子空间学习(PCA LDA)相关推荐
- 【机器学习】基于PCA/LDA的数据降维和可视化(二维+三维)
基于PCA/LDA的数据降维和可视化 Introduction Project Intro File Intro Tools Intro Code&Dataset Link Process P ...
- 模式识别与机器学习(作业5)基于PCA–LDA的人脸识别
基于PCA–LDA的人脸识别 ORC数据集 提取码: cggh 本次的实验是在模式识别与机器学习(作业4),PCA降维的基础上加入了线性判别分析,对维度进行了进一步的降低. 1. 导入数据 一共有40 ...
- 机器学习Sklearn学习总结
Sklearn学习资料推荐: sklearn中文文档 机器学习入门必看:使用 scikit-learn 构建模型的通用模板 机器学习神器Scikit-Learn保姆教程! python机器学习_FF_ ...
- SL-PCA(子空间学习模型)——前景提取
目录 1.算法评价 2.综述 2.1 子空间学习方法的背景建模 3.Matlab code Paper: subspace learning for background modeling:a sur ...
- 《机器学习》学习笔记(三)——线性模型
机器学习(Machine Learning)是一门多学科交叉专业,涵盖概率论知识,统计学知识以及复杂算法知识,使用计算机作为工具并致力于真实实时的模拟人类学习方式, 并将现有内容进行知识结构划分来有效 ...
- 2018年机器学习深度学习资料 全新汇总(不断更新),希望看到文章的朋友能够学到更多
向AI转型的程序员都关注了这个号??? 大数据挖掘DT数据分析 公众号: datadw 注:机器学习资料篇目一共500条,篇目二开始更新 本文提到链接 请查看原文 https://github.c ...
- 机器学习线性回归学习心得_机器学习中的线性回归
机器学习线性回归学习心得 机器学习中的线性回归 (Linear Regression in Machine Learning) There are two types of supervised ma ...
- andrew ng 机器学习笔记_所有笔记目录 | 数据分析 | 机器学习 | 深度学习等
持续更新中... 机器学习模型Python复现: 舟晓南:感知机模型python复现 - 随机梯度下降法:梯度下降法:adagrad:对偶形式 舟晓南:k近邻(KNN)模型python复现 - 线性扫 ...
- 机器学习算法_机器学习算法之PCA算法
前言 在机器学习中降维是我们经常需要用到的算法,在降维的众多方法中PCA无疑是最经典的机器学习算法之一,最近准备撸一个人脸识别算法,也会频繁用到PCA,本文就带着大家一起来学习PCA算法. 前置内容 ...
最新文章
- tiny210V2 Uboot kernel filesystem 烧写和启动
- 实现一个EventTarget类
- Java与.NET的WebServices相互调用
- 二元树中和为某一值的所有路径
- 海底捞涨价,有错吗?
- NoSQL介绍(七)
- c++排序函数_Excel2010 技巧六 (排名函数)
- 【转】vmware 安装 osx 无法登录 appstore 的解决办法 (伪造smbios设备信息)
- ASP.NET--窗体实现淡入淡出效果
- oracle 基础查询语句
- 通达信版弘历软件指标_[转载]弘历软件指标源码
- 计算机专业大学生买什么u盘合适,12款热销U盘横评:哪款U盘最值得买?
- Sklearn中的二分类模型可以进行多分类的原理
- 智牛股_第6章_Mybatis Generator代码生成器
- 点乘/内积/数量积;叉乘/向量积;矩阵乘法;哈达马积;克罗内克积;卷积
- 老程序员教你如何提高开发效率、成为大神4——快速学习方法
- 不重视,小程序将会带来大风险!——三大风险、隐私合规,小程序主该如何面对?
- Python+numpy画一幅纯颜色的灰度图,并将另一幅图片置于中间
- 【TJOI2017】DNA【后缀自动机】
- ASR长语音识别,基于vue2
热门文章
- 电脑硬盘丢失数据,硬盘数据恢复方法分享
- Vue使用UEditor百度编辑器,上传图片服务配置问题,查看版本
- AndroidX升级;项目升级AndroidX遇到的问题和解决;
- 下列字符是c语言的保留字是,下列字符序列中,是C语言保留字的是()。
- python requests 高级用法
- mysql5.6获取ipv6_linux环境下配置mysql5.6支持IPV6连接的方法
- 【大数据日记】【转】The world beyond batch: Streaming 101(第一节)
- 系统集成项目管理工程师(软考中级)—— 第十八章 合同管理 笔记分享
- python删除文件夹里损坏的图片
- 表达式必须包含指向对象的指针类型,但他具有“int“?