无监督学习(2) 数据降维简述与Python实现

本文深入探讨了数据降维的重要性,如缓解维度灾难和提高可视化能力,并介绍了多种降维方法,包括PCA、LDA、自编码器等。PCA通过最大化方差进行线性降维,LDA则考虑类别信息。自编码器则结合PCA和神经网络实现非线性降维。此外,还讨论了LLE、Isomap、MDS、SNE和t-SNE等更复杂的降维算法,强调了它们在不同场景的应用及其优缺点。
摘要由CSDN通过智能技术生成

为什么要数据降维

大数据时代面临的最大问题是"维度灾难",度量上的不平衡和高维空间的学习复杂度都让机器学习算法在高维数据上很多时候行不通。而且,如果数据超过三维,它们也很难被可视化。不能被可视化的数据是很难理解的。
如果我们的数据比较高维,不适合直接进行监督或聚类学习,则我们可以先用一些其他的无监督或有监督的技巧把数据进行降维。这一系列的方法也常常被叫做度量学习。
通过有监督或者无监督的方法,学习在原始的坐标距之上的距离评估方法,就是度量学习。度量学习可以为KNN和聚类服务,有时这些方法也可以被直接用在数据预处理上,而且一般表现都不错。我们首先介绍的是PCA,主成分分析;

PCA

PCA使用一个线性变换投影来得到新的坐标空间,也就是把原向量空间里的数据x乘上一个W矩阵,变换到另一个向量空间。PCA的目的就是确定W应该是怎样的W;考虑我们希望的是让被处理后的数据被分的尽可能开,也就是让投影后的数据点的方差最大化,问题就简化为了最大化协方差矩阵的迹。如果投影后的新向量是
W T x W^Tx WTx
那么协方差矩阵就是
W T ( x − x ^ ) ( x − x ^ ) T W W^T(x-\hat{x})(x-\hat{x})^TW WT(xx^)(xx^)TW
因为W^T是投影矩阵,新的坐标基应该满足两两正交条件,还需要有约束条件
W T W = I W^TW = I WTW=I
PCA有意思就有意思在下面的步骤,我们知道如果是约束优化问题,可以用拉格朗日乘子法来解。给上面的约束条件使用拉格朗日乘子法添上一个 λ \lambda λ,就变成
W T ( x − x ^ ) ( x − x ^ ) T W = λ ( W T W − I ) W^T(x-\hat{x})(x-\hat{x})^TW=\lambda (W^TW - I) WT(xx^)(xx^)TW=λ(WTWI)
再计算偏导等于零,原式变为
( x − x ^ ) ( x − x ^ ) T W = λ W (x-\hat{x})(x-\hat{x})^TW=\lambda W (xx^)(xx^)TW=λW
这是特征值分解的形式!特征值分解找到的特征值和特征向量对有多个,也就是满足约束条件的解有多个。对W的一个向量w,我们希望最大化的目标函数是
w T ( x − x ^ ) . ( x − x ^ ) T . w = w T w λ = λ w^T(x-\hat{x}).(x-\hat{x})^T.w=w^Tw\lambda=\lambda wT(xx^).(xx^)T.w=wTwλ=λ
就等于 λ \lambda λ,最大的 λ \lambda λ对应最好的约束优化问题的解;好了,现在拿到数据,我们把数据做个标准化,让 x ^ \hat x x^=0,然后令S = X T X X^TX XTX,对S做特征值分解,在得到的 λ \lambda λ中选k个最大的对应的特征向量,就得到W矩阵,做W点乘X就能把数据降维到k维。算法就结束啦。下面的代码也可以看到,只需要几行就可以实现。

def PCA(X,dim):
    #中心化
    xmean = np.mean(X,axis=0)
    X=deepcopy(X-xmean)
    #协方差矩阵
    Covs = X.T.dot(X)
    lamda,V=np.linalg.eigh(Covs)
    #取前dim个最大的特征值对应的特征向量
    index=np.argsort(-lamda)[:dim]
    V_selected=V[:,index]
    return V_selected

我们可以试试在Iris上的效果

X,y = datasets.load_iris(return_X_y=True)

W = PCA(X,2)
X_ = X.dot(W)
plt.scatter(X_[:,0], X_[:,1],edgecolors='black',c=y)

在这里插入图片描述

LDA

PCA并不总能把事情做的很好,因为PCA盲目地把数据映射到了最能"平铺"的空间。如果我们想完成二分类任务,我们的数据集像油条的两根那样平行地排布在一起,而且又被拉长,则PCA只会把油条平放在桌子上,而我们希望油条被竖直地立在桌子上,这样才能更好地区分两个类别。
为此需要引入有标签的线性降维学习方法LDA,其实思想是和PCA完全一致,但现在我们希望最小化类内方差,最大化类间方差。事实上这部分内容在讲线性模型时已经讲过了,我们这里复习一下。
首先定义类间距离和类内距离,类间距就是两个类中心的距离,类内距就是所有数据点到类中心的距离均值
J 0 = ( ( μ 1 − μ 0 ) W ) T ( ( μ 1 − μ 0 ) W ) = W T ( μ 1 − μ 0 ) T ( μ 1 − μ 0 ) W J_0=((\mu_1-\mu_0)W)^T((\mu_1-\mu_0)W)=W^T(\mu_1-\mu_0)^T(\mu_1-\mu_0)W J0=((μ1μ0)W)T((μ1μ0)W)=WT(μ1μ0)T(μ1μ0)W
J 1 = ( ( X − μ ) W ) T ( ( X − μ ) W ) = W T ( X − μ ) T ( X − μ ) W J_1=((X-\mu)W)^T((X-\mu)W)=W^T(X-\mu)^T(X-\mu)W J1=((Xμ)W)T((Xμ)W)=WT(Xμ)T(Xμ)W
我们设 S 1 = ( X − μ ) T ( X − μ ) , S 0 = ( μ 1 − μ 0 ) T ( μ 1 − μ 0 ) S_1=(X-\mu)^T(X-\mu),S_0 = (\mu_1-\mu_0)^T(\mu_1-\mu_0) S1=(Xμ)T(Xμ),S0=(μ1μ0)T(μ1μ0)
有了这两个量就可以自己定义损失函数了,一种能保证数据规模不会影响loss的方法是设J1=1,最大化J0。即 J = W T S 0 W s . t . W T S 1 W = 1 J=W^TS_0W \quad s.t.\quad W^TS_1W=1 J=WTS0Ws.t.WTS1W=1
这个问题直接用拉格朗日乘子法就能求解,写出拉格朗日函数
L ( W , λ ) = W T S 0 W − λ ( W T S 1 W − 1 ) L(W,\lambda)=W^TS_0W-\lambda (W^TS_1W-1) L(W,λ)=WTS0Wλ(WTS1W1)
计算偏导并让它等于0,就得到极值的必要条件
∂ L ∂ W = 2 W T S 0 W − 2 λ W T S 1 = 0 \frac{\partial{L}} {\partial{W}}=2W^TS_0W-2\lambda W^TS_1=0 WL=2WTS0W2λWTS1=0
S 0 W = λ S 1 W S_0W=\lambda S_1W S0W=λS1W
S 1 − 1 S 0 W = λ W S_1^{-1}S_0W=\lambda W S11S0W=λW
即W是最优解时上式一定成立,从上式我们能逐步推导出
S 0 W = λ S 1 W S_0 W = \lambda S_1 W S0W=λS1W
W T S 0 W = λ W T S 1 W = λ = J W^TS_0W = \lambda W^TS_1W = \lambda = J WTS0W

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值