PCA
PCA KPCA
代码详见:https://github.com/AresAnt/ML-DL
PCA:
PCA适用于非监督的学习的不带标签(带标签的样本,往往用LDA降维)的样本降维,特别是小样本问题。广义认为,这类样本属性之间的相关性很大,通过映射,将高维样本向量映射成属性不相关的样本向量。
在多元统计分析中,主成分分析(英语:Principal components analysis,PCA)是一种分析、简化数据集的技术。主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特征。这是通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面。但是,这也不是一定的,要视具体应用而定。由于主成分分析依赖所给数据,所以数据的准确性对分析结果影响很大。
Simple PCA:
暂且我将它定义为简单的PCA,直接通过求取最大的前N项特征值,来得到PCA的解(即W)
详细的简单的数学原理可以参照这个超级链接:此处输入链接的描述
算法描述过程如下:
输入:样本集 D = {x1,x2,x3,...,xn}
低维空间维数d'.
过程:
- 对所有样本进行中心化(归零化与标准化
- 计算样本的协方差矩阵 XXT
- 对协方差矩阵XXT做特征值分解
- 取最大的d'个特征值所对应的特征向量(w1,w2,....,wd')
输出: 矩阵W
中心化公式: ( μ 表示平均值 , σ 表示标准差 )
流程图:
Kernel PCA
我们知道在简单PCA运算相当于是一个坐标系统的直交变换,在新的坐标系系统下,变换数据点的方差沿新的坐标轴得到了最大化。然而我们可以得出这样子的变化是关于线性变化的。简单的说,PCA的降维模式只能用来表示线性的数据降维,遇上了非线性就难以做出变化。如下图所示:
【一般来说 X.shape = (n_samples,n_features) n_samples 表示样本数量, n_features 表示特征数量,在对 K 进行计算的时候,是用行向量进行相乘,简单来说就是每一个 sample 进行相乘】
for i in range(M):
for j in range(M):
if self.Kernel == 'Gaussian':
K[i,j] = self.__Gaussian_Kernel__(data[i,:],data[j,:],1.0)
# 高斯核函数 k(x,x') = exp(-||x - x'||² / C)
def __Gaussian_Kernel__(self,x,y,C):
return math.exp(-(np.linalg.norm((x - y), ord=2) ** 2) / C)
注:这里要注意,对于核函数来说,它是对样本点的计算,即我们知道 X.shape = (n_samples,n_features), 它是对样本点(即行向量)来进行计算。所以这一点我们会发现,这就是为什么核函数对非线性数据进行映射后的内容的意义无法进行文字说明的。(即不清楚它的意义)
- 计算完K之后需要对K进行修正
# 核矩阵的修正
ones = np.ones((M, M), dtype=float) / M
K = K - np.dot(ones,K) - np.dot(K,ones) + np.dot(np.dot(ones, K),ones)
-
接下来的操作与PCA基本上是相同的,求解特征向量与特征值再排序
-
其中计算出来的特征向量排序后即书上会看到的 α ,需要用施密特正交化方法将其单位化
-
然后根据(特征值与阈值的比例)来选取最好的前多少个特征向量,公式如下:
-
然后计算完后 Y = K*α (α 为我们选取出来的特征向量)
输出: 降维后的投影Y
KPCA存在三点不足:各特征的物理意义很不明确,一般的PCA仅是原有各特征的线性叠加,还可以勉强找出其含义,而KPCA是不可能明确其物理意义的;求投影所需的计算相对要难得多;测试样本在F空间向量kV上的投影太复杂。
网友评论