数据预处理

中心化

所有数据每个特征维度减去均值,使数据均值为0

标准化

使得数据均值为0后,还需要使用标准化的做法让数据的也在维度都有着相同的规模,有两种常用方法:

  • 除以标准差,使得新数据的分布更接近高斯分布
  • 让每个特征维度大的最大值和最小值按比例放到1~-1之间

主成分分析

相关背景

在许多领域的研究与应用中,通常需要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律。多变量大数据集无疑会为研究和应用提供丰富的信息,但是也在一定程度上增加了数据采集的工作量。更重要的是在很多情形下,许多变量之间可能存在相关性,从而增加了问题分析的复杂性。如果分别对每个指标进行分析,分析往往是孤立的,不能完全利用数据中的信息,因此盲目减少指标会损失很多有用的信息,从而产生错误的结论。

因此需要找到一种合理的方法,在减少需要分析的指标同时,尽量减少原指标包含信息的损失,以达到对所收集数据进行全面分析的目的。由于各变量之间存在一定的相关关系,因此可以考虑将关系紧密的变量变成尽可能少的新变量,使这些新变量是两两不相关的,那么就可以用较少的综合指标分别代表存在于各个变量中的各类信息。主成分分析与因子分析就属于这类降维算法。

原理

PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。

emm,说的真是难懂,其实是就是如何对数据降维同时有保留最多的信息。推荐一下以数学方式解释的的视频:

用最直观的方式告诉你:什么是主成分分析PCA_哔哩哔哩_bilibili

以及一个以图形方式解释的视频:

【中字】主成分分析法(PCA)| 分步步骤解析 看完你就懂了!_哔哩哔哩_bilibili

简单写一下上述视频所讲内容:

考虑二维情况,假设数据点有以下分布:

rtNDm.png

我们需要存储的信息为二维,即每个点的x,y坐标,有没有办法将其降为一维呢?肯定是有的,我们需要将坐标轴移动和旋转如下:

rtS3A.png

如此一来,我们需要存储的数据就只有新坐标系的原点,角度和新坐标点的x坐标,数据从二维降为了一维。那么如何实现坐标系的平移和旋转呢?寻找新的坐标系原点其实我们已经实现了,没错,就是上文所述的去中心化。那如何旋转?请看下文。

首先我们需要明确旋转到怎样一个角度我们认为好呢。上文说我们要实现降维的同时保留尽可能多的信息,何谓保留最多的信息呢?我的理解是,降维之前下隔得远的点降维后仍然隔得远,隔得近的点仍然隔得近,也就是数据之间的分布关系仍需要很好的保留。换句话说,数据之间的偏离程度要尽可能保留。诶,等等,数据之间的偏离程度?方差!!!!

Bingo!我们要找到的旋转角度需要使方差最大

从几何角度说,因为我们已经去中心化,我们需要找到角度使所有数据点在这条线上的投影点到原点的距离的平方和SSD最大。这条线被称为主成分1,或者说是旋转后的一条坐标轴,该SSD为主成分1的特征值,我们可以在之后证明,如此我们再找到另一条坐标轴主成分2与其SSD。那么我们降为时就可以选取SSD较小的维度删掉以实现降维。

问题是怎样找到这个角度呢?

先介绍一下数据的线性变换:

假设我们有数据集D:
$$
D=\begin{bmatrix}
x_1&x_2&x_3&x_4\\
y_1&y_2&y_3&y_4
\end{bmatrix}
$$
与一个对角矩阵S:
$$
S=\begin{bmatrix}
2&0\\
0&1
\end{bmatrix}
$$
那SD就等于:
$$
SD=\begin{bmatrix}
2x_1&2x_2&2x_3&2x_4\\
y_1&y_2&y_3&y_4
\end{bmatrix}
$$
相当于在x轴上对所有数据拉伸到了2倍。那这跟坐标轴旋转有什么关系呢?看图:

r58CT.png

根据“相对论”,坐标轴相对于数据做旋转,相当于所有数据对原坐标轴旋转,如上图所述,假设原坐标轴逆时针旋转$\theta$到红色坐标轴,那点$(x,y)$旋转到点$(x’,y’)$,那对于黑色坐标轴,$(x’,y’)$等于多少呢,稍微用一用初中数学知识我们得到:
$$
(x’,y’)=(x\cos\theta-y\sin\theta,x\sin\theta+y\cos\theta)
$$
转化成上述线性变换形式,坐标轴的旋转就相当于:
$$
RD=\begin{bmatrix}
\cos\theta&-\sin\theta\\
\sin\theta&\cos\theta
\end{bmatrix}
\begin{bmatrix}
x_1&x_2&x_3&x_4\\
y_1&y_2&y_3&y_4
\end{bmatrix}
$$
那我们为了让数据的方差更大,可以旋转时对其做一个拉伸,拉伸方向也是使方差最大方向,即:
$$
D’=RSD=\begin{bmatrix}
\cos\theta&-\sin\theta\\
\sin\theta&\cos\theta
\end{bmatrix}
\begin{bmatrix}
a&0\\
0&b
\end{bmatrix}
\begin{bmatrix}
x_1&x_2&x_3&x_4\\
y_1&y_2&y_3&y_4
\end{bmatrix}
$$


那假设有一个白数据W,其x与y都是服从标准正态分布且不相关,我们所有的数据集W’,其x,y都服从正态分布但非标准且相关,则W’可由W拉伸后旋转得来,即:
$$
W’=RSW
$$
反之:
$$
W=S^{-1}R^{-1}W’
$$
其中:
$$
S=\begin{bmatrix}
\frac{1}{a}&0\\
0&\frac{1}{b}
\end{bmatrix}
$$

$$
R=\begin{bmatrix}
\cos(-\theta)&-\sin(-\theta)\\
\sin(-\theta)&\cos(-\theta)
\end{bmatrix}
=\begin{bmatrix}
\cos\theta&\sin\theta\\
-\sin\theta&\cos\theta
\end{bmatrix}
=R^T
$$

问题又来了,R怎么求呢? 协方差矩阵的特征向量就是R
$$
协方差:cov(x,y)=\frac{\sum_{i=1}^n(x_i-\bar x)(y_i-\bar y)}{n-1}
$$
其代表:两个变量在变化过程中是同方向变化还是反方向变化?通向或反向程度如何?

那么对于我们已经 **去中心化 **的数据,其$\bar x=\bar y=0$,则协方差为:
$$
cov(x,y)=\frac{\sum_{i=1}^nx_iy_i}{n-1}
$$
那么协方差矩阵:
$$
\begin{aligned}
C&=\begin{bmatrix}
cov(x,x)&cov(x,y)\\
cov(x,y)&cov(y,y)
\end{bmatrix}\\
&=\begin{bmatrix}
\frac{\sum_{i=1}^nx_ix_i}{n-1}&\frac{\sum_{i=1}^nx_iy_i}{n-1}\\
\frac{\sum_{i=1}^nx_iy_i}{n-1}&\frac{\sum_{i=1}^ny_iy_i}{n-1}
\end{bmatrix}\\
&=\frac{1}{n-1}\begin{bmatrix}
\sum_{i=1}^nx_ix_i&\sum_{i=1}^nx_iy_i\\
\sum_{i=1}^nx_iy_i&\sum_{i=1}^ny_iy_i
\end{bmatrix}\\
&=\frac{1}{n-1}WW^T
\end{aligned}
$$
我们再求一下后的数据D’的协方差:
$$
\begin{aligned}
C’&=\frac{1}{n-1}W’W’^T\\
&=\frac{1}{n-1}RSW(RSW)^T\\
&=\frac{1}{n-1}RSWW^TS^TR^T\\
&=RS(\frac{1}{n-1}WW^T)S^TR^T\\
&=RSCS^TR^T
\end{aligned}
$$
W是白数据,其协方差矩阵$C=E$单位矩阵,则上式可以化简为:
$$
C’=RSESR^{-1}=RS^2R^{-1}=RLR^{-1}
$$
其中L为一个对角矩阵。

那么C’的特征值与特征向量定义为:
$$
C’\vec v=\lambda \vec v
$$
则:
$$
C’[\vec v_1,\vec v_2,…,\vec v_n]=[\vec v_1,\vec v_2,…,\vec v_n]\begin{bmatrix}\lambda_1&0&\cdots &0\\
0&\lambda_2&\cdots &0\\
\vdots&\vdots&\ddots &\vdots\\
0&0&\cdots &\lambda_n
\end{bmatrix}
$$

$$
C’=[\vec v_1,\vec v_2,…,\vec v_n]\begin{bmatrix}\lambda_1&0&\cdots &0\\
0&\lambda_2&\cdots &0\\
\vdots&\vdots&\ddots &\vdots\\
0&0&\cdots &\lambda_n
\end{bmatrix}
[\vec v_1,\vec v_2,…,\vec v_n]^{-1}
$$

这不就是:
$$
C’=RLR^{-1}
$$
对于上述二位情况:
$$
L=\begin{bmatrix}a^2&0\\0&b^2\end{bmatrix}
$$
如此一来,我们就能得到旋转回来的数据$R^{-1}W’$的协方差为:
$$
\begin{aligned}
C_{R^{-1}W’}&=\frac{1}{n-1}R^{-1}W’(R^{-1}W’)^T\\
&=\frac{1}{n-1}R^{-1}W’W’^T(R^{-1})^T\\
&=R^{-1}(\frac{1}{n-1}WW^T)(R^{-1})^T\\
&=R^{-1}C’(R^{-1})^T\\
&=R^{-1}RSS^TR^T(R^{-1})^T=SS^t=L
\end{aligned}
$$
则$a^2,b^2$既是两个轴方向的方差。同时又是协方差矩阵C’的特征值SSD。

那我们选择其中方差小的那个维度删掉,不就实现了降维???

总结一下PCA的步骤:

  • 去中心化

  • 计算数据协方差矩阵及其特征值特征向量,求$R^{-1}W’$

  • 降维:选择特征值较小的维度删除

    PCA的一个显著缺点是离群点会极大影响主成分的角度,造成算法效果不好

    python实现

import numpy as np
def pca(X,k):#k is the components you want
#mean of each feature
n_samples, n_features = X.shape
mean=np.array([np.mean(X[:,i]) for i in range(n_features)])

norm_X=X-mean #去中心化

scatter_matrix=np.dot(np.transpose(norm_X),norm_X)#协方差矩阵

eig_val, eig_vec = np.linalg.eig(scatter_matrix)#协方差矩阵的特征向量和特征值
eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(n_features)]

eig_pairs.sort(reverse=True)#由大到小排序

feature=np.array([ele[1] for ele in eig_pairs[:k]])#留下k个主要特征

data=np.dot(norm_X,np.transpose(feature))
return data

X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
print(pca(X,1))

rW3cZ.png

白噪声处理

在PCA处理后在除以其特征值得到最开始的白数据:
$$
W=S^{-1}R^{-1}W’
$$
白噪声处理会增强数据中的噪声,因为其增强了所有维度,包括一些方差很小的不相关维度

网络参数初始化

权重初始化

除了数据需要预处理之外,网络权重也需要初始化。

  • 全0初始化:看起来最简单但是 不可行,如果神经网络的每个权重都被初始化成相同的值,那么每个神经元就会就是计算出相同的结果,在反向传播时也会又相同的梯度,最后导致所有权重的都会有相同的更新,权重之间失去了对称性

  • 随机初始化:初始化为一些靠近0的随机数

  • 稀疏初始化:将权重全部初始化维0,然后道破对称性在立马随机挑选一些参数附上一些随机值

初始化偏置

一般初始化为全0

批标准化(Batch Normalization)