• #机器学习--实例--主成分分析


    #机器学习--实例--主成分分析

    引言

            本系列博客旨在为机器学习(深度学习)提供数学理论基础。因此内容更为精简,适合二次学习的读者快速学习或查阅。


    主成分分析(PCA)介绍

            主成分分析(principal components analysis,PCA)是一个简单的机器学习算法,能够在损失精度尽可能少的前提下,对数据进行有损压缩。


    推导过程

            设有 m m m 个点 { x i , … , x m } \{x_{i},\dots,x_{m}\} {xi,,xm},每一个点都是一个 n n n 维向量 ,我们希望找到一个编码函数,根据输入返回编码, c = f ( x ) c=f(x) c=f(x) ;同时也希望找到一个解码函数,给定编码重构输入, x ≈ g ( f ( x ) ) x\approx g(f(x)) xg(f(x))
            令 g ( c ) = D c g(c)=Dc g(c)=Dc ,其中 D ∈ R n ∗ l , ( l < n ) D\in R^{n*l},(lDRnl,(l<n) 是定义解码的矩阵,编码函数定义好后,我们先来寻找解码函数。
            为了使解码后的结果与实际值之间的差值最小,有 arg min ⁡ c ∣ ∣ g ( c ) − x ∣ ∣ 2 \argmin_{c}||g(c)-x||_{2} cargmin∣∣g(c)x2 ⇒ arg min ⁡ c ∣ ∣ D c − x ∣ ∣ 2 2 \Rightarrow\argmin_{c}||Dc-x||_{2}^{2} cargmin∣∣Dcx22 ⇒ arg min ⁡ c ( D c − x ) T ( D c − x ) \Rightarrow\argmin_{c}(Dc-x)^{T}(Dc-x) cargmin(Dcx)T(Dcx) ⇒ arg min ⁡ c   c T D T D c − 2 x T D c \Rightarrow\argmin_{c}\ c^{T}D^{T}Dc-2x^{T}Dc cargmin cTDTDc2xTDc 求导并令导数为 0 ,可得: D c = x 求导并令导数为0,可得:Dc=x 求导并令导数为0,可得:Dc=x        令 D T D = I D^{T}D=I DTD=I ,上式可转换为: c = f ( x ) = D T x c=f(x)=D^{T}x c=f(x)=DTx        解码函数找到了,接下来是找最好的D,使得压缩后的信息损失最小,即有: arg min ⁡ D ∑ i m ∣ ∣ x i − f ( g ( x i ) ) ∣ ∣ 2 , s . t . D T D = I \argmin_{D}\sum_{i}^{m}||x_{i}-f(g(x_{i}))||^{2},s.t.D^{T}D=I Dargminim∣∣xif(g(xi))2s.t.DTD=I ⇒ arg min ⁡ D ∑ i m ∣ ∣ x i − D D T x ∣ ∣ 2 , s . t . D T D = I \Rightarrow\argmin_{D}\sum_{i}^{m}||x_{i}-DD^{T}x||^{2},s.t.D^{T}D=I Dargminim∣∣xiDDTx2s.t.DTD=I ⇒ arg min ⁡ D ∣ ∣ X − D D T X ∣ ∣ F 2 , s . t . D T D = I \Rightarrow\argmin_{D}||X-DD^{T}X||^{2}_{F},s.t.D^{T}D=I Dargmin∣∣XDDTXF2s.t.DTD=I ⇒ arg min ⁡ D T r [ ( X − D D T X ) T ( X − D D T X ) ] , s . t . D T D = I \Rightarrow\argmin_{D}Tr[(X-DD^{T}X)^{T}(X-DD^{T}X)],s.t.D^{T}D=I DargminTr[(XDDTX)T(XDDTX)]s.t.DTD=I ⇒ arg max ⁡ D T r ( D D T X X T ) + λ ( D T D − I ) \Rightarrow\argmax_{D}Tr(DD^{T}XX^{T})+\lambda(D^{T}D-I) DargmaxTr(DDTXXT)+λ(DTDI) 求导并令导数为 0 ,可得: X X T D = λ D 求导并令导数为0,可得:XX^{T}D=\lambda D 求导并令导数为0,可得:XXTD=λD        最终我们可以得出结论,D就是由矩阵 X X T XX^{T} XXT l l l 个特征向量所构成。


    代码实现

    import numpy as np
    
    
    class PCAModel:
        def __init__(self):
            self.d = None
    
        def fit(self, x, target_l):
            """
            填充训练数据,进行主成分分析
            :param x: 训练数据矩阵,每一个列向量为一条训练数据
            :param target_l: 目标维度,应小于矩阵x中列向量的长度
            """
            if target_l >= x.shape[0]:
                raise ValueError("target_l should greater than x.shape[0]")
            features, f_vec = np.linalg.eig(np.matmul(x, x.T))
            self.d = f_vec[:, :target_l]
    
        def transform(self, x):
            """
            对数据x进行降维
            """
            return np.matmul(self.d.T, x)
    
        def reverse_transform(self, x):
            """
            对数据x进行还原
            """
            return np.matmul(self.d, x)
    
    
    train_x = np.array([[1,2],[3,4],[5,6]])
    print(train_x)
    # [[1 2]
    #  [3 4]
    #  [5 6]]
    model = PCAModel()
    model.fit(tran_x, 2)
    result = model.transform(train_x)
    print(result)
    # [[-5.90229186 -7.47652631]
    #  [ 0.40367167 -0.3186758 ]]
    pred_y = model.reverse_transform(result)
    print(pred_y)
    # [[1. 2.]
    #  [3. 4.]
    #  [5. 6.]]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

            从运行结果中可以看出,对数据进行压缩后能够完美进行还原。

  • 相关阅读:
    《天天数学》连载54:二月二十三日
    vue实现全局消息提醒功能(vue-extend)
    浅谈IOC编程思想
    网络爬虫的意义:连接信息世界的纽带
    go实现文件的读写
    HashMap 源码解析
    问题记录1 json解析问题
    JVM
    C++算法:二叉树的序列化与反序列化
    Java学习笔记——字符/字符串
  • 原文地址:https://blog.csdn.net/qq_43519779/article/details/126211178