赞
踩
PCA(Principal Components Analysis)即主成分分析,是一种常用的数据分析手段,是图像处理中经常用到的降维方法。对于一组不同维度之间可能存在线性相关关系的数据,PCA能够把这组数据通过正交变换变成各个维度之间线性无关的数据,经过PCA处理的数据中的各个样本之间的关系往往更直观,所以它是一种非常常用的数据分析和预处理工具。PCA处理之后的数据各个维度之间是线性无关的,通过剔除方差较小的那些维度上的数据,我们可以达到数据降维的目的。
X、Y 是两个随机变量,X、Y 的协方差 cov(X, Y) 定义为:
其中:
矩阵中的数据按行排列与按列排列求出的协方差矩阵是不同的,这里默认数据是按行排列。即每一行是一个observation(or sample),那么每一列就是一个随机变量。
协方差矩阵:
协方差矩阵的维度等于随机变量的个数,即每一个 observation 的维度。在某些场合前边也会出现 1 / m,而不是 1 / (m - 1).
举个例子,矩阵 X 按行排列:
其中:
注意:
有时候在书上或者网上会看到这样的公式,协方差矩阵 Σ:
这里之所以会是 X * X' 是因为原始数据集 X 是按列排列的,即:
下面举一个简单的例子,说明PCA的过程。
假设我们的数据集有10个二维数据,
- (2.5,2.4), (0.5,0.7), (2.2,2.9),
- (1.9,2.2), (3.1,3.0), (2.3, 2.7),
- (2, 1.6), (1, 1.1), (1.5, 1.6), (1.1, 0.9)
需要用PCA降到1维特征。
首先我们对样本中心化,这里样本的均值为(1.81, 1.91),所有的样本减去这个均值向量后,即中心化后的数据集为
- (0.69, 0.49), (-1.31, -1.21), (0.39, 0.99),
- (0.09, 0.29), (1.29, 1.09), (0.49, 0.79),
- (0.19, -0.31), (-0.81, -0.81), (-0.31, -0.31),
- (-0.71, -1.01)
现在我们开始求样本的协方差矩阵,由于我们是二维的,则协方差矩阵为:
对于我们的数据,求出协方差矩阵为:
求出特征值为:
(0.0490833989, 1.28402771),
对应的特征向量分别为:
由于最大的 k=1 个特征值为1.28402771,
对应于的 k=1个特征向量为
则我们的W为
我们对所有的数据集进行投影 ,得到PCA降维后的10个一维数据集为:
- (-0.827970186, 1.77758033, -0.992197494,
- -0.274210416, -1.67580142, -0.912949103,
- 0.0991094375, 1.14457216, 0.438046137,
- 1.22382056)
到此已经完成了降维。
- # coding:utf-8
- import numpy as np
- from sklearn.datasets import load_iris
- from sklearn.decomposition import PCA
- import matplotlib.pyplot as plt
-
- def pca(data, n_components):
- '''
- pca is O(D^3)
- :param data: (n_samples, n_features(D))
- :param n_dim: target dimensions
- :return: (n_samples, n_components)
- '''
- # 减去均值,也可以进行标准化处理(除以方差)
- data = data - np.mean(data, axis = 0, keepdims = True)
- # 计算协方差矩阵
- cov_matrix = 1/len(data) * np.matmul(data.T, data)
- # 计算协方差矩阵特征值及对应的特征向量
- eig_values, eig_vector = np.linalg.eig(cov_matrix)
- # print(eig_values)
- # 对特征值进行排序,并取前n_components组
- indexs_ = np.argsort(-eig_values)[:n_components]
- picked_eig_values = eig_values[indexs_]
- picked_eig_vector = eig_vector[:, indexs_]
- data_ndim = np.matmul(data, picked_eig_vector)
- return data_ndim
-
- # data 降维的矩阵(n_samples, n_features)
- # n_dim 目标维度
- # fit n_features >> n_samples, reduce cal
-
- if __name__ == "__main__":
- data = load_iris()
- X = data.data
- Y = data.target
- data_2d1 = pca(X, 2)
- plt.figure(figsize=(8,4))
- plt.subplot(121)
- plt.title("my_PCA")
- plt.scatter(data_2d1[:, 0], data_2d1[:, 1], c = Y)
-
- sklearn_pca = PCA(n_components=2)
- data_2d2 = sklearn_pca.fit_transform(X)
- plt.subplot(122)
- plt.title("sklearn_PCA")
- plt.scatter(data_2d2[:, 0], data_2d2[:, 1], c = Y)
- plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。